[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2] pci: a workaround for nonstandard PCI devices whose PBA shares
>>> On 09.04.18 at 15:16, <chao.gao@xxxxxxxxx> wrote: > Given that parsing parameters starts at very early stage in which xmalloc is > unusable, I choose to continue using an array other than a list to store SBDFs > of such kind devices, like the way how we manage phantom_devs. Yes, I was about to say that on v1 when I saw v2 come in. > --- a/docs/misc/xen-command-line.markdown > +++ b/docs/misc/xen-command-line.markdown > @@ -1423,6 +1423,16 @@ Defaults to booting secondary processors. > > > Default: `on` > > +### pba\_shared\_quirk > +> `= List of [<seg>:]<bus>:<device>.<function>` > + > +Specify a list of SBDF of devices. When assigning devices in this list > +to guest, reading or writing the page where MSI-X PBA resides are > +allowed. This option provides a workaround for nonstandard PCI devices > +whose MSI-X PBA shares the same 4K-byte page with registers irrelevant > +to MSI-X. Note that adding an untrusted device to this option would > +undermine security of the entire system. No underscores in new command line options please - use dashes. I'm not convinced though that a global option is well suited here: Exposing the device in this way may be okay for one guest, but not for another. With your model one would need to reboot the entire host for such a usage change. Furthermore boot time specification of SBDF is a problem with the Dom0 kernel possibly re-organizing the topology, and is not going to work well with hot-plugged devices. IOW - I think this setting needs to be specified at device assignment time. > --- a/xen/arch/x86/msi.c > +++ b/xen/arch/x86/msi.c > @@ -992,7 +992,22 @@ static int msix_capability_init(struct pci_dev *dev, > if ( rangeset_add_range(mmio_ro_ranges, msix->table.first, > msix->table.last) ) > WARN(); > - if ( rangeset_add_range(mmio_ro_ranges, msix->pba.first, > + > + /* > + * If pages where MSI-X PBA resides overlap with other read-only mmio > + * range, pba_shared_quirk won't meet our desire. Hence disable it. > + */ > + if ( msix->pba_shared_quirk_enabled && > + rangeset_overlaps_range(mmio_ro_ranges, msix->pba.first, > + msix->pba.last) ) > + { > + printk("PBA_shared_quirk is disabled for %04x:%02x:%02x.%u", > + seg, bus, slot, func); > + msix->pba_shared_quirk_enabled = false; > + } > + > + if ( !msix->pba_shared_quirk_enabled && > + rangeset_add_range(mmio_ro_ranges, msix->pba.first, > msix->pba.last) ) > WARN(); > > @@ -1139,7 +1154,8 @@ static void _pci_cleanup_msix(struct arch_msix *msix) > if ( rangeset_remove_range(mmio_ro_ranges, msix->table.first, > msix->table.last) ) > WARN(); > - if ( rangeset_remove_range(mmio_ro_ranges, msix->pba.first, > + if ( !msix->pba_shared_quirk_enabled && > + rangeset_remove_range(mmio_ro_ranges, msix->pba.first, > msix->pba.last) ) I don't think you need to alter the condition here. > --- a/xen/drivers/passthrough/pci.c > +++ b/xen/drivers/passthrough/pci.c > @@ -184,6 +184,39 @@ static int __init parse_phantom_dev(const char *str) > } > custom_param("pci-phantom", parse_phantom_dev); > > +static struct pba_shared_quirk_dev { > + pci_sbdf_t sbdf; > +} pba_shared_quirk_devs[8]; Any reason this can't be of type pci_sbdf_t[8]? > +static unsigned int nr_pba_shared_quirk_devs; Both __read_mostly please. > --- a/xen/include/asm-x86/msi.h > +++ b/xen/include/asm-x86/msi.h > @@ -239,6 +239,7 @@ struct arch_msix { > int table_idx[MAX_MSIX_TABLE_PAGES]; > spinlock_t table_lock; > bool host_maskall, guest_maskall; > + bool pba_shared_quirk_enabled; I don't think you need the "_enabled" suffix - it's a boolean after all. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |