Skip to content

Commit

Permalink
[MIPS] Add smp_call_function_single()
Browse files Browse the repository at this point in the history
In the other archs, there is more factoring of smp call code, and more care
in the use of get_cpu(). That can be a follow-up MIPS patch.

Signed-off-by: Peter Watkins <pwatkins@sicortex.com>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
  • Loading branch information
Peter Watkins authored and Ralf Baechle committed Jul 31, 2007
1 parent 185bcd1 commit b4b2917
Showing 1 changed file with 55 additions and 0 deletions.
55 changes: 55 additions & 0 deletions arch/mips/kernel/smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,61 @@ void smp_call_function_interrupt(void)
}
}

int smp_call_function_single(int cpu, void (*func) (void *info), void *info,
int retry, int wait)
{
struct call_data_struct data;
int me;

/*
* Can die spectacularly if this CPU isn't yet marked online
*/
if (!cpu_online(cpu))
return 0;

me = get_cpu();
BUG_ON(!cpu_online(me));

if (cpu == me) {
local_irq_disable();
func(info);
local_irq_enable();
put_cpu();
return 0;
}

/* Can deadlock when called with interrupts disabled */
WARN_ON(irqs_disabled());

data.func = func;
data.info = info;
atomic_set(&data.started, 0);
data.wait = wait;
if (wait)
atomic_set(&data.finished, 0);

spin_lock(&smp_call_lock);
call_data = &data;
smp_mb();

/* Send a message to the other CPU */
core_send_ipi(cpu, SMP_CALL_FUNCTION);

/* Wait for response */
/* FIXME: lock-up detection, backtrace on lock-up */
while (atomic_read(&data.started) != 1)
barrier();

if (wait)
while (atomic_read(&data.finished) != 1)
barrier();
call_data = NULL;
spin_unlock(&smp_call_lock);

put_cpu();
return 0;
}

static void stop_this_cpu(void *dummy)
{
/*
Expand Down

0 comments on commit b4b2917

Please sign in to comment.