]> err.no Git - linux-2.6/commitdiff
[S390] Improve __smp_call_function_map.
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Fri, 27 Jul 2007 10:29:09 +0000 (12:29 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Fri, 27 Jul 2007 10:29:17 +0000 (12:29 +0200)
There is no need to disable bottom halves when holding call_lock. Also
this could imply that it is legal to call smp_call_function* from
bh context, which it is not.
Also test if func will be executed locally before disabling
and aterwards enabling interrupts again. It's not necessary to disable
and enable interrupts each time __smp_call_function_map gets called.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/kernel/smp.c

index aff9f853fc307b92a96216d15ba281039804d1b5..03674fbe598f3064932e4e14236ad9329076cc07 100644 (file)
@@ -120,7 +120,7 @@ static void __smp_call_function_map(void (*func) (void *info), void *info,
        if (wait)
                data.finished = CPU_MASK_NONE;
 
-       spin_lock_bh(&call_lock);
+       spin_lock(&call_lock);
        call_data = &data;
 
        for_each_cpu_mask(cpu, map)
@@ -129,18 +129,16 @@ static void __smp_call_function_map(void (*func) (void *info), void *info,
        /* Wait for response */
        while (!cpus_equal(map, data.started))
                cpu_relax();
-
        if (wait)
                while (!cpus_equal(map, data.finished))
                        cpu_relax();
-
-       spin_unlock_bh(&call_lock);
-
+       spin_unlock(&call_lock);
 out:
-       local_irq_disable();
-       if (local)
+       if (local) {
+               local_irq_disable();
                func(info);
-       local_irq_enable();
+               local_irq_enable();
+       }
 }
 
 /*