All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nicolin Chen <nicolinc@nvidia.com>
To: Jason Gunthorpe <jgg@nvidia.com>
Cc: <will@kernel.org>, <robin.murphy@arm.com>,
	Jonathan Cameron <jonathan.cameron@oss.qualcomm.com>,
	<joro@8bytes.org>, <bhelgaas@google.com>, <praan@google.com>,
	<kevin.tian@intel.com>, <kees@kernel.org>, <smostafa@google.com>,
	<baolu.lu@linux.intel.com>,
	Jean-Philippe Brucker <jpb@kernel.org>,
	Eric Auger <eric.auger@redhat.com>,
	<linux-arm-kernel@lists.infradead.org>, <iommu@lists.linux.dev>,
	<linux-kernel@vger.kernel.org>, <linux-pci@vger.kernel.org>,
	<skaestle@nvidia.com>, <mmarrid@nvidia.com>,
	<skolothumtho@nvidia.com>, <bbiber@nvidia.com>,
	<harsha.v@oss.qualcomm.com>
Subject: Re: [PATCH v5 04/15] iommu/arm-smmu-v3: Drain in-flight fault events on domain detach
Date: Wed, 23 Sep 2026 15:33:06 -0700	[thread overview]
Message-ID: <arRTojIlWBOF57zO@nvidia.com> (raw)
In-Reply-To: <179018862538.3334538.17643821143626392419.b4-review@b4>

On Wed, Sep 23, 2026 at 03:37:05PM -0300, Jason Gunthorpe wrote:
> > [ ... 73 lines skipped ... ]
> > +static int arm_smmu_wait_for_queue_drained(struct arm_smmu_device *smmu,
> > +					   struct arm_smmu_queue *q,
> > +					   bool until_empty)
> > +{
> 
> Nothing uses until_empty = false ?

This series (PRIQ/EVTQ) use until_empty=false.

> Is that for the power management series? How does it make sense?
> Shouldn't we already know the queue is not seeing new entries in that
> case?

The RPM series (CMDQ) uses until_empty=true, as it knows that there
are no new entries.

> > +	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;
> > +		bool expired;
> > +
> > +		/*
> > +		 * Sample the deadline ahead of the queue state it judges, but
> > +		 * break only after the exit conditions below, so a queue that
> > +		 * drained during a long preemption still exits with a success.
> > +		 */
> > +		expired = ktime_compare(ktime_get(), timeout) > 0;
> > +
> > +		/* 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);
> 
> I'm not sure how this all can work, the queue is running on its own
> with some other CPU handling interrupts.
> 
> You can't do this sort of Q_DIFF math unless you've somehow guaranteed
> one side of the queue is stable for this logic. If both pointers are
> moving forward then the points pointers can progress and wrap without
> this noticing that happened. That will lock up.

One side of the queue (pointers) is actually stable. EVTQ/PRIQ uses
the snapshot mode (until_empty=false):

 * With @until_empty == false (for EVTQ/PRIQ), exit once "drained" reaches its
 * target: "pending" (i.e. prod0 - cons0, frozen at the entry time):
 *
 *   cons0                cons                 prod0         (prod)
 *     |<---- drained ---->|                     |             |
 *  ---+###################+=====================+=============+--->
 *     |<--------------- pending --------------->|


"cons0", "prod0", and "pending" are frozen/stable at the start; the
function only needs to track a moving "cons".


Arguably the other model for CMDQ (until_empty=true) does have two
moving pointers in theory:

 * With @until_empty == true (for CMDQ), exit once the queue is observed empty:
 *
 *   cons0                cons                                prod
 *     |                   |                                   |
 *  ---+###################+===================================+--->
 *                         |<--------- undrained==0? --------->|

But in its practical use case (RPM), as you pointed out, there would
not be new entries. IOW, its "prod" is fixed/stable; only "cons" is
moving.

> Can you just replace this whole function with:
> 
> static void arm_smmu_irq_thread_fence(struct arm_smmu_device *smmu,
> 				      unsigned int irq)
> {
> 	if (!irq)
> 		return;
> 	irq_wake_thread(irq, smmu);
> 	synchronize_irq(irq);
> }
> 
> ?
> 
> This forces the thread to run and waits for it to finish. Since the
> thread fully drains the queue at the moment it starts, that should be
> sufficient?

Ah, that seems legit to me. The point is to make sure no pending IRQ
on the HW queues, so everything is drained. And this likely suffices.

Yea, I will try that one!

> But I wonder if the point of this has been lost? Prior to calling the
> driver attach functions the core code already changes the xarray:
> 
> 	curr = xa_cmpxchg(&group->pasid_array, pasid, NULL,
> 			  XA_ZERO_ENTRY, GFP_KERNEL);
> 
> That immediately makes the threaded IRQ safe since it calls
> iommu_attach_handle_get() which now fails.

I am not sure about that. Looking at iommufd_hwpt_replace_device(),
there can be a old_handle != NULL, in which case the cmpxchg() would
not change the xarray?

> So all that is needed is to synchronize_irq() to make sure the irq
> thread sees the xa update
> 
> Then to flush the workqueue that iommu_report_device_fault() pushes
> into.
> 
> We don't need to do anything with the HW queue.

FWIW, the idea of HW drain came from intel_iommu_drain_pasid_prq()..

Nicolin

  reply	other threads:[~2026-09-23 22:33 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-15 16:38 [PATCH v5 00/15] iommu/arm-smmu-v3: Add PRI support Nicolin Chen
2026-09-15 16:38 ` [PATCH v5 01/15] iommu/arm-smmu-v3: Disable the impl before disabling the SMMU on shutdown Nicolin Chen
2026-09-15 16:51   ` sashiko-bot
2026-09-23 18:37   ` Jason Gunthorpe
2026-09-15 16:38 ` [PATCH v5 02/15] iommu/arm-smmu-v3: Add arm_smmu_attach_release() Nicolin Chen
2026-09-15 16:48   ` sashiko-bot
2026-09-23 18:37   ` Jason Gunthorpe
2026-09-15 16:38 ` [PATCH v5 03/15] iommu/arm-smmu-v3: Add Q_POS() macro Nicolin Chen
2026-09-15 16:42   ` sashiko-bot
2026-09-15 23:19   ` Jonathan Cameron
2026-09-15 16:38 ` [PATCH v5 04/15] iommu/arm-smmu-v3: Drain in-flight fault events on domain detach Nicolin Chen
2026-09-15 16:51   ` sashiko-bot
2026-09-23 18:37   ` Jason Gunthorpe
2026-09-23 22:33     ` Nicolin Chen [this message]
2026-09-23 23:39       ` Jason Gunthorpe
2026-09-24  1:42         ` Nicolin Chen
2026-09-24 14:03           ` Jason Gunthorpe
2026-09-28 22:29         ` Nicolin Chen
2026-09-29 19:46           ` Nicolin Chen
2026-09-15 16:38 ` [PATCH v5 05/15] iommu/arm-smmu-v3: Flush in-flight fault work " Nicolin Chen
2026-09-15 16:57   ` sashiko-bot
2026-09-23 18:37   ` Jason Gunthorpe
2026-09-15 16:38 ` [PATCH v5 06/15] iommu/arm-smmu-v3: Allocate IOPF queue without FEAT_SVA Nicolin Chen
2026-09-15 16:47   ` sashiko-bot
2026-09-23 18:37   ` Jason Gunthorpe
2026-09-15 16:38 ` [PATCH v5 07/15] iommu/arm-smmu-v3: Submit CMDQ_OP_PRI_RESP for IOPF event Nicolin Chen
2026-09-15 17:02   ` sashiko-bot
2026-09-23 18:37   ` Jason Gunthorpe
2026-09-15 16:38 ` [PATCH v5 08/15] iommu/arm-smmu-v3: Disable the queue IRQs before disabling the SMMU Nicolin Chen
2026-09-15 16:48   ` sashiko-bot
2026-09-15 23:21   ` Jonathan Cameron
2026-09-23 18:37   ` Jason Gunthorpe
2026-09-24  1:12     ` Nicolin Chen
2026-09-15 16:38 ` [PATCH v5 09/15] iommu/arm-smmu-v3: Disable PRI when no IRQ handler is registered Nicolin Chen
2026-09-15 16:53   ` sashiko-bot
2026-09-23 18:37   ` Jason Gunthorpe
2026-09-15 16:38 ` [PATCH v5 10/15] iommu/arm-smmu-v3: Support PRI Page Request in arm_smmu_handle_ppr() Nicolin Chen
2026-09-15 16:52   ` sashiko-bot
2026-09-15 23:22   ` Jonathan Cameron
2026-09-23 18:37   ` Jason Gunthorpe
2026-09-15 16:38 ` [PATCH v5 11/15] iommu/arm-smmu-v3: Discard partial PRI faults on PRIQ overflow Nicolin Chen
2026-09-15 16:57   ` sashiko-bot
2026-09-23 18:37   ` Jason Gunthorpe
2026-09-15 16:38 ` [PATCH v5 12/15] iommu/arm-smmu-v3: Allocate IOPF queue for ARM_SMMU_FEAT_PRI Nicolin Chen
2026-09-15 16:56   ` sashiko-bot
2026-09-23 18:37   ` Jason Gunthorpe
2026-09-15 16:38 ` [PATCH v5 13/15] PCI/ATS: Add PRI stubs Nicolin Chen
2026-09-15 16:51   ` sashiko-bot
2026-09-23 18:37   ` Jason Gunthorpe
2026-09-15 16:38 ` [PATCH v5 14/15] PCI/ATS: Export pci_enable_pri() and pci_reset_pri() Nicolin Chen
2026-09-15 16:49   ` sashiko-bot
2026-09-23 18:37   ` Jason Gunthorpe
2026-09-15 16:38 ` [PATCH v5 15/15] iommu/arm-smmu-v3: Enable PRI for PCI device in arm_smmu_probe_device() Nicolin Chen
2026-09-15 16:59   ` sashiko-bot
2026-10-04 16:50 ` [PATCH v5 00/15] iommu/arm-smmu-v3: Add PRI support Will Deacon

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=arRTojIlWBOF57zO@nvidia.com \
    --to=nicolinc@nvidia.com \
    --cc=baolu.lu@linux.intel.com \
    --cc=bbiber@nvidia.com \
    --cc=bhelgaas@google.com \
    --cc=eric.auger@redhat.com \
    --cc=harsha.v@oss.qualcomm.com \
    --cc=iommu@lists.linux.dev \
    --cc=jgg@nvidia.com \
    --cc=jonathan.cameron@oss.qualcomm.com \
    --cc=joro@8bytes.org \
    --cc=jpb@kernel.org \
    --cc=kees@kernel.org \
    --cc=kevin.tian@intel.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=mmarrid@nvidia.com \
    --cc=praan@google.com \
    --cc=robin.murphy@arm.com \
    --cc=skaestle@nvidia.com \
    --cc=skolothumtho@nvidia.com \
    --cc=smostafa@google.com \
    --cc=will@kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.