提交 6d113398 编写于 作者: J Jan Kara 提交者: Jens Axboe

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: NJan 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: NFrederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: NJens Axboe <axboe@fb.com>
上级 d9a74df5
...@@ -30,8 +30,8 @@ static void blk_done_softirq(struct softirq_action *h) ...@@ -30,8 +30,8 @@ static void blk_done_softirq(struct softirq_action *h)
while (!list_empty(&local_list)) { while (!list_empty(&local_list)) {
struct request *rq; struct request *rq;
rq = list_entry(local_list.next, struct request, csd.list); rq = list_entry(local_list.next, struct request, queuelist);
list_del_init(&rq->csd.list); list_del_init(&rq->queuelist);
rq->q->softirq_done_fn(rq); rq->q->softirq_done_fn(rq);
} }
} }
...@@ -45,9 +45,14 @@ static void trigger_softirq(void *data) ...@@ -45,9 +45,14 @@ static void trigger_softirq(void *data)
local_irq_save(flags); local_irq_save(flags);
list = this_cpu_ptr(&blk_cpu_done); list = this_cpu_ptr(&blk_cpu_done);
list_add_tail(&rq->csd.list, list); /*
* We reuse queuelist for a list of requests to process. Since the
* queuelist is used by the block layer only for requests waiting to be
* submitted to the device it is unused now.
*/
list_add_tail(&rq->queuelist, list);
if (list->next == &rq->csd.list) if (list->next == &rq->queuelist)
raise_softirq_irqoff(BLOCK_SOFTIRQ); raise_softirq_irqoff(BLOCK_SOFTIRQ);
local_irq_restore(flags); local_irq_restore(flags);
...@@ -136,7 +141,7 @@ void __blk_complete_request(struct request *req) ...@@ -136,7 +141,7 @@ void __blk_complete_request(struct request *req)
struct list_head *list; struct list_head *list;
do_local: do_local:
list = this_cpu_ptr(&blk_cpu_done); list = this_cpu_ptr(&blk_cpu_done);
list_add_tail(&req->csd.list, list); list_add_tail(&req->queuelist, list);
/* /*
* if the list only contains our just added request, * if the list only contains our just added request,
...@@ -144,7 +149,7 @@ void __blk_complete_request(struct request *req) ...@@ -144,7 +149,7 @@ void __blk_complete_request(struct request *req)
* entries there, someone already raised the irq but it * entries there, someone already raised the irq but it
* hasn't run yet. * hasn't run yet.
*/ */
if (list->next == &req->csd.list) if (list->next == &req->queuelist)
raise_softirq_irqoff(BLOCK_SOFTIRQ); raise_softirq_irqoff(BLOCK_SOFTIRQ);
} else if (raise_blk_irq(ccpu, req)) } else if (raise_blk_irq(ccpu, req))
goto do_local; goto do_local;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册