summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Fitzhardinge <jeremy@goop.org>2009-02-03 16:01:46 -0800
committerH. Peter Anvin <hpa@zytor.com>2009-02-03 17:22:40 -0800
commit06fc732c33a7ff5e4c91bcf4a6ca86b5e335ad9a (patch)
treeeb6a202f5bc01a5c8ac9f7245b9097f18ac44e57
parentb1792e367053968f2ddb48bc911d314143ce6242 (diff)
downloadlwn-06fc732c33a7ff5e4c91bcf4a6ca86b5e335ad9a.tar.gz
lwn-06fc732c33a7ff5e4c91bcf4a6ca86b5e335ad9a.zip
xen: disable interrupts before saving in percpu
Impact: Fix race condition xen_mc_batch has a small preempt race where it takes the address of a percpu variable immediately before disabling interrupts, thereby leaving a small window in which we may migrate to another cpu and save the flags in the wrong percpu variable. Disable interrupts before saving the old flags in a percpu. Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Signed-off-by: H. Peter Anvin <hpa@zytor.com>
-rw-r--r--arch/x86/xen/multicalls.h4
1 files changed, 3 insertions, 1 deletions
diff --git a/arch/x86/xen/multicalls.h b/arch/x86/xen/multicalls.h
index 858938241616..fa3e10725d98 100644
--- a/arch/x86/xen/multicalls.h
+++ b/arch/x86/xen/multicalls.h
@@ -19,8 +19,10 @@ DECLARE_PER_CPU(unsigned long, xen_mc_irq_flags);
paired with xen_mc_issue() */
static inline void xen_mc_batch(void)
{
+ unsigned long flags;
/* need to disable interrupts until this entry is complete */
- local_irq_save(__get_cpu_var(xen_mc_irq_flags));
+ local_irq_save(flags);
+ __get_cpu_var(xen_mc_irq_flags) = flags;
}
static inline struct multicall_space xen_mc_entry(size_t args)