|
|
|
|
|
|
|
|
|
|
xen-devel
Re: [Xen-devel] Dmesg protocol for C2D E8400&ASUS P5K Premium (stack tra
Boris Derzhavets wrote:
[ 6.011212] ------------[ cut here ]------------
[ 6.011257] WARNING: at kernel/smp.c:329
smp_call_function_many+0x1e9/0x250()
[ 6.011303] Hardware name: P5K Premium
[ 6.011345] Modules linked in: usbhid(+) hid sd_mod crc_t10dif
sr_mod cdrom r8169 mii ohci1394 ieee1394 sg sky2 pata_acpi ata_generic
ehci_hcd uhci_hcd usbcore dm_mirror dm_region_hash dm_log dm_snapshot
dm_mod thermal processor fan fuse
[ 6.012219] Pid: 2303, comm: modprobe Not tainted 2.6.29-rc5-tip #1
[ 6.012263] Call Trace:
[ 6.012309] [<ffffffff8024c050>] warn_slowpath+0xd0/0x130
[ 6.012356] [<ffffffff8022d9ae>] ? pvclock_clocksource_read+0x4e/0x90
[ 6.012403] [<ffffffff8020eeed>] ? xen_force_evtchn_callback+0xd/0x10
[ 6.012450] [<ffffffff8020f732>] ? check_events+0x12/0x20
[ 6.012495] [<ffffffff8020f531>] ? xen_clocksource_read+0x21/0x30
[ 6.012542] [<ffffffff80210617>] ? xen_spin_lock+0xa7/0x110
[ 6.012587] [<ffffffff8020f71f>] ? xen_restore_fl_direct_end+0x0/0x1
[ 6.012634] [<ffffffff8052e373>] ? _spin_lock+0x13/0x30
[ 6.012681] [<ffffffff802a6690>] ?
perf_counter_task_sched_in+0x60/0x190
[ 6.012728] [<ffffffff8022d9ae>] ? pvclock_clocksource_read+0x4e/0x90
[ 6.012776] [<ffffffff8020bdf9>] ?
__raw_callee_save_xen_pmd_val+0x11/0x1e
[ 6.012823] [<ffffffff802360b0>] ? do_flush_tlb_all+0x0/0x50
[ 6.012869] [<ffffffff802742a9>] smp_call_function_many+0x1e9/0x250
[ 6.012915] [<ffffffff802360b0>] ? do_flush_tlb_all+0x0/0x50
[ 6.012961] [<ffffffff802360b0>] ? do_flush_tlb_all+0x0/0x50
[ 6.013007] [<ffffffff80274330>] smp_call_function+0x20/0x30
[ 6.013053] [<ffffffff80251fcf>] on_each_cpu+0x1f/0x50
[ 6.013098] [<ffffffff80235ea7>] flush_tlb_all+0x17/0x20
Could you try this patch:
Subject: [PATCH] x86: implement flush_tlb_all in terms of flush_tlb_others
Modify flush_tlb_others to take a NULL mm, meaning "flush user
and kernel tlbs", and implement flush_tlb_all in terms of that.
The principle motivation for this is to make sure it goes via
paravirt_ops, which allows for more efficient cross-cpu tlb
flushes than a plain IPI.
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@xxxxxxxxxx>
diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c
index 14c5af4..2d112f9 100644
--- a/arch/x86/mm/tlb.c
+++ b/arch/x86/mm/tlb.c
@@ -148,7 +148,13 @@ void smp_invalidate_interrupt(struct pt_regs *regs)
* BUG();
*/
- if (f->flush_mm == percpu_read(cpu_tlbstate.active_mm)) {
+ if (f->flush_mm == NULL) {
+ /* No mm - flush all kernel and user tlbs */
+ __flush_tlb_all();
+ if (percpu_read(cpu_tlbstate.state) == TLBSTATE_LAZY)
+ leave_mm(cpu);
+ } else if (f->flush_mm == percpu_read(cpu_tlbstate.active_mm)) {
+ /* Flushing a specific user mm */
if (percpu_read(cpu_tlbstate.state) == TLBSTATE_OK) {
if (f->flush_va == TLB_FLUSH_ALL)
local_flush_tlb();
@@ -281,16 +287,15 @@ void flush_tlb_page(struct vm_area_struct *vma, unsigned
long va)
preempt_enable();
}
-static void do_flush_tlb_all(void *info)
+void flush_tlb_all(void)
{
- unsigned long cpu = smp_processor_id();
+ preempt_disable();
+
+ flush_tlb_others(cpu_online_mask, NULL, TLB_FLUSH_ALL);
__flush_tlb_all();
if (percpu_read(cpu_tlbstate.state) == TLBSTATE_LAZY)
- leave_mm(cpu);
-}
+ leave_mm(smp_processor_id());
-void flush_tlb_all(void)
-{
- on_each_cpu(do_flush_tlb_all, NULL, 1);
+ preempt_enable();
}
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c
index 7cadab1..dc83b47 100644
--- a/arch/x86/xen/mmu.c
+++ b/arch/x86/xen/mmu.c
@@ -1350,7 +1350,6 @@ static void xen_flush_tlb_others(const struct cpumask
*cpus,
struct multicall_space mcs;
BUG_ON(cpumask_empty(cpus));
- BUG_ON(!mm);
mcs = xen_mc_entry(sizeof(*args));
args = mcs.args;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
|
|
|
|