Skip to content

Commit

Permalink
[S390] Improve __smp_call_function_map.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Heiko Carstens authored and Martin Schwidefsky committed Jul 27, 2007
1 parent 3bb447f commit 8da1aec
Showing 1 changed file with 6 additions and 8 deletions.
14 changes: 6 additions & 8 deletions arch/s390/kernel/smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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();
}
}

/*
Expand Down

0 comments on commit 8da1aec

Please sign in to comment.