Message ID | 1502743211-14992-1-git-send-email-keith.busch@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, Aug 14, 2017 at 04:40:11PM -0400, Keith Busch wrote: > blk_mq_get_request() does not release the callers queue usage counter > when allocation fails. The caller still needs to account for its own > queue usage when it is unable to allocate a request. > > Fixes: 1ad43c0078b7 ("blk-mq: don't leak preempt counter/q_usage_counter when allocating rq failed") > > Reported-by: Max Gurtovoy <maxg@mellanox.com> > Signed-off-by: Keith Busch <keith.busch@intel.com> Reviewed-by: Ming Lei <ming.lei@redhat.com>
Looks good,
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
On 8/14/2017 11:40 PM, Keith Busch wrote: > blk_mq_get_request() does not release the callers queue usage counter > when allocation fails. The caller still needs to account for its own > queue usage when it is unable to allocate a request. > > Fixes: 1ad43c0078b7 ("blk-mq: don't leak preempt counter/q_usage_counter when allocating rq failed") > > Reported-by: Max Gurtovoy <maxg@mellanox.com> > Signed-off-by: Keith Busch <keith.busch@intel.com> > --- tested with 4.13-rc5+ using the following commands in a loop: 1. modprobe nvme 2. sleep 10 3. modprobe -r nvme Looks good, Tested-by: Max Gurtovoy <maxg@mellanox.com>
On 08/14/2017 02:40 PM, Keith Busch wrote: > blk_mq_get_request() does not release the callers queue usage counter > when allocation fails. The caller still needs to account for its own > queue usage when it is unable to allocate a request. Thanks Keith, applied.
diff --git a/block/blk-mq.c b/block/blk-mq.c index 535cbdf..4603b11 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -360,12 +360,12 @@ struct request *blk_mq_alloc_request(struct request_queue *q, unsigned int op, return ERR_PTR(ret); rq = blk_mq_get_request(q, NULL, op, &alloc_data); + blk_queue_exit(q); if (!rq) return ERR_PTR(-EWOULDBLOCK); blk_mq_put_ctx(alloc_data.ctx); - blk_queue_exit(q); rq->__data_len = 0; rq->__sector = (sector_t) -1; @@ -411,12 +411,11 @@ struct request *blk_mq_alloc_request_hctx(struct request_queue *q, alloc_data.ctx = __blk_mq_get_ctx(q, cpu); rq = blk_mq_get_request(q, NULL, op, &alloc_data); + blk_queue_exit(q); if (!rq) return ERR_PTR(-EWOULDBLOCK); - blk_queue_exit(q); - return rq; } EXPORT_SYMBOL_GPL(blk_mq_alloc_request_hctx);
blk_mq_get_request() does not release the callers queue usage counter when allocation fails. The caller still needs to account for its own queue usage when it is unable to allocate a request. Fixes: 1ad43c0078b7 ("blk-mq: don't leak preempt counter/q_usage_counter when allocating rq failed") Reported-by: Max Gurtovoy <maxg@mellanox.com> Signed-off-by: Keith Busch <keith.busch@intel.com> --- block/blk-mq.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)