Commit 0a2efafb authored by Sebastian Andrzej Siewior's avatar Sebastian Andrzej Siewior Committed by Jens Axboe
Browse files

blk-mq: Always complete remote completions requests in softirq



Controllers with multiple queues have their IRQ-handelers pinned to a
CPU. The core shouldn't need to complete the request on a remote CPU.

Remove this case and always raise the softirq to complete the request.

Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDaniel Wagner <dwagner@suse.de>
Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 93e4f73a
Loading
Loading
Loading
Loading
+1 −13
Original line number Diff line number Diff line
@@ -628,19 +628,7 @@ static void __blk_mq_complete_request_remote(void *data)
{
	struct request *rq = data;

	/*
	 * For most of single queue controllers, there is only one irq vector
	 * for handling I/O completion, and the only irq's affinity is set
	 * to all possible CPUs.  On most of ARCHs, this affinity means the irq
	 * is handled on one specific CPU.
	 *
	 * So complete I/O requests in softirq context in case of single queue
	 * devices to avoid degrading I/O performance due to irqsoff latency.
	 */
	if (rq->q->nr_hw_queues == 1)
	blk_mq_trigger_softirq(rq);
	else
		rq->q->mq_ops->complete(rq);
}

static inline bool blk_mq_complete_need_ipi(struct request *rq)