Skip to content

Commit

Permalink
smp: Rename __smp_call_function_single() to smp_call_function_single_…
Browse files Browse the repository at this point in the history
…async()

The name __smp_call_function_single() doesn't tell much about the
properties of this function, especially when compared to
smp_call_function_single().

The comments above the implementation are also misleading. The main
point of this function is actually not to be able to embed the csd
in an object. This is actually a requirement that result from the
purpose of this function which is to raise an IPI asynchronously.

As such it can be called with interrupts disabled. And this feature
comes at the cost of the caller who then needs to serialize the
IPIs on this csd.

Lets rename the function and enhance the comments so that they reflect
these properties.

Suggested-by: Christoph Hellwig <[email protected]>
Cc: Andrew Morton <[email protected]>
Cc: Christoph Hellwig <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Jan Kara <[email protected]>
Cc: Jens Axboe <[email protected]>
Signed-off-by: Frederic Weisbecker <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
fweisbec authored and axboe committed Feb 24, 2014
1 parent fce8ad1 commit c46fff2
Show file tree
Hide file tree
Showing 8 changed files with 21 additions and 14 deletions.
2 changes: 1 addition & 1 deletion block/blk-mq.c
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,7 @@ void __blk_mq_complete_request(struct request *rq)
rq->csd.func = __blk_mq_complete_request_remote;
rq->csd.info = rq;
rq->csd.flags = 0;
__smp_call_function_single(ctx->cpu, &rq->csd);
smp_call_function_single_async(ctx->cpu, &rq->csd);
} else {
rq->q->softirq_done_fn(rq);
}
Expand Down
2 changes: 1 addition & 1 deletion block/blk-softirq.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ static int raise_blk_irq(int cpu, struct request *rq)
data->info = rq;
data->flags = 0;

__smp_call_function_single(cpu, data);
smp_call_function_single_async(cpu, data);
return 0;
}

Expand Down
2 changes: 1 addition & 1 deletion drivers/cpuidle/coupled.c
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,7 @@ static void cpuidle_coupled_poke(int cpu)
struct call_single_data *csd = &per_cpu(cpuidle_coupled_poke_cb, cpu);

if (!cpumask_test_and_set_cpu(cpu, &cpuidle_coupled_poke_pending))
__smp_call_function_single(cpu, csd);
smp_call_function_single_async(cpu, csd);
}

/**
Expand Down
2 changes: 1 addition & 1 deletion include/linux/smp.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ void on_each_cpu_cond(bool (*cond_func)(int cpu, void *info),
smp_call_func_t func, void *info, bool wait,
gfp_t gfp_flags);

int __smp_call_function_single(int cpu, struct call_single_data *csd);
int smp_call_function_single_async(int cpu, struct call_single_data *csd);

#ifdef CONFIG_SMP

Expand Down
2 changes: 1 addition & 1 deletion kernel/sched/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -432,7 +432,7 @@ void hrtick_start(struct rq *rq, u64 delay)
if (rq == this_rq()) {
__hrtick_restart(rq);
} else if (!rq->hrtick_csd_pending) {
__smp_call_function_single(cpu_of(rq), &rq->hrtick_csd);
smp_call_function_single_async(cpu_of(rq), &rq->hrtick_csd);
rq->hrtick_csd_pending = 1;
}
}
Expand Down
19 changes: 13 additions & 6 deletions kernel/smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -238,15 +238,22 @@ int smp_call_function_single(int cpu, smp_call_func_t func, void *info,
EXPORT_SYMBOL(smp_call_function_single);

/**
* __smp_call_function_single(): Run a function on a specific CPU
* smp_call_function_single_async(): Run an asynchronous function on a
* specific CPU.
* @cpu: The CPU to run on.
* @csd: Pre-allocated and setup data structure
*
* Like smp_call_function_single(), but allow caller to pass in a
* pre-allocated data structure. Useful for embedding @data inside
* other structures, for instance.
* Like smp_call_function_single(), but the call is asynchonous and
* can thus be done from contexts with disabled interrupts.
*
* The caller passes his own pre-allocated data structure
* (ie: embedded in an object) and is responsible for synchronizing it
* such that the IPIs performed on the @csd are strictly serialized.
*
* NOTE: Be careful, there is unfortunately no current debugging facility to
* validate the correctness of this serialization.
*/
int __smp_call_function_single(int cpu, struct call_single_data *csd)
int smp_call_function_single_async(int cpu, struct call_single_data *csd)
{
int err = 0;

Expand All @@ -256,7 +263,7 @@ int __smp_call_function_single(int cpu, struct call_single_data *csd)

return err;
}
EXPORT_SYMBOL_GPL(__smp_call_function_single);
EXPORT_SYMBOL_GPL(smp_call_function_single_async);

/*
* smp_call_function_any - Run a function on any of the given cpus
Expand Down
4 changes: 2 additions & 2 deletions kernel/up.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ int smp_call_function_single(int cpu, void (*func) (void *info), void *info,
}
EXPORT_SYMBOL(smp_call_function_single);

int __smp_call_function_single(int cpu, struct call_single_data *csd)
int smp_call_function_single_async(int cpu, struct call_single_data *csd)
{
unsigned long flags;

Expand All @@ -31,7 +31,7 @@ int __smp_call_function_single(int cpu, struct call_single_data *csd)
local_irq_restore(flags);
return 0;
}
EXPORT_SYMBOL(__smp_call_function_single);
EXPORT_SYMBOL(smp_call_function_single_async);

int on_each_cpu(smp_call_func_t func, void *info, int wait)
{
Expand Down
2 changes: 1 addition & 1 deletion net/core/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -4128,7 +4128,7 @@ static void net_rps_action_and_irq_enable(struct softnet_data *sd)
struct softnet_data *next = remsd->rps_ipi_next;

if (cpu_online(remsd->cpu))
__smp_call_function_single(remsd->cpu,
smp_call_function_single_async(remsd->cpu,
&remsd->csd);
remsd = next;
}
Expand Down

0 comments on commit c46fff2

Please sign in to comment.