Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6d113398 authored by Jan Kara's avatar Jan Kara Committed by Jens Axboe
Browse files

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: default avatarJan 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: default avatarFrederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent d9a74df5
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -30,8 +30,8 @@ static void blk_done_softirq(struct softirq_action *h)
	while (!list_empty(&local_list)) {
		struct request *rq;

		rq = list_entry(local_list.next, struct request, csd.list);
		list_del_init(&rq->csd.list);
		rq = list_entry(local_list.next, struct request, queuelist);
		list_del_init(&rq->queuelist);
		rq->q->softirq_done_fn(rq);
	}
}
@@ -45,9 +45,14 @@ static void trigger_softirq(void *data)

	local_irq_save(flags);
	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);

	local_irq_restore(flags);
@@ -136,7 +141,7 @@ void __blk_complete_request(struct request *req)
		struct list_head *list;
do_local:
		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,
@@ -144,7 +149,7 @@ do_local:
		 * entries there, someone already raised the irq but it
		 * hasn't run yet.
		 */
		if (list->next == &req->csd.list)
		if (list->next == &req->queuelist)
			raise_softirq_irqoff(BLOCK_SOFTIRQ);
	} else if (raise_blk_irq(ccpu, req))
		goto do_local;