[PATCH v2 0/2] scsi: ufs: core: Fix unsafe MMIO reads and redundant CQ sweeps in MCQ reset

From: Stanley Jhu

Date: Fri Sep 18 2026 - 11:14:14 EST


During Multi-Circular Queue (MCQ) error recovery and host reset,
ufshcd_mcq_compl_pending_transfer() sweeps or polls completion queues to
reap pending transfers. Two bugs exist in this path:

1. Unsafe MMIO read and spurious errors while HCE = 0 (Patch 1/2):
ufshcd_host_reset_and_restore() stops the controller (HCE = 0) before
calling ufshcd_mcq_compl_all_cqes_lock(). Calling
ufshcd_mcq_update_cq_tail_slot() at the end of the sweep reads CQTPy
over MMIO while HCE = 0, directly contradicting the function's own
documented contract that reading host controller registers is unsafe
when the controller is disabled. In addition, passing expected empty
slots during a full-ring sweep into ufshcd_mcq_process_cqe() prints
spurious "Abnormal CQ entry!" errors.

2. Redundant per-request CQ sweeps and polls (Patch 2/2):
ufshcd_mcq_compl_pending_transfer() runs hardware queue completion
sweeps (force_compl == true) or CQTPy polls (force_compl == false)
inside blk_mq_tagset_busy_iter() callbacks, repeating whole-queue
operations once per busy request instead of once per hardware queue.

Patch 1/2 synchronizes hwq->cq_tail_slot = hwq->cq_head_slot in software
and extracts ufshcd_mcq_compl_cqe() so full-ring sweeps skip empty slots
silently. Patch 2/2 sweeps or polls each hardware queue once before
iterating residual requests and removes ufshcd_mcq_compl_one().

Changes since v1:
- Split into a two-patch series separating ring sweep safety from
per-request tagset iteration.
- Extract ufshcd_mcq_compl_cqe() to skip empty slots without double CQE
checks (dropped Peter Wang's v1 Reviewed-by due to this change).
- Decouple hardware queue polling/sweeping for both force_compl paths
and remove ufshcd_mcq_compl_one().

Tested: Verified MCQ host reset, I/O completion, and queue pointer
integrity on QEMU ARM64 without MMIO aborts or spurious error logs.

Link: https://lore.kernel.org/r/CAE14pdek6ynze+muDZrK+yNX-3ioe3vprxOA4W22qokg352tJQ@xxxxxxxxxxxxxx

Stanley Jhu (2):
scsi: ufs: core: Avoid unsafe MMIO reads in
ufshcd_mcq_compl_all_cqes_lock()
scsi: ufs: core: Decouple CQ sweep from request iterator in MCQ

drivers/ufs/core/ufs-mcq.c | 35 +++++++++++++++++++++++------------
drivers/ufs/core/ufshcd.c | 31 ++++++++++++-------------------
2 files changed, 35 insertions(+), 31 deletions(-)

--
2.55.0.1082.g2b9226bbc0-goog