WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] Re: [PATCH 6/8] x86: use flush_tlb_others to implement flush

To: Jeremy Fitzhardinge <jeremy@xxxxxxxx>
Subject: [Xen-devel] Re: [PATCH 6/8] x86: use flush_tlb_others to implement flush_tlb_all
From: Ian Campbell <Ian.Campbell@xxxxxxxxxxxxx>
Date: Fri, 8 May 2009 16:52:07 +0100
Cc: Xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>, Ingo Molnar <mingo@xxxxxxx>, the arch/x86 maintainers <x86@xxxxxxxxxx>, Linux Kernel Mailing List <linux-kernel@xxxxxxxxxxxxxxx>, Jeremy Fitzhardinge <Jeremy.Fitzhardinge@xxxxxxxxxx>
Delivery-date: Mon, 11 May 2009 06:44:48 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <4A0454A2.7060104@xxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Organization: Citrix Systems, Inc.
References: <1241727902-3176-1-git-send-email-jeremy@xxxxxxxx> <1241727902-3176-7-git-send-email-jeremy@xxxxxxxx> <1241796269.15972.41.camel@xxxxxxxxxxxxxxxxxxxxxx> <4A0454A2.7060104@xxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
On Fri, 2009-05-08 at 11:49 -0400, Jeremy Fitzhardinge wrote:
> Ian Campbell wrote:
> > On Thu, 2009-05-07 at 13:25 -0700, Jeremy Fitzhardinge wrote:
> >   
> >> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@xxxxxxxxxx>
> >>
> >> Use the flush_tlb_others() call to implement flush_tlb_all().
> >>     
> >
> > This causes:
> >         BUG: spinlock bad magic on CPU#0, swapper/0
> >          lock: c05b7588, .magic: 00000000, .owner: <none>/-1, .owner_cpu: 0
> >         Pid: 0, comm: swapper Not tainted 
> > 2.6.30-rc3-x86_32p-xen0-tip-01797-g3db7847 #1054
> >         Call Trace:
> >          [<c023e656>] spin_bug+0x96/0xf0
> >          [<c023e90f>] _raw_spin_lock+0x6f/0x150
> >   
> 
> Ah, right.  I had another change (somewhere around here) to explicitly 
> initialize the tlb flush code from the normal early init code, rather 
> than make it implicit via initcall.  Otherwise we have an unknown point 
> at which we're allowed to start using global flushes, which is a bit flakey.

That was my v1, which I still happen to have lying around:

---

Subject: initialise tlbflush locks before any callers

Now that flush_tlb_all() is implemented via flush_tlb_others() the later
can be called before the core_initcalls are run. Explicitly call
init_smp_flush early on.

Also there is no need for init_smp_flush to be __cpuinit.

Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>

[ Impact: initialise spinlock before use ]

diff --git a/arch/x86/include/asm/tlbflush.h b/arch/x86/include/asm/tlbflush.h
index 16a5c84..2a4848d 100644
--- a/arch/x86/include/asm/tlbflush.h
+++ b/arch/x86/include/asm/tlbflush.h
@@ -129,6 +129,8 @@ static inline void reset_lazy_tlbstate(void)
 
 #define local_flush_tlb() __flush_tlb()
 
+extern int init_smp_flush(void);
+
 extern void flush_tlb_all(void);
 extern void flush_tlb_current_task(void);
 extern void flush_tlb_mm(struct mm_struct *);
diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c
index e69bdad..0f030fb 100644
--- a/arch/x86/mm/tlb.c
+++ b/arch/x86/mm/tlb.c
@@ -229,7 +229,7 @@ void native_flush_tlb_others(const struct cpumask *cpumask,
        flush_tlb_others_ipi(cpumask, mm, va);
 }
 
-static int __cpuinit init_smp_flush(void)
+int __init init_smp_flush(void)
 {
        int i;
 
@@ -238,7 +238,6 @@ static int __cpuinit init_smp_flush(void)
 
        return 0;
 }
-core_initcall(init_smp_flush);
 
 void flush_tlb_current_task(void)
 {
diff --git a/init/main.c b/init/main.c
index 33ce929..f798501 100644
--- a/init/main.c
+++ b/init/main.c
@@ -651,6 +651,7 @@ asmlinkage void __init start_kernel(void)
        vfs_caches_init_early();
        cpuset_init_early();
        page_cgroup_init();
+       init_smp_flush();
        mem_init();
        enable_debug_pagealloc();
        cpu_hotplug_init();

> 
>     J


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>