On 07/14/2017 02:41 AM, Ming Lei wrote: > From: Ming Lei <minlei@xxxxxxxxxx> > > When blk_mq_get_request() failed, preempt counter isn't > released, and blk_mq_make_request() doesn't release the counter > too. > > This patch fixes the issue, and makes sure that preempt counter > is only held if rq is allocated successfully. The same policy is > applied on .q_usage_counter too. Can you replace the 'get_cpu' bool with just a ctx, and change the logic to put it if set? I think that would be cleaner to read, generally I hate bool 'do_something' variables that are set. It's much cleaner to have: if (likely(!data->ctx)) data->ctx = local_ctx = blk_mq_get_ctx(q); and have the put case be if (local_ctx) blk_mq_put_ctx(local_ctx); Either that, or at least just have blk_mq_get_request() do: drop_ctx = data->ctx == NULL; instead. The 'get_cpu' naming is confusing, we're worried about dropping the sw queue here, the fact that it's related to get/put_cpu() need not bubble up here. -- Jens Axboe