Linux PCI subsystem development
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Nicolin Chen" <nicolinc@nvidia.com>
Cc: linux-pci@vger.kernel.org
Subject: Re: [PATCH v4 04/15] iommu/arm-smmu-v3: Drain in-flight fault events on domain detach
Date: Thu, 10 Sep 2026 23:31:54 +0000	[thread overview]
Message-ID: <20260910233154.9318A1F000FF@smtp.kernel.org> (raw)
In-Reply-To: <e98a3f1b8964c9f4785ec6dd6c001b7aba4f1cdd.1789081084.git.nicolinc@nvidia.com>

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] Missing final condition check after timeout evaluation in `arm_smmu_wait_for_queue_drained` causes false timeouts.
--

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

iommu/arm-smmu-v3: Drain in-flight fault events on domain detach

When a device leaves a domain, fault events for the old domain may remain
in the SMMU event queue or the IOPF workqueue. If the IOMMU core frees that
domain before those events are handled, the work may use freed memory.
This commit starts with the hardware queue by using
arm_smmu_wait_for_queue_drained() to poll the EVTQ when an IOPF-enabled
attachment ends.

> 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 b908a8af31442..ef1fddad7868e 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,89 @@ static int arm_smmu_cmdq_batch_submit(struct arm_smmu_device *smmu,
[ ... ]
> +static int arm_smmu_wait_for_queue_drained(struct arm_smmu_device *smmu,
> +					   struct arm_smmu_queue *q,
> +					   bool until_empty)
> +{
> +	ktime_t timeout = ktime_add_us(ktime_get(), ARM_SMMU_POLL_TIMEOUT_US);
> +	u32 cons, prod, pending;
> +	u32 drained = 0;
> +
> +	might_sleep();
> +
> +	cons = readl_relaxed(q->cons_reg);
> +	prod = readl_relaxed(q->prod_reg);
> +	/* The exit target: the number of entries in the queue at entry */
> +	pending = Q_DIFF(&q->llq, cons, prod);
> +
> +	while (true) {
> +		u32 prev, undrained;
> +
> +		/* Accumulate the entries consumed since the last poll */
> +		prev = cons;
> +		cons = readl_relaxed(q->cons_reg);
> +		drained += Q_DIFF(&q->llq, prev, cons);
> +
> +		prod = readl_relaxed(q->prod_reg);
> +		undrained = Q_DIFF(&q->llq, cons, prod);
> +
> +		/* 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_DIFF() will 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.
> +		 */
> +		if (ktime_compare(ktime_get(), timeout) > 0)
> +			break;

[Severity: Medium]
Could this result in a false timeout if the task is preempted or delayed just
before the timeout check?

If execution is interrupted for a duration exceeding the timeout *after*
reading the hardware registers and evaluating the exit conditions, but
*before* checking the timeout:

1. The hardware might successfully drain the queue while the task is
   preempted.
2. When the task resumes, ktime_compare() returns true, and the loop breaks.
3. The function returns -ETIMEDOUT unconditionally without re-evaluating the
   hardware state.

Standard kernel polling macros (like read_poll_timeout) typically perform a
final re-evaluation of the exit conditions upon timeout to handle such
scheduling delays.

A false timeout here would lead to skipping the teardown and leaking the
domain to prevent a Use-After-Free, as handled in a subsequent commit
("iommu/arm-smmu-v3: Flush in-flight fault work on domain detach").

> +
> +		/* The consumer might be a threaded IRQ handler. Yield to it */
> +		fsleep(100);
> +	}
> +
> +	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/cover.1789081084.git.nicolinc@nvidia.com?part=4

  reply	other threads:[~2026-09-10 23:31 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-10 23:16 [PATCH v4 00/15] iommu/arm-smmu-v3: Add PRI support Nicolin Chen
2026-09-10 23:16 ` [PATCH v4 01/15] iommu/arm-smmu-v3: Disable the impl before disabling the SMMU on shutdown Nicolin Chen
2026-09-10 23:32   ` sashiko-bot
2026-09-11  0:14   ` Jonathan Cameron
2026-09-11 23:17     ` Nicolin Chen
2026-09-10 23:16 ` [PATCH v4 02/15] iommu/arm-smmu-v3: Add arm_smmu_attach_release() Nicolin Chen
2026-09-10 23:28   ` sashiko-bot
2026-09-11  0:14   ` Jonathan Cameron
2026-09-10 23:16 ` [PATCH v4 03/15] iommu/arm-smmu-v3: Add Q_POS() macro Nicolin Chen
2026-09-10 23:21   ` sashiko-bot
2026-09-10 23:16 ` [PATCH v4 04/15] iommu/arm-smmu-v3: Drain in-flight fault events on domain detach Nicolin Chen
2026-09-10 23:31   ` sashiko-bot [this message]
2026-09-11  0:14   ` Jonathan Cameron
2026-09-10 23:16 ` [PATCH v4 05/15] iommu/arm-smmu-v3: Flush in-flight fault work " Nicolin Chen
2026-09-10 23:35   ` sashiko-bot
2026-09-11  0:14   ` Jonathan Cameron
2026-09-10 23:16 ` [PATCH v4 06/15] iommu/arm-smmu-v3: Allocate IOPF queue without FEAT_SVA Nicolin Chen
2026-09-10 23:28   ` sashiko-bot
2026-09-10 23:16 ` [PATCH v4 07/15] iommu/arm-smmu-v3: Submit CMDQ_OP_PRI_RESP for IOPF event Nicolin Chen
2026-09-10 23:36   ` sashiko-bot
2026-09-10 23:17 ` [PATCH v4 08/15] iommu/arm-smmu-v3: Disable the queue IRQs before disabling the SMMU Nicolin Chen
2026-09-10 23:28   ` sashiko-bot
2026-09-10 23:17 ` [PATCH v4 09/15] iommu/arm-smmu-v3: Disable PRI when no IRQ handler is registered Nicolin Chen
2026-09-10 23:36   ` sashiko-bot
2026-09-10 23:17 ` [PATCH v4 10/15] iommu/arm-smmu-v3: Support PRI Page Request in arm_smmu_handle_ppr() Nicolin Chen
2026-09-10 23:35   ` sashiko-bot
2026-09-11  0:14   ` Jonathan Cameron
2026-09-11 23:16     ` Nicolin Chen
2026-09-10 23:17 ` [PATCH v4 11/15] iommu/arm-smmu-v3: Discard partial PRI faults on PRIQ overflow Nicolin Chen
2026-09-10 23:33   ` sashiko-bot
2026-09-11  0:14   ` Jonathan Cameron
2026-09-10 23:17 ` [PATCH v4 12/15] iommu/arm-smmu-v3: Allocate IOPF queue for ARM_SMMU_FEAT_PRI Nicolin Chen
2026-09-10 23:31   ` sashiko-bot
2026-09-10 23:17 ` [PATCH v4 13/15] PCI/ATS: Add PRI stubs Nicolin Chen
2026-09-10 23:25   ` sashiko-bot
2026-09-10 23:17 ` [PATCH v4 14/15] PCI/ATS: Export pci_enable_pri() and pci_reset_pri() Nicolin Chen
2026-09-10 23:28   ` sashiko-bot
2026-09-10 23:17 ` [PATCH v4 15/15] iommu/arm-smmu-v3: Enable PRI for PCI device in arm_smmu_probe_device() Nicolin Chen
2026-09-10 23:36   ` sashiko-bot
2026-09-11  0:14   ` Jonathan Cameron

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=20260910233154.9318A1F000FF@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=nicolinc@nvidia.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