[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [QEMU PATCH v9] xen/passthrough: use gsi to map pirq when dom0 is PVH
On 10/24/24 05:06, Jiqian Chen wrote: > diff --git a/hw/xen/xen_pt.c b/hw/xen/xen_pt.c > index 3635d1b39f79..5b10d501d566 100644 > --- a/hw/xen/xen_pt.c > +++ b/hw/xen/xen_pt.c > @@ -766,6 +766,50 @@ static void xen_pt_destroy(PCIDevice *d) { > } > /* init */ > > +#if CONFIG_XEN_CTRL_INTERFACE_VERSION >= 42000 > +static bool xen_pt_need_gsi(void) > +{ > + FILE *fp; > + int len; > + char type[10]; A brief in-code comment to explain how you arrived at 10 would be appreciated. > + const char *guest_type = "/sys/hypervisor/guest_type"; > + > + fp = fopen(guest_type, "r"); > + if (fp == NULL) { > + error_report("Cannot open %s: %s", guest_type, strerror(errno)); > + return false; > + } > + fgets(type, sizeof(type), fp); Please check the return value of fgets. > + fclose(fp); > + > + len = strlen(type); Before passing to strlen, is "type" always guaranteed to have a terminating '\0' character? > + if (len) { > + type[len - 1] = '\0'; > + if (!strcmp(type, "PVH")) { > + return true; > + } > + } > + return false; > +} > + > +static int xen_pt_map_pirq_for_gsi(PCIDevice *d, int *pirq) > +{ > + int gsi; > + XenPCIPassthroughState *s = XEN_PT_DEVICE(d); > + > + gsi = xc_pcidev_get_gsi(xen_xc, > + PCI_SBDF(s->real_device.domain, > + s->real_device.bus, > + s->real_device.dev, > + s->real_device.func)); > + if (gsi >= 0) { > + return xc_physdev_map_pirq_gsi(xen_xc, xen_domid, gsi, pirq); > + } > + > + return gsi; > +} > +#endif > + > static void xen_pt_realize(PCIDevice *d, Error **errp) > { > ERRP_GUARD(); > @@ -847,7 +891,16 @@ static void xen_pt_realize(PCIDevice *d, Error **errp) > goto out; > } > > +#if CONFIG_XEN_CTRL_INTERFACE_VERSION >= 42000 > + if (xen_pt_need_gsi()) { > + rc = xen_pt_map_pirq_for_gsi(d, &pirq); > + } else { > + rc = xc_physdev_map_pirq(xen_xc, xen_domid, machine_irq, &pirq); > + } > +#else > rc = xc_physdev_map_pirq(xen_xc, xen_domid, machine_irq, &pirq); > +#endif > + > if (rc < 0) { > XEN_PT_ERR(d, "Mapping machine irq %u to pirq %i failed, (err: > %d)\n", > machine_irq, pirq, errno); > diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h > index eb26cac81098..07805aa8a5f3 100644 > --- a/include/hw/pci/pci.h > +++ b/include/hw/pci/pci.h > @@ -23,6 +23,10 @@ extern bool pci_available; > #define PCI_SLOT_MAX 32 > #define PCI_FUNC_MAX 8 > > +#define PCI_SBDF(seg, bus, dev, func) \ > + ((((uint32_t)(seg)) << 16) | \ > + (PCI_BUILD_BDF(bus, PCI_DEVFN(dev, func)))) > + > /* Class, Vendor and Device IDs from Linux's pci_ids.h */ > #include "hw/pci/pci_ids.h" >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |