From: Damien Le Moal <dlemoal@kernel.org>
To: linux-ide@vger.kernel.org, Niklas Cassel <cassel@kernel.org>
Cc: Igor Pylypiv <ipylypiv@google.com>,
Xingui Yang <yangxingui@huawei.com>,
John Garry <john.g.garry@oracle.com>
Subject: [PATCH v4 0/2] Prevent non-NCQ command starvation
Date: Fri, 2 Jan 2026 10:35:31 +0900 [thread overview]
Message-ID: <20260102013533.1131768-1-dlemoal@kernel.org> (raw)
This small patch series addresses potential command starvation issues
with non-NCQ commands issued to a device accessed through a multi-queue
libsas HBA. In such setup, a non-NCQ command issued to a device may
suffer long delays and even complete starvation if the device is under
a constant workload of NCQ commands issued from multiple queues.
This issue is avoided by limiting requeing request through the block
layer and instead explicitly waiting for the device command queue to
drain before issuing the non-NCQ command. This is done reliably by not
trying to second guess ata EH in case of error or device reset, by
always requeuing a deferred command whenever EH is scheduled for the
device port.
When a non-ncq command is deferred waiting for the device queue to
drain, all new incoming commands are always requeued through the regular
busy mechanism, thus avoiding the need to manage an internal command
queue.
With this, the long latencies observed when executing non-NCQ commands
under a heavy workload of NCQ commands at high queue depth is resolved:
the non-NCQ command latency only depends on how long it takes for all
in-flight NCQ commands to complete.
Changes from v3:
- Added review and test tags
- Improved patch 2 commit message
- Added a comment in ata_scsi_translate() to clarify the handling of
ata_scsi_defer() return value.
Changes from v2:
- Improved comment about ata_scsi_qc_new() behavior in patch 1
(suggested by Garry).
- Removed some lockdep annotations from patch 2 as they have little
value.
- In patch 2, change ata_scsi_requeue_deferred_qc() and
ata_scsi_schedule_deferred_qc() to return early as suggested by
Garry.
- Fixed comments typo in patch 2.
Changes from v1:
- Fixed ac leak in ata_scsi_defer() in patch 2.
- Added Hannes review tag
Damien Le Moal (2):
ata: libata-scsi: refactor ata_scsi_translate()
ata: libata-scsi: avoid Non-NCQ command starvation
drivers/ata/libata-core.c | 5 ++
drivers/ata/libata-eh.c | 6 ++
drivers/ata/libata-scsi.c | 163 ++++++++++++++++++++++++++++++++------
drivers/ata/libata.h | 2 +
include/linux/libata.h | 3 +
5 files changed, 154 insertions(+), 25 deletions(-)
--
2.52.0
next reply other threads:[~2026-01-02 1:40 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-02 1:35 Damien Le Moal [this message]
2026-01-02 1:35 ` [PATCH v4 1/2] ata: libata-scsi: refactor ata_scsi_translate() Damien Le Moal
2026-01-02 1:35 ` [PATCH v4 2/2] ata: libata-scsi: avoid Non-NCQ command starvation Damien Le Moal
2026-01-02 9:48 ` Niklas Cassel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260102013533.1131768-1-dlemoal@kernel.org \
--to=dlemoal@kernel.org \
--cc=cassel@kernel.org \
--cc=ipylypiv@google.com \
--cc=john.g.garry@oracle.com \
--cc=linux-ide@vger.kernel.org \
--cc=yangxingui@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox