Thread (7 messages) 7 messages, 3 authors, 2017-11-10

Re: [PATCH] blk-mq: only run the hardware queue if IO is pending

From: Jens Axboe <axboe@kernel.dk>
Date: 2017-11-10 17:31:29

On 11/10/2017 10:29 AM, Christoph Hellwig wrote:
On Fri, Nov 10, 2017 at 09:12:18AM -0700, Jens Axboe wrote:
quoted
Currently we are inconsistent in when we decide to run the queue. Using
blk_mq_run_hw_queues() we check if the hctx has pending IO before
running it, but we don't do that from the individual queue run function,
blk_mq_run_hw_queue(). This results in a lot of extra and pointless
queue runs, potentially, on flush requests and (much worse) on tag
starvation situations. This is observable just looking at the top
output, with lots of kworkers active. For the !async runs, it just adds
to the CPU overhead of blk-mq.

Move the has-pending check into the run function instead of having
callers do it.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
Do we even still need the blk_mq_hctx_has_pending helper at all?
We do, otherwise we end up running the queue for cases where we don't
need to. The caller doesn't always know if it's necessary. And even
if the caller can figure it out, it'd add complicated logic for some
of those cases (like flush). It's easier/cleaner and more efficient
to keep it.

-- 
Jens Axboe
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help