nvmet: don't use BLK_MQ_REQ_NOWAIT for passthru
authorChaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Tue, 20 Oct 2020 23:14:04 +0000 (16:14 -0700)
committerChristoph Hellwig <hch@lst.de>
Thu, 22 Oct 2020 13:28:02 +0000 (15:28 +0200)
commit150dfb6c834c9e0e92db7794530b09fd2b9f05c8
tree29a45c91bc37a770898cb81c61a45021be6319f1
parent5e063101ffacf7c14797f5185c58a967ca83c79f
nvmet: don't use BLK_MQ_REQ_NOWAIT for passthru

By default, we set the passthru request allocation flag such that it
returns the error in the following code path and we fail the I/O when
BLK_MQ_REQ_NOWAIT is used for request allocation :-

nvme_alloc_request()
 blk_mq_alloc_request()
  blk_mq_queue_enter()
   if (flag & BLK_MQ_REQ_NOWAIT)
        return -EBUSY; <-- return if busy.

On some controllers using BLK_MQ_REQ_NOWAIT ends up in I/O error where
the controller is perfectly healthy and not in a degraded state.

Block layer request allocation does allow us to wait instead of
immediately returning the error when we BLK_MQ_REQ_NOWAIT flag is not
used. This has shown to fix the I/O error problem reported under
heavy random write workload.

Remove the BLK_MQ_REQ_NOWAIT parameter for passthru request allocation
which resolves this issue.

Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Reviewed-by: Logan Gunthorpe <logang@deltatee.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/target/passthru.c