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

Andrew Morton
2003-02-26T09:43:26Z

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)

_