Re: [PATCH 1/2] virtio-blk: fix hw_queue stopped on arbitrary error
From: Ming Lei <tom.leiming@gmail.com>
Date: 2020-02-18 02:21:34
Also in:
linux-block, linux-s390, lkml
From: Ming Lei <tom.leiming@gmail.com>
Date: 2020-02-18 02:21:34
Also in:
linux-block, linux-s390, lkml
On Thu, Feb 13, 2020 at 8:38 PM Halil Pasic [off-list ref] wrote:
Since nobody else is going to restart our hw_queue for us, the blk_mq_start_stopped_hw_queues() is in virtblk_done() is not sufficient necessarily sufficient to ensure that the queue will get started again. In case of global resource outage (-ENOMEM because mapping failure, because of swiotlb full) our virtqueue may be empty and we can get stuck with a stopped hw_queue. Let us not stop the queue on arbitrary errors, but only on -EONSPC which indicates a full virtqueue, where the hw_queue is guaranteed to get started by virtblk_done() before when it makes sense to carry on submitting requests. Let us also remove a stale comment.
The generic solution may be to stop queue only when there is any in-flight request not completed. Checking -ENOMEM may not be enough, given -EIO can be returned from virtqueue_add() too in case of dma map failure. Thanks,