RE: [PATCH v3 2/5] Drivers: hv: Add logical device ID registry for vPCI devices

Michael Kelley <[email protected]>
Newsgroups org.kernel.vger.linux-hyperv,dev.linux.lists.iommu,org.kernel.vger.linux-arch,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pci
Message-ID <SN6PR02MB4157D48F243A3EA8C94C412ED4A72@SN6PR02MB4157.namprd02.prod.outlook.com>
From: Yu Zhang <[email protected]> Sent: Monday, August 17, 2026 3:38 AM
> 
> On Fri, Aug 14, 2026 at 03:31:27PM +0000, Michael Kelley wrote:
> > From: Yu Zhang <[email protected]> Sent: Tuesday, August 11, 2026 8:50 AM
> > >

[snip]

> > > +#ifdef CONFIG_HYPERV_PVIOMMU
> >
> > Making this code in hv_common.c conditional on HYPERV_PVIOMMU
> > assumes that the only consumer is the pvIOMMU driver. But my
> > understanding is that root partition code is also expected to be a
> > consumer, and I would guess that code is independent of a guest
> > pvIOMMU. So the #ifdef might need to become more complicated
> > to also allow the root partition case. I'm thinking it makes sense to
> > always build this code as part of hv_common.c. Even when building
> > for a guest only with no root partition code, HYPERV_PVIOMMU
> > defaults to HYPERV so the pvIOMMU driver will be built anytime
> > Hyper-V code is included, unless someone goes out of their way to
> > disable it. Getting rid of all the #ifdef'ery would make the code a bit
> > cleaner, and I'm looking for an excuse to do so!
> >
> > I'd also note that CONFIG_HYPERV_PVIOMMU isn't defined
> > until Patch 4 of this series. This patch will still build without the
> > remaining patches, so bisect isn't broken, but it would be with
> > the equivalent of CONFIG_HYPERV_PVIOMMU=n. It's a little bit
> > weird to be using a CONFIG_* value before it is created, but maybe
> > the ordering among the patches is complex and not easily sorted.
> >
> 
> Thank you, Michael!
> 
> That makes sense. The trade-off is that a Hyper-V guest without
> pvIOMMU support will still allocate and populate the registry for
> its PCI buses. If that small overhead is acceptable, building it
> unconditionally does make the design simpler. And we do not need
> to worry about the chicken-and-egg problem when ordering this patch
> and patch 4. :)

To me, the small overhead is acceptable. vPCI add/remove
operations are relatively infrequent, and are not a "fast" path. So
the overhead is of no real consequence.

[snip]

> >
> > The comment above is written as if the pvIOMMU driver is the only
> > consumer, which isn't accurate assuming the root partition use case
> > materializes as expected.  And that also means having "iommu" in the
> > function name is overly specific. Same with the other function names
> > with "iommu".  There's really nothing here that is specific to pvIOMMUs.
> >
> 
> Agreed. Will update the comment.
> 
> For the function names, I would like to avoid using sth. like
> hv_register_pci_bus() since that sounds like to register the
> PCI bus itself. Two options I'm having in mind are:
> 
> 	hv_pci_busdata_register()
> 	hv_pci_busdata_unregister()
> 	hv_pci_busdata_lookup()
> 
> or some more descriptive yet legthy ones, e.g.,
> 
> 	hv_pci_bus_register_logical_dev_id_prefix()
> 	hv_pci_bus_unregister_logical_dev_id_prefix()
> 	hv_pci_bus_lookup_logical_dev_id_prefix()
> 
> Do you have a preference, or any suggestion?

Or maybe just hv_pci_register_dev_id()? To me, it's
better to put the verb ("register") first followed by the
object. "logical_dev_id_prefix" as the object is a bit
too wordy for my preference.  Just "dev_id" or "busdata"
is better, even if neither is fully precise.

[snip]

> 
> > Separately, it seems like the existing calls from the Hyper-V vPCI driver should
> > never duplicate an existing mapping. Your code disallows mapping a domain_nr
> > to a different logical_dev_id_prefix, but silently allows entering a mapping
> > that already exists as an exact match. I wonder if that really should be
> > allowed, as it seems likely such would be followed later by twice removing
> > the duplicate entry, with the second removal failing. Removing a non-existent
> > entry is also silently allowed in the unregister function below, with the same
> > question as to whether that should be allowed.
> >
> 
> Actually, I don't think an exact duplicate registration is a valid case
> either. So how about we use WARN_ONCE() and return -EEXIST when an entry
> for the PCI domain is already registered(regardless it is a exact match
> or not)?
> 
> And for unregister, how about we initialize the result to -ENOENT, do the
> removal if lookup finds the entry, and WARN_ONCE if no entry is really
> removed?

Works for me.

> 
> > > +}
> > > +EXPORT_SYMBOL_FOR_MODULES(hv_iommu_register_pci_bus, "pci-hyperv");
> >
> > This may be overly restrictive if the root partition use case code is in the
> > mshv_root module.
> >
> 
> Well, I'm not sure. IMHO, the register/unregister side is owned by
> pci-hyperv, which creates and removes the Hyper-V PCI bus. The guest
> pvIOMMU or the root driver are only cumsumers of the  lookup.
> 
> So maybe the register/unregister exports should remain restricted to
> pci-hyperv, and if a future module needs the lookup helper, an export
> can be added for the lookup helper by then (we do not need to export
> lookup right now for pvIOMMU, which is built-in)?
> 
> Am I missing anything?

You are correct and didn't miss anything. I didn't fully think it through,
so my comment is bogus. What you propose is fine.

Michael
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.