public inbox for linux-ide@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v5 0/2] Prevent non-NCQ command starvation
@ 2026-01-04  8:22 Damien Le Moal
  2026-01-04  8:22 ` [PATCH v5 1/2] ata: libata-scsi: refactor ata_scsi_translate() Damien Le Moal
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Damien Le Moal @ 2026-01-04  8:22 UTC (permalink / raw)
  To: linux-ide, Niklas Cassel; +Cc: Igor Pylypiv, Xingui Yang, John Garry

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 v4:
 - Changed patch 1 refactoring to create the helper function
   ata_scsi_qc_issue() to handle both deferral and issuing of commands,
   instead of the formet ata_scsi_qc_defer(9 helper which was handling
   only command deferral. this simplifies patch 2 by avoiding needing
   modifications in ata_scsi_translate()

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 | 170 +++++++++++++++++++++++++++++++-------
 drivers/ata/libata.h      |   2 +
 include/linux/libata.h    |   3 +
 5 files changed, 155 insertions(+), 31 deletions(-)

-- 
2.52.0


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2026-01-14  3:16 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-04  8:22 [PATCH v5 0/2] Prevent non-NCQ command starvation Damien Le Moal
2026-01-04  8:22 ` [PATCH v5 1/2] ata: libata-scsi: refactor ata_scsi_translate() Damien Le Moal
2026-01-04 17:05   ` Niklas Cassel
2026-01-05 10:30   ` John Garry
2026-01-05 23:26   ` Igor Pylypiv
2026-01-04  8:22 ` [PATCH v5 2/2] ata: libata-scsi: avoid Non-NCQ command starvation Damien Le Moal
2026-01-04 17:16   ` Niklas Cassel
2026-01-05 10:51   ` John Garry
2026-01-06 21:03   ` Igor Pylypiv
2026-01-14  3:16   ` yangxingui
2026-01-04 21:49 ` [PATCH v5 0/2] Prevent non-NCQ " Martin K. Petersen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox