]> git.ipfire.org Git - thirdparty/kernel/stable.git/commit - block/blk-mq-sched.c
block: free merged request in the caller
authorJens Axboe <axboe@fb.com>
Fri, 3 Feb 2017 16:48:28 +0000 (09:48 -0700)
committerJens Axboe <axboe@fb.com>
Fri, 3 Feb 2017 16:48:28 +0000 (09:48 -0700)
commite4d750c97794ea2bab793d4c518b1f4006364588
tree8b351d08b1d81986402964a243268e70bb31a6a9
parentb973cb7e89fe3dcc2bc72c5b3aa7a3bfd9d0e6d5
block: free merged request in the caller

If we end up doing a request-to-request merge when we have completed
a bio-to-request merge, we free the request from deep down in that
path. For blk-mq-sched, the merge path has to hold the appropriate
lock, but we don't need it for freeing the request. And in fact
holding the lock is problematic, since we are now calling the
mq sched put_rq_private() hook with the lock held. Other call paths
do not hold this lock.

Fix this inconsistency by ensuring that the caller frees a merged
request. Then we can do it outside of the lock, making it both more
efficient and fixing the blk-mq-sched problem of invoking parts of
the scheduler with an unknown lock state.

Reported-by: Paolo Valente <paolo.valente@linaro.org>
Signed-off-by: Jens Axboe <axboe@fb.com>
Reviewed-by: Omar Sandoval <osandov@fb.com>
block/blk-core.c
block/blk-merge.c
block/blk-mq-sched.c
block/blk-mq-sched.h
block/mq-deadline.c