4 #include <linux/kernel.h>
5 #include <linux/module.h>
11 #include <linux/sched.h>
27 list_replace_init(cpu_list, &local_list);
30 while (!list_empty(&local_list)) {
34 list_del_init(&rq->csd.list);
35 rq->q->softirq_done_fn(rq);
39 #if defined(CONFIG_SMP) && defined(CONFIG_USE_GENERIC_SMP_HELPERS)
40 static void trigger_softirq(
void *
data)
50 if (list->
next == &rq->csd.list)
59 static int raise_blk_irq(
int cpu,
struct request *rq)
64 data->
func = trigger_softirq;
68 __smp_call_function_single(cpu, data, 0);
75 static int raise_blk_irq(
int cpu,
struct request *rq)
82 unsigned long action,
void *hcpu)
89 int cpu = (
unsigned long) hcpu;
92 list_splice_init(&
per_cpu(blk_cpu_done, cpu),
102 .notifier_call = blk_cpu_notify,
112 BUG_ON(!q->softirq_done_fn);
120 if (req->cpu != -1) {
122 if (!
test_bit(QUEUE_FLAG_SAME_FORCE, &q->queue_flags))
123 shared = cpus_share_cache(cpu, ccpu);
135 if (ccpu == cpu || shared) {
147 if (list->
next == &req->csd.list)
149 }
else if (raise_blk_irq(ccpu, req))
168 if (
unlikely(blk_should_fake_timeout(req->q)))
170 if (!blk_mark_rq_complete(req))
175 static __init int blk_softirq_init(
void)
180 INIT_LIST_HEAD(&
per_cpu(blk_cpu_done, i));