forked from Minki/linux
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>
This commit is contained in:
parent
d9a74df512
commit
6d113398dc
@ -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)
|
|||||||
|
|
||||||
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)
|
|||||||
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 @@ do_local:
|
|||||||
* 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;
|
||||||
|
Loading…
Reference in New Issue
Block a user