[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 3/9] x86/physdev: enable PHYSDEVOP_pci_mmcfg_reserved for PVH Dom0
On Fri, Jul 14, 2017 at 04:32:19AM -0600, Jan Beulich wrote: > >>> On 30.06.17 at 17:01, <roger.pau@xxxxxxxxxx> wrote: > > So that hotplug (or MMCFG regions not present in the MCFG ACPI table) > > can be added at run time by the hardware domain. > > I think the emphasis should be the other way around. I'm rather certain > hotplug of bridges doesn't really work right now anyway; at least > IO-APIC hotplug code is completely missing. IO-APICs can also be hot-plugged? Didn't even know about that... > > When a new MMCFG area is added to a PVH Dom0, Xen will scan it and add > > the devices to the hardware domain. > > Adding the MMIO regions is certainly necessary, but what's the point of > also scanning the bus and adding the devices? It's not strictly necessary, the same can be accomplished by Dom0 calling PHYSDEVOP_manage_pci_add on each device. Just thought it wouldn't hurt to do it here, but given your comment below I'm not sure. I will wait for your reply before deciding what to do. > We expect Dom0 to tell us > anyway, and not doing the scan in Xen avoids complications we presently > have in the segment 0 case when Dom0 decides to re-number busses (e.g. > in order to fit in SR-IOV VFs). Is this renumbering performed by changing the Primary/Secondary/Subordinate bus number registers in the bridge? If so we could detect such accesses (by adding traps to type 01h headers) and react accordingly. What if Dom0 re-numbers the bus after having already registered the devices with Xen? > > --- a/xen/arch/x86/hvm/hypercall.c > > +++ b/xen/arch/x86/hvm/hypercall.c > > @@ -89,6 +89,10 @@ static long hvm_physdev_op(int cmd, > > XEN_GUEST_HANDLE_PARAM(void) arg) > > if ( !has_pirq(curr->domain) ) > > return -ENOSYS; > > break; > > + case PHYSDEVOP_pci_mmcfg_reserved: > > + if ( !is_hardware_domain(curr->domain) ) > > + return -ENOSYS; > > + break; > > This physdevop (like most ones) is restricted to Dom0 use anyway > (properly expressed via XSM check), so I'd rather see you check > has_vpci() here, in line with e.g. the check visible in context. Ack. > > --- a/xen/arch/x86/physdev.c > > +++ b/xen/arch/x86/physdev.c > > @@ -559,6 +559,25 @@ ret_t do_physdev_op(int cmd, > > XEN_GUEST_HANDLE_PARAM(void) arg) > > > > ret = pci_mmcfg_reserved(info.address, info.segment, > > info.start_bus, info.end_bus, info.flags); > > + if ( ret || !is_hvm_domain(currd) ) > > + break; > > + > > + /* > > + * For HVM (PVH) domains try to add the newly found MMCFG to the > > + * domain. > > + */ > > + ret = register_vpci_mmcfg_handler(currd, info.address, > > info.start_bus, > > + info.end_bus, info.segment); > > + if ( ret == -EEXIST ) > > + { > > + ret = 0; > > + break; > > I don't really understand this part: Why would handlers be registered > already? If you consider double registration, wouldn't that better > either be detected by pci_mmcfg_reserved() (and the call here avoided > altogether) or the fact indeed be reported back to the caller? Yes, this can be done in pci_mmcfg_reserved, it's just that so far pci_mmcfg_reserved doesn't return -EEXIST for duplicated bridges. > > @@ -1110,6 +1110,37 @@ void __hwdom_init setup_hwdom_pci_devices( > > pcidevs_unlock(); > > } > > > > +static int add_device(uint8_t devfn, struct pci_dev *pdev) > > +{ > > + return iommu_add_device(pdev); > > +} > > You're discarding devfn here, just for iommu_add_device() to re-do the > phantom function handling. At the very least this is wasteful. Perhaps > you minimally want to call iommu_add_device() only when > devfn == pdev->devfn (if all of this code stays in the first place)? Doesn't the IOMMU also need to know about the phantom functions in order to add translations for them too? I assume phantom_stride already takes care of this, so yes, if this has to stay here a pdev->dev == devfn check should be added. > > +int pci_scan_and_setup_segment(uint16_t segment) > > +{ > > + struct pci_seg *pseg = get_pseg(segment); > > + struct setup_hwdom ctxt = { > > + .d = current->domain, > > + .handler = add_device, > > + }; > > + int ret; > > + > > + if ( !pseg ) > > + return -EINVAL; > > + > > + pcidevs_lock(); > > + ret = _scan_pci_devices(pseg, NULL); > > + if ( ret ) > > + goto out; > > + > > + ret = _setup_hwdom_pci_devices(pseg, &ctxt); > > + if ( ret ) > > + goto out; > > + > > + out: > > Please let's avoid such unnecessary goto-s. Even the first one could be > easily avoided without making the code anywhere near unreadable. Right, that's not a problem. Thanks, Roger. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |