From: "Roger Pau Monné" <roger@xenproject.org>
To: Jan Beulich <jbeulich@suse.com>
Cc: "xen-devel@lists.xenproject.org" <xen-devel@lists.xenproject.org>,
Andrew Cooper <andrew.cooper3@citrix.com>,
Teddy Astie <teddy.astie@vates.tech>,
Julian Vetter <julian.vetter@vates.tech>
Subject: Re: [PATCH 2/6] x86/pass-through: no locking around pt_irq_{create,destroy}_bind()
Date: Tue, 29 Sep 2026 11:31:09 +0200 [thread overview]
Message-ID: <aruFXXizfwCP3yG8@macbook.local> (raw)
In-Reply-To: <dfbafb99-58cd-4be0-aa77-942c6fc916fd@suse.com>
On Mon, Sep 28, 2026 at 02:50:41PM +0200, Jan Beulich wrote:
> On 25.09.2026 16:53, Roger Pau Monné wrote:
> > On Thu, Sep 24, 2026 at 11:57:19AM +0200, Jan Beulich wrote:
> >> On 23.09.2026 12:37, Roger Pau Monné wrote:
> >>> On Tue, Sep 08, 2026 at 03:01:51PM +0200, Jan Beulich wrote:
> >>>> The questionable use of pcidevs_lock() there was discussed more than once.
> >>>> It really is pointless: The functions synchronize primarily via the per-
> >>>> domain event lock. They also may already be called with the global PCI
> >>>> devices lock not held: See hvm/vmsi.c:vpci_msi_update(),
> >>>> hvm/vmsi.c:vpci_msi_arch_update(), and hvm/vmsi.c:vpci_msi_disable().
> >>>>
> >>>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
> >>>>
> >>>> --- a/xen/arch/x86/domctl.c
> >>>> +++ b/xen/arch/x86/domctl.c
> >>>> @@ -636,10 +636,7 @@ long arch_do_domctl(
> >>>> ret = -EPERM;
> >>>> else if ( is_iommu_enabled(d) )
> >>>> {
> >>>> - pcidevs_lock();
> >>>> ret = pt_irq_create_bind(d, bind);
> >>>> - pcidevs_unlock();
> >>>
> >>> pt_irq_create_bind() might call into msixtbl_pt_register() which
> >>> requires either the pcidevs_lock() or the per-domain d->pci_lock lock
> >>> to be taken, which I think is not the case in the context here?
> >>
> >> Hmm, indeed. Not having seen the assertion there trigger kind of worries
> >> me a little. Do you agree that the change to vioapic_hwdom_map_gsi() can,
> >> otoh, be left as is?
> >
> > Hm, I'm borderline on that one - I can't find a path where d->pci_lock
> > will be needed for legacy PCI interrupt binding, yet at the same time
> > I feel it would be better if the locking context is uniform across
> > call sites. I guess I'm fine with the asymmetric locking context if
> > that's your preference. Maybe worth a mention in a comment somewhere.
>
> Maybe it's best if I get v2 out before we settle on this. The need for a
> comment may, with how v2 is done, go away. E.g. the first of the hunks
> now is
>
> @@ -637,9 +637,13 @@ long arch_do_domctl(
> ret = -EPERM;
> else if ( is_iommu_enabled(d) )
> {
> - pcidevs_lock();
> + if ( bind->irq_type == PT_IRQ_TYPE_MSI )
> + read_lock(&d->pci_lock);
> +
> ret = pt_irq_create_bind(d, bind);
> - pcidevs_unlock();
> +
> + if ( bind->irq_type == PT_IRQ_TYPE_MSI )
> + read_unlock(&d->pci_lock);
>
> if ( ret < 0 )
> printk(XENLOG_G_ERR "pt_irq_create_bind failed (%ld) for %pd\n",
Binding an unbinding is an expensive operation. The legacy PCI
interrupt bindings are done only once when the device is assigned to a
domain, and afterwards all calls to XEN_DOMCTL_bind_pt_irq should be
for MSI interrupts. I don't think taking the lock unconditionally
would be that bad, the extra penalty for the one-shot PCI legacy
binding is possibly likely fine if we can remove one conditional?
> While it's only a read-lock now, effects on parallelism aren't as bad
> anymore. Yet still I'm rather hesitant to acquire a lock when there's no
> need for doing so. In the case here we'd still impact any write-lock
> paths, i.e. first and foremost vpci_write().
It's unlikely (albeit not impossible) to have both
XEN_DOMCTL_bind_pt_irq hypercalls and vPCI against the same domain.
Either the domain uses vPCI for passthrough or it uses an external
device model IMO.
> There's possibly another somewhat related issue: vpci_read() only uses
> read_lock(), yet reads can in principle have side effects. Are we (once
> again) building upon Dom0 knowing what it's doing, and this - like many
> other aspect - being in need of auditing before DomU supported can be
> declared complete?
The point of taking d->pci_lock in write mode is to prevent accesses
to any pdevs assigned to the domain, so that the position of BARs
across any devices assigned to a domain cannot change as we have to
check for overlaps. However for other accesses we so far have no need
to cross check like this against all devices assigned to a domain, and
hence just taking the pdev->vpci->lock (so a per-device lock) is
possibly enough, as per-device accesses are still serialized?
Thanks, Roger.
next prev parent reply other threads:[~2026-09-29 9:31 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-08 13:00 [PATCH 0/6] x86: pass-through / {,v}PCI locking Jan Beulich
2026-09-08 13:01 ` [PATCH 1/6] x86/pass-through: defer event unlock in pt_irq_create_bind() Jan Beulich
2026-09-22 13:37 ` Roger Pau Monné
2026-09-22 14:59 ` Jan Beulich
2026-09-08 13:01 ` [PATCH 2/6] x86/pass-through: no locking around pt_irq_{create,destroy}_bind() Jan Beulich
2026-09-23 10:37 ` Roger Pau Monné
2026-09-24 9:57 ` Jan Beulich
2026-09-25 14:53 ` Roger Pau Monné
2026-09-28 12:50 ` Jan Beulich
2026-09-29 9:31 ` Roger Pau Monné [this message]
2026-09-08 13:02 ` [PATCH 3/6] x86/vPCI: tighten locking assertions Jan Beulich
2026-09-24 9:02 ` Roger Pau Monné
2026-09-08 13:03 ` [PATCH 4/6] vPCI: drop bogus locking assertion Jan Beulich
2026-09-24 9:28 ` Roger Pau Monné
2026-09-08 13:03 ` [PATCH 5/6] x86/pass-through: use simpler locking primitives in pt_irq_{create,destroy}_bind() Jan Beulich
2026-09-25 16:14 ` Roger Pau Monné
2026-09-08 13:04 ` [PATCH 6/6] x86/HVM: drop vector parameter from .pi_update_irte() hook Jan Beulich
2026-09-25 16:15 ` Roger Pau Monné
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=aruFXXizfwCP3yG8@macbook.local \
--to=roger@xenproject.org \
--cc=andrew.cooper3@citrix.com \
--cc=jbeulich@suse.com \
--cc=julian.vetter@vates.tech \
--cc=teddy.astie@vates.tech \
--cc=xen-devel@lists.xenproject.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.