diff options
author | Jan Kara <jack@suse.cz> | 2014-02-24 10:39:54 -0500 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2014-02-24 17:46:42 -0500 |
commit | 6d113398dcf4dfcd9787a4ead738b186f7b7ff0f (patch) | |
tree | 6d49945269bf454cf1682890d1f10789f23ca26d /block/blk-softirq.c | |
parent | d9a74df512e44580a34bf6e70f5d08c126507354 (diff) |
block: Stop abusing rq->csd.list in blk-softirq
Abusing rq->csd.list for a list of requests to complete is rather ugly.
We use rq->queuelist instead which is much cleaner. It is safe because
queuelist is used by the block layer only for requests waiting to be
submitted to a device. Thus it is unused when irq reports the request IO
is finished.
Signed-off-by: Jan Kara <jack@suse.cz>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jens Axboe <axboe@fb.com>
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'block/blk-softirq.c')
-rw-r--r-- | block/blk-softirq.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/block/blk-softirq.c b/block/blk-softirq.c index 57790c1a97eb..b5c37d96cf0e 100644 --- a/block/blk-softirq.c +++ b/block/blk-softirq.c | |||
@@ -30,8 +30,8 @@ static void blk_done_softirq(struct softirq_action *h) | |||
30 | while (!list_empty(&local_list)) { | 30 | while (!list_empty(&local_list)) { |
31 | struct request *rq; | 31 | struct request *rq; |
32 | 32 | ||
33 | rq = list_entry(local_list.next, struct request, csd.list); | 33 | rq = list_entry(local_list.next, struct request, queuelist); |
34 | list_del_init(&rq->csd.list); | 34 | list_del_init(&rq->queuelist); |
35 | rq->q->softirq_done_fn(rq); | 35 | rq->q->softirq_done_fn(rq); |
36 | } | 36 | } |
37 | } | 37 | } |
@@ -45,9 +45,14 @@ static void trigger_softirq(void *data) | |||
45 | 45 | ||
46 | local_irq_save(flags); | 46 | local_irq_save(flags); |
47 | list = this_cpu_ptr(&blk_cpu_done); | 47 | list = this_cpu_ptr(&blk_cpu_done); |
48 | list_add_tail(&rq->csd.list, list); | 48 | /* |
49 | * We reuse queuelist for a list of requests to process. Since the | ||
50 | * queuelist is used by the block layer only for requests waiting to be | ||
51 | * submitted to the device it is unused now. | ||
52 | */ | ||
53 | list_add_tail(&rq->queuelist, list); | ||
49 | 54 | ||
50 | if (list->next == &rq->csd.list) | 55 | if (list->next == &rq->queuelist) |
51 | raise_softirq_irqoff(BLOCK_SOFTIRQ); | 56 | raise_softirq_irqoff(BLOCK_SOFTIRQ); |
52 | 57 | ||
53 | local_irq_restore(flags); | 58 | local_irq_restore(flags); |
@@ -136,7 +141,7 @@ void __blk_complete_request(struct request *req) | |||
136 | struct list_head *list; | 141 | struct list_head *list; |
137 | do_local: | 142 | do_local: |
138 | list = this_cpu_ptr(&blk_cpu_done); | 143 | list = this_cpu_ptr(&blk_cpu_done); |
139 | list_add_tail(&req->csd.list, list); | 144 | list_add_tail(&req->queuelist, list); |
140 | 145 | ||
141 | /* | 146 | /* |
142 | * if the list only contains our just added request, | 147 | * if the list only contains our just added request, |
@@ -144,7 +149,7 @@ do_local: | |||
144 | * entries there, someone already raised the irq but it | 149 | * entries there, someone already raised the irq but it |
145 | * hasn't run yet. | 150 | * hasn't run yet. |
146 | */ | 151 | */ |
147 | if (list->next == &req->csd.list) | 152 | if (list->next == &req->queuelist) |
148 | raise_softirq_irqoff(BLOCK_SOFTIRQ); | 153 | raise_softirq_irqoff(BLOCK_SOFTIRQ); |
149 | } else if (raise_blk_irq(ccpu, req)) | 154 | } else if (raise_blk_irq(ccpu, req)) |
150 | goto do_local; | 155 | goto do_local; |