From: "Yang, Sheng" <sheng.yang@intel.com>
To: Keir Fraser <keir.fraser@eu.citrix.com>
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [PATCH] Only include online cpus in cpu_mask_to_apicid_flat
Date: Tue, 31 Aug 2010 15:19:01 +0800 [thread overview]
Message-ID: <201008311519.02067.sheng.yang@intel.com> (raw)
[-- Attachment #1: Type: Text/Plain, Size: 2177 bytes --]
The former fix of __bind_irq_vector() can ensure the destination field in IOAPIC
redirection table is valid by limiting the cpu_mask to the online cpus. But there
is another issue that some interrupts(timer and serial) would like to be
delivered to all online cpus with LPR delivery mode. But at the time of
bind_irq_vector() called, there were only one cpu(BSP) was online, so the
interrupts would always be delivered to BSP. This method can work but not the best
one.
In fact, setup_ioapic_dest() would be called to reprogram the IOAPIC redirection
table to follow "irq_cfg->cpu_mask", after SMP initialization work was
done. So I think the better choice is to keep the original value in irq_cfg-
>cpu_mask, and just make sure the value we wrote to the IOAPIC redirection table
is valid. Then modifying cpu_mask_to_apicid_flat() seems like a better idea.
This patch would revert the fix of __bind_irq_vector(), and modify
cpu_mask_to_apicid_flat() to contain only online CPUs.
--
regards
Yang, Sheng
diff --git a/xen/arch/x86/genapic/delivery.c b/xen/arch/x86/genapic/delivery.c
--- a/xen/arch/x86/genapic/delivery.c
+++ b/xen/arch/x86/genapic/delivery.c
@@ -36,9 +36,10 @@
return cpu_online_map;
}
+/* Cover only online cpus */
unsigned int cpu_mask_to_apicid_flat(cpumask_t cpumask)
{
- return cpus_addr(cpumask)[0]&0xFF;
+ return cpus_addr(cpumask)[0] & cpus_addr(cpu_online_map)[0] & 0xFF;
}
/*
diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c
--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -86,14 +86,14 @@
cpus_and(online_mask, cpu_mask, cpu_online_map);
if (cpus_empty(online_mask))
return -EINVAL;
- if ((cfg->vector == vector) && cpus_equal(cfg->cpu_mask, online_mask))
+ if ((cfg->vector == vector) && cpus_equal(cfg->cpu_mask, cpu_mask))
return 0;
if (cfg->vector != IRQ_VECTOR_UNASSIGNED)
return -EBUSY;
for_each_cpu_mask(cpu, online_mask)
per_cpu(vector_irq, cpu)[vector] = irq;
cfg->vector = vector;
- cfg->cpu_mask = online_mask;
+ cfg->cpu_mask = cpu_mask;
irq_status[irq] = IRQ_USED;
if (IO_APIC_IRQ(irq))
irq_vector[irq] = vector;
[-- Attachment #2: dest_fix.patch --]
[-- Type: text/x-patch, Size: 1164 bytes --]
diff --git a/xen/arch/x86/genapic/delivery.c b/xen/arch/x86/genapic/delivery.c
--- a/xen/arch/x86/genapic/delivery.c
+++ b/xen/arch/x86/genapic/delivery.c
@@ -36,9 +36,10 @@
return cpu_online_map;
}
+/* Cover only online cpus */
unsigned int cpu_mask_to_apicid_flat(cpumask_t cpumask)
{
- return cpus_addr(cpumask)[0]&0xFF;
+ return cpus_addr(cpumask)[0] & cpus_addr(cpu_online_map)[0] & 0xFF;
}
/*
diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c
--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -86,14 +86,14 @@
cpus_and(online_mask, cpu_mask, cpu_online_map);
if (cpus_empty(online_mask))
return -EINVAL;
- if ((cfg->vector == vector) && cpus_equal(cfg->cpu_mask, online_mask))
+ if ((cfg->vector == vector) && cpus_equal(cfg->cpu_mask, cpu_mask))
return 0;
if (cfg->vector != IRQ_VECTOR_UNASSIGNED)
return -EBUSY;
for_each_cpu_mask(cpu, online_mask)
per_cpu(vector_irq, cpu)[vector] = irq;
cfg->vector = vector;
- cfg->cpu_mask = online_mask;
+ cfg->cpu_mask = cpu_mask;
irq_status[irq] = IRQ_USED;
if (IO_APIC_IRQ(irq))
irq_vector[irq] = vector;
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
next reply other threads:[~2010-08-31 7:19 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-08-31 7:19 Yang, Sheng [this message]
2010-08-31 8:55 ` [PATCH] Only include online cpus in cpu_mask_to_apicid_flat Jan Beulich
2010-08-31 10:46 ` Keir Fraser
2010-09-01 3:39 ` Yang, Sheng
2010-09-01 9:14 ` Jan Beulich
2010-09-01 10:02 ` Yang, Sheng
2010-09-06 5:56 ` Yang, Sheng
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=201008311519.02067.sheng.yang@intel.com \
--to=sheng.yang@intel.com \
--cc=keir.fraser@eu.citrix.com \
--cc=xen-devel@lists.xensource.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.