Message ID | 38b059a9d0a923c7d3f7eb24b675f6ab43863340.1569680095.git-series.marmarek@invisiblethingslab.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Fix PCI passthrough for HVM with stubdomain | expand |
Marek Marczykowski-Górecki writes ("[PATCH v8 2/4] libxl: do not attach xen-pciback to HVM domain, if stubdomain is in use"): > HVM domains use IOMMU and device model assistance for communicating with > PCI devices, xen-pcifront/pciback isn't directly needed by HVM domain. > But pciback serve also second function - it reset the device when it is > deassigned from the guest and for this reason pciback needs to be used > with HVM domain too. > When HVM domain has device model in stubdomain, attaching xen-pciback to > the target domain itself may prevent attaching xen-pciback to the > (PV) stubdomain, effectively breaking PCI passthrough. > > Fix this by attaching pciback only to one domain: if PV stubdomain is in > use, let it be stubdomain (the commit prevents attaching device to target > HVM in this case); otherwise, attach it to the target domain. > > Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> > Acked-by: Wei Liu <wei.liu2@citrix.com> FTR, this had a trivial conflict with 7988902b libxl_pci: Don't ignore PCI PT error at guest creation which I am fixing up. Ian.
diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c index 2edff64..ac597a5 100644 --- a/tools/libxl/libxl_pci.c +++ b/tools/libxl/libxl_pci.c @@ -1399,7 +1399,7 @@ out_no_irq: } } - if (!starting) + if (!starting && !libxl_get_stubdom_id(CTX, domid)) rc = libxl__device_pci_add_xenstore(gc, domid, pcidev, starting); else rc = 0; @@ -1697,7 +1697,7 @@ static void add_pcidevs_done(libxl__egc *egc, libxl__multidev *multidev, libxl_domid domid = apds->domid; libxl__ao_device *aodev = apds->outer_aodev; - if (d_config->num_pcidevs > 0) { + if (d_config->num_pcidevs > 0 && !libxl_get_stubdom_id(CTX, domid)) { rc = libxl__create_pci_backend(gc, domid, d_config->pcidevs, d_config->num_pcidevs); if (rc < 0) {