rq->csd.func = __blk_mq_complete_request_remote;
rq->csd.info = rq;
rq->csd.flags = 0;
- __smp_call_function_single(ctx->cpu, &rq->csd, 0);
+ __smp_call_function_single(ctx->cpu, &rq->csd);
} else {
rq->q->softirq_done_fn(rq);
}
data->info = rq;
data->flags = 0;
- __smp_call_function_single(cpu, data, 0);
+ __smp_call_function_single(cpu, data);
return 0;
}
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, 0);
+ __smp_call_function_single(cpu, csd);
}
/**
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 wait);
+int __smp_call_function_single(int cpu, struct call_single_data *csd);
#ifdef CONFIG_SMP
if (rq == this_rq()) {
__hrtick_restart(rq);
} else if (!rq->hrtick_csd_pending) {
- __smp_call_function_single(cpu_of(rq), &rq->hrtick_csd, 0);
+ __smp_call_function_single(cpu_of(rq), &rq->hrtick_csd);
rq->hrtick_csd_pending = 1;
}
}
* __smp_call_function_single(): Run a function on a specific CPU
* @cpu: The CPU to run on.
* @csd: Pre-allocated and setup data structure
- * @wait: If true, wait until function has completed on specified CPU.
*
* 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.
*/
-int __smp_call_function_single(int cpu, struct call_single_data *csd, int wait)
+int __smp_call_function_single(int cpu, struct call_single_data *csd)
{
int err = 0;
- int this_cpu;
- this_cpu = get_cpu();
- /*
- * Can deadlock when called with interrupts disabled.
- * We allow cpu's that are not yet online though, as no one else can
- * send smp call function interrupt to this cpu and as such deadlocks
- * can't happen.
- */
- WARN_ON_ONCE(cpu_online(this_cpu) && wait && irqs_disabled()
- && !oops_in_progress);
-
- err = generic_exec_single(cpu, csd, csd->func, csd->info, wait);
- put_cpu();
+ preempt_disable();
+ err = generic_exec_single(cpu, csd, csd->func, csd->info, 0);
+ preempt_enable();
return err;
}
}
EXPORT_SYMBOL(smp_call_function_single);
-int __smp_call_function_single(int cpu, struct call_single_data *csd,
- int wait)
+int __smp_call_function_single(int cpu, struct call_single_data *csd)
{
unsigned long flags;
if (cpu_online(remsd->cpu))
__smp_call_function_single(remsd->cpu,
- &remsd->csd, 0);
+ &remsd->csd);
remsd = next;
}
} else