• Chaitanya Kulkarni's avatar
    nvme: don't check nvme_req flags for new req · c03fd85d
    Chaitanya Kulkarni authored
    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: default avatarChaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    c03fd85d
core.c 123 KB