From: "Yinghai Lu" <yinghai.lu@amd.com>
To: "Andi Kleen" <ak@muc.de>, "Eric W. Biederman" <ebiederm@xmission.com>
Cc: "Muli Ben-Yehuda" <muli@il.ibm.com>,
"Linux Kernel Mailing List" <linux-kernel@vger.kernel.org>,
"Andrew Morton" <akpm@osdl.org>, "Adrian Bunk" <bunk@stusta.de>
Subject: [PATCH] x86_64 irq: reuse vector for set_xxx_irq_affinity in phys flat mode
Date: Mon, 23 Oct 2006 00:02:44 -0700 [thread overview]
Message-ID: <86802c440610230002x340e3f95pa8ee98caa02e7e@mail.gmail.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 585 bytes --]
in phys flat mode, when using set_xxx_irq_affinity to irq balance from
one cpu to another, _assign_irq_vector will get to increase last used
vector and get new vector. this will use up the vector if enough
set_xxx_irq_affintiy are called. and end with using same vector in
different cpu for different irq. (that is not what we want, we only
want to use same vector in different cpu for different irq when more
than 0x240 irq needed). To keep it simple, the vector should be resued
from one cpu to another instead of getting new vector.
Signed-off-by: Yinghai Lu <yinghai.lu@amd.com>
[-- Attachment #2: io_apic_c_reuse_vector.diff --]
[-- Type: text/x-patch, Size: 1191 bytes --]
diff --git a/arch/x86_64/kernel/io_apic.c b/arch/x86_64/kernel/io_apic.c
index b000017..3989fa5 100644
--- a/arch/x86_64/kernel/io_apic.c
+++ b/arch/x86_64/kernel/io_apic.c
@@ -624,11 +624,32 @@ static int __assign_irq_vector(int irq,
if (irq_vector[irq] > 0)
old_vector = irq_vector[irq];
if (old_vector > 0) {
+ cpumask_t domain, new_mask, old_mask;
+ int new_cpu, old_cpu;
cpus_and(*result, irq_domain[irq], mask);
if (!cpus_empty(*result))
return old_vector;
+
+ /* try to reuse vector for phys flat */
+ domain = vector_allocation_domain(cpu);
+ cpus_and(new_mask, domain, cpu_online_map);
+ for_each_cpu_mask(new_cpu, new_mask)
+ if (per_cpu(vector_irq, new_cpu)[old_vector] != -1)
+ goto new_vector;
+ /* We can reuse it */
+ cpus_and(old_mask, irq_domain[irq], cpu_online_map);
+ for_each_cpu_mask(old_cpu, old_mask);
+ per_cpu(vector_irq, old_cpu)[old_vector] = -1;
+ for_each_cpu_mask(new_cpu, new_mask)
+ per_cpu(vector_irq, new_cpu)[old_vector] = irq;
+ irq_domain[irq] = domain;
+ cpus_and(*result, domain, mask);
+ return old_vector;
+
}
+new_vector:
+
for_each_cpu_mask(cpu, mask) {
cpumask_t domain;
int first, new_cpu;
next reply other threads:[~2006-10-23 7:02 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-10-23 7:02 Yinghai Lu [this message]
2006-10-23 8:15 ` Muli Ben-Yehuda
2006-10-23 15:53 ` yhlu
2006-10-23 15:32 ` Eric W. Biederman
2006-10-23 20:45 ` Adrian Bunk
2006-10-23 21:29 ` Muli Ben-Yehuda
2006-10-23 17:34 ` Muli Ben-Yehuda
2006-10-23 20:00 Lu, Yinghai
2006-10-24 5:52 ` Oleg Verych
2006-10-24 6:03 ` yhlu
2006-10-23 21:07 Lu, Yinghai
2006-10-23 22:57 Lu, Yinghai
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=86802c440610230002x340e3f95pa8ee98caa02e7e@mail.gmail.com \
--to=yinghai.lu@amd.com \
--cc=ak@muc.de \
--cc=akpm@osdl.org \
--cc=bunk@stusta.de \
--cc=ebiederm@xmission.com \
--cc=linux-kernel@vger.kernel.org \
--cc=muli@il.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®