nvme: don't check nvme_req flags for new req
authorChaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Mon, 1 Mar 2021 02:06:08 +0000 (18:06 -0800)
committerChristoph Hellwig <hch@lst.de>
Thu, 18 Mar 2021 05:17:28 +0000 (06:17 +0100)
commit52cd1ae265dfcf2e52f245ee23e991a0bcb890f7
tree8b96eb71a038d0fc851de130fb5f7c7d3165fdbe
parentc684b02c3e74ceb13d6c8d14807284aed79eda89
nvme: don't check nvme_req flags for new req

nvme_clear_request() has a check for flag REQ_DONTPREP and it is called
from nvme_init_request() and nvme_setuo_cmd().

The function nvme_init_request() is called from nvme_alloc_request()
and nvme_alloc_request_qid(). From these two callers new request is
allocated everytime. For newly allocated request RQF_DONTPREP is never
set. Since after getting a tag, block layer sets the req->rq_flags == 0
and never sets the REQ_DONTPREP when returning the request :-

nvme_alloc_request()
blk_mq_alloc_request()
blk_mq_rq_ctx_init()
rq->rq_flags = 0 <----

nvme_alloc_request_qid()
blk_mq_alloc_request_hctx()
blk_mq_rq_ctx_init()
rq->rq_flags = 0 <----

The block layer does set req->rq_flags but REQ_DONTPREP is not one of
them and that is set by the driver.

That means we can unconditinally set the REQ_DONTPREP value to the
rq->rq_flags when nvme_init_request()->nvme_clear_request() is called
from above two callers.

Move the check for REQ_DONTPREP from nvme_clear_nvme_request() into
nvme_setup_cmd().

This is needed since nvme_alloc_request() now gets called from fast
path when NVMeOF target isĀ configured with passthru backend to avoid
unnecessary checks in the fast path.

Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/host/core.c