Linux PCI subsystem development
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Pranjal Shrivastava" <praan@google.com>
Cc: linux-pci@vger.kernel.org
Subject: Re: [PATCH v11 03/16] iommu/arm-smmu-v3: Add arm_smmu_drain_queue() helper
Date: Tue, 29 Sep 2026 04:11:54 +0000	[thread overview]
Message-ID: <20260929041155.0C1A91F000FF@smtp.kernel.org> (raw)
In-Reply-To: <20260929034510.2023173-4-praan@google.com>

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] iommu: missing final condition check in arm_smmu_drain_queue() polling loop
--

commit d3de0e0ff6c17b4b4b52184a4e8af1a09c29b369
Author: Nicolin Chen <nicolinc@nvidia.com>

iommu/arm-smmu-v3: Add arm_smmu_drain_queue() helper

This commit adds a sleepable, counting-based arm_smmu_drain_queue() helper
to replace queue specific polling loops. Its until_empty mode serves suspend
and runtime PM routines that drain the CMDQ.

> diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
> index 06b7de2e6e4b6..84b56849f6dc4 100644
> --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
> +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c

[ ... ]

> @@ -948,6 +948,87 @@ static int arm_smmu_cmdq_batch_submit(struct arm_smmu_device *smmu,

[ ... ]

> +	while (true) {
> +		/* Accumulate the entries consumed since the last poll */
> +		prev = cons;
> +		cons = readl_relaxed(q->cons_reg);
> +		drained += Q_POS(&q->llq, cons - prev);
> +
> +		prod = readl_relaxed(q->prod_reg);
> +		undrained = Q_POS(&q->llq, prod - cons);
> +
> +		/* Exit on an empty queue, regardless of until_empty */
> +		if (!undrained)
> +			return 0;
> +
> +		/* Snapshot mode: exit once the pending entries are drained */
> +		if (!until_empty && drained >= pending)
> +			return 0;
> +
> +		/*
> +		 * A timeout means the consumer might be stuck. In theory, if it
> +		 * moves 2 * qsize entries or more within a single poll interval
> +		 * Q_POS() would wrap and undercount drained: that could trigger
> +		 * a spurious warning too, if the queue was never once observed
> +		 * empty. Yet, that much consumption in such a short interval is
> +		 * unrealistic. WARN it only, as a stuck consumer is a real bug.
> +		 */
> +		if (WARN_ON(ktime_compare(ktime_get(), timeout) > 0))
> +			break;

[Severity: Medium]
Is there a missing final condition re-evaluation after the timeout check in
arm_smmu_drain_queue()?

If the thread executing this loop is preempted for more than the timeout
duration immediately before the ktime_get() check:

arm_smmu_drain_queue()
    if (!undrained)
        return 0;
    
    [ ... thread preempted by hypervisor for >1 second ... ]
    
    if (WARN_ON(ktime_compare(ktime_get(), timeout) > 0))
        break;
        
Could this sequence result in a spurious timeout?

Even if the queue was fully drained while the thread was scheduled out,
when the thread resumes it will immediately evaluate the timeout as
exceeded without checking the queue state one last time.

This would trigger a WARN_ON stack trace and return -ETIMEDOUT, which could
then cause caller operations like PM suspend to fail.

> +
> +		/* The consumer might be a threaded IRQ handler. Yield to it */
> +		usleep_range(100, 200);
> +	}
> +
> +	dev_warn_ratelimited(smmu->dev,
> +			     "queue drain timed out at prod=0x%x cons=0x%x\n",
> +			     prod, cons);
> +	return -ETIMEDOUT;
> +}

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260929034510.2023173-1-praan@google.com?part=3

  reply	other threads:[~2026-09-29  4:11 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-29  3:44 [PATCH v11 00/16] iommu/arm-smmu-v3: Implement Runtime/System Sleep ops Pranjal Shrivastava
2026-09-29  3:44 ` [PATCH v11 01/16] iommu/arm-smmu-v3: Refactor arm_smmu_setup_irqs Pranjal Shrivastava
2026-09-29  3:59   ` sashiko-bot
2026-10-07 14:06   ` Will Deacon
2026-09-29  3:44 ` [PATCH v11 02/16] iommu/arm-smmu-v3: Add Q_POS() macro Pranjal Shrivastava
2026-09-29  4:01   ` sashiko-bot
2026-09-29  3:44 ` [PATCH v11 03/16] iommu/arm-smmu-v3: Add arm_smmu_drain_queue() helper Pranjal Shrivastava
2026-09-29  4:11   ` sashiko-bot [this message]
2026-09-30 18:24   ` Nicolin Chen
2026-09-30 20:17     ` Pranjal Shrivastava
2026-09-29  3:44 ` [PATCH v11 04/16] iommu/tegra241-cmdqv: Add a helper to drain VCMDQs Pranjal Shrivastava
2026-09-29  4:24   ` sashiko-bot
2026-09-29  3:44 ` [PATCH v11 05/16] iommu/arm-smmu-v3: Add a helper to drain cmd queues Pranjal Shrivastava
2026-09-29  4:31   ` sashiko-bot
2026-09-29  3:45 ` [PATCH v11 06/16] iommu/tegra241-cmdqv: Restore PROD and CONS after resume Pranjal Shrivastava
2026-09-29  4:42   ` sashiko-bot
2026-09-29  3:45 ` [PATCH v11 07/16] genirq/msi: Cache MSI message in irq_chip_write_msi_msg() Pranjal Shrivastava
2026-09-29  5:07   ` sashiko-bot
2026-09-29  3:45 ` [PATCH v11 08/16] genirq/msi: Provide msi_device_domain_restore_msi_msgs() Pranjal Shrivastava
2026-09-29  5:22   ` sashiko-bot
2026-09-29  3:45 ` [PATCH v11 09/16] iommu/arm-smmu-v3: Restore MSI config on resume Pranjal Shrivastava
2026-09-29  5:31   ` sashiko-bot
2026-10-07 14:07   ` Will Deacon
2026-09-29  3:45 ` [PATCH v11 10/16] iommu/arm-smmu-v3: Factor out arm_smmu_handle_gerror() Pranjal Shrivastava
2026-09-29  5:37   ` sashiko-bot
2026-09-30 18:34   ` Nicolin Chen
2026-09-30 20:00     ` Pranjal Shrivastava
2026-09-30 20:12       ` Nicolin Chen
2026-09-30 20:03     ` Pranjal Shrivastava
2026-10-07 14:07   ` Will Deacon
2026-09-29  3:45 ` [PATCH v11 11/16] iommu/arm-smmu-v3: Add CMDQ_PROD_STOP_FLAG to gate CMDQ submissions Pranjal Shrivastava
2026-09-29  5:55   ` sashiko-bot
2026-09-30 20:33   ` Nicolin Chen
2026-10-01  5:40     ` Pranjal Shrivastava
2026-10-01 18:03       ` Nicolin Chen
2026-10-02 16:47         ` Jason Gunthorpe
2026-10-02 21:11           ` Pranjal Shrivastava
2026-10-06 17:26             ` Nicolin Chen
2026-10-07 14:08   ` Will Deacon
2026-09-29  3:45 ` [PATCH v11 12/16] iommu/tegra241-cmdqv: Add a helper to quiesce VCMDQs Pranjal Shrivastava
2026-09-29  6:05   ` sashiko-bot
2026-09-30 19:02   ` Nicolin Chen
2026-09-30 19:57     ` Pranjal Shrivastava
2026-09-30 20:03       ` Nicolin Chen
2026-09-29  3:45 ` [PATCH v11 13/16] iommu/arm-smmu-v3: Implement pm_runtime & system sleep ops Pranjal Shrivastava
2026-09-29  6:17   ` sashiko-bot
2026-10-01 20:22   ` Nicolin Chen
2026-10-07 14:08   ` Will Deacon
2026-09-29  3:45 ` [PATCH v11 14/16] iommu/arm-smmu-v3: Enable pm_runtime and setup devlinks Pranjal Shrivastava
2026-09-29  6:32   ` sashiko-bot
2026-09-29  3:45 ` [PATCH v11 15/16] iommu/arm-smmu-v3: Invoke pm_runtime before hw access Pranjal Shrivastava
2026-09-29  6:41   ` sashiko-bot
2026-09-29  3:45 ` [PATCH v11 16/16] iommu/arm-smmu-v3: Add KUnit unit tests for Runtime PM Pranjal Shrivastava
2026-09-29  6:48   ` sashiko-bot
2026-10-01 19:12   ` Nicolin Chen

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=20260929041155.0C1A91F000FF@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=praan@google.com \
    --cc=sashiko-reviews@lists.linux.dev \
    /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