Re: [PATCH][2.5] fix preempt-issues with smp_call_function()

From: Andrew Morton (akpm@digeo.com)
Date: Wed Feb 26 2003 - 04:54:09 EST


Dave Jones <davej@codemonkey.org.uk> wrote:
>
> On Tue, Feb 25, 2003 at 07:08:48PM +0100, Thomas Schlichter wrote:
>
> > here is a patch to solve all (I hope I missed none) possible problems that
> > could occur on SMP machines running a preemptible kernel when
> > smp_call_function() calls a function which should be also executed on the
> > current processor.
> >
> > This patch is based on the one Dave Jones sent to the LKML last friday and
> > applies to the linux kernel version 2.5.63.
>
> Just one comment. You moved quite a few of the preempt_disable/enable
> pairs outside of the CONFIG_SMP checks. The issue we're working against
> here is to try and prevent preemption and ending up on a different CPU.
> As this cannot happen if CONFIG_SMP=n, I don't see why you've done this.
>

Just in two places.

 arch/i386/kernel/ldt.c | 6 ++++--
 arch/x86_64/kernel/ldt.c | 6 ++++--
 2 files changed, 8 insertions(+), 4 deletions(-)

diff -puN arch/i386/kernel/ldt.c~on_each_cpu-ldt-cleanup arch/i386/kernel/ldt.c
--- 25/arch/i386/kernel/ldt.c~on_each_cpu-ldt-cleanup 2003-02-26 01:51:27.000000000 -0800
+++ 25-akpm/arch/i386/kernel/ldt.c 2003-02-26 01:52:21.000000000 -0800
@@ -55,13 +55,15 @@ static int alloc_ldt(mm_context_t *pc, i
         wmb();
 
         if (reload) {
+#ifdef CONFIG_SMP
                 preempt_disable();
                 load_LDT(pc);
-#ifdef CONFIG_SMP
                 if (current->mm->cpu_vm_mask != (1 << smp_processor_id()))
                         smp_call_function(flush_ldt, 0, 1, 1);
-#endif
                 preempt_enable();
+#else
+ load_LDT(pc);
+#endif
         }
         if (oldsize) {
                 if (oldsize*LDT_ENTRY_SIZE > PAGE_SIZE)
diff -puN arch/x86_64/kernel/ldt.c~on_each_cpu-ldt-cleanup arch/x86_64/kernel/ldt.c
--- 25/arch/x86_64/kernel/ldt.c~on_each_cpu-ldt-cleanup 2003-02-26 01:51:36.000000000 -0800
+++ 25-akpm/arch/x86_64/kernel/ldt.c 2003-02-26 01:52:37.000000000 -0800
@@ -60,13 +60,15 @@ static int alloc_ldt(mm_context_t *pc, i
         pc->size = mincount;
         wmb();
         if (reload) {
+#ifdef CONFIG_SMP
                 preempt_disable();
                 load_LDT(pc);
-#ifdef CONFIG_SMP
                 if (current->mm->cpu_vm_mask != (1<<smp_processor_id()))
                         smp_call_function(flush_ldt, 0, 1, 1);
-#endif
                 preempt_enable();
+#else
+ load_LDT(pc);
+#endif
         }
         if (oldsize) {
                 if (oldsize*LDT_ENTRY_SIZE > PAGE_SIZE)

_

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Fri Feb 28 2003 - 22:00:35 EST