[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


  • To: Jiqian Chen <Jiqian.Chen@xxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Anthony PERARD <anthony@xxxxxxxxxxxxxx>, "Paul Durrant" <paul@xxxxxxx>, "Edgar E . Iglesias" <edgar.iglesias@xxxxxxxxx>, "Michael S . Tsirkin" <mst@xxxxxxxxxx>, Marcel Apfelbaum <marcel.apfelbaum@xxxxxxxxx>
  • From: Stewart Hildebrand <stewart.hildebrand@xxxxxxx>
  • Date: Fri, 1 Nov 2024 09:09:02 -0400
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0)
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=bPj5OmXfMG436pc2FahpOI7vhljFFMGwqypiLg2zEu0=; b=k3PIXncnmz0fAxq9jbUep0dUvvtkqtTlusy7K3vZy93BXp+a61jPNhyHwJxQ2rUxD/8opPq9fEIdJEG5D9emB7s7qRAC3Njs8BSO7hv1Y5Xym3+SFWD7bSHSuVTKo4mxQ5dcVGC4jvyOfj7xt3oCJW6cfDsNWaJcF2DdQkFi9H2nq2MgvWinuZxnmGO3D6CsRQZ0tAs3OFG63/T4EG2aL/xZ3o123oZaUnk6ugtvKJtWdNkWEDEVzIW9AMHDBKB+SKYYkkYa42+2jnFCkduwGcgQbwfDqHM3QNTDE/b+IQ3evZLWbubWoy22D7K4caLuqC4kNBkCjTDC0DqRgMVzEw==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ox6MQ5PxHrzMpTN7IPfGzIIELuJYDMGL81t9SQowqakyfnlEem8xzWkXOFAMTKV9FXgZEKv3FgmAZ94eGPGUgp5xbW7LCLAwXCEVVt1b3WsUlu6siQCMjlpFPjs6J8j6TZ9i+eXG+bpTDRQbVQxTo7XrPR81b3alJ6WhuP3sOjpXkkBUSW3ojG/Y1qu9bx4FATYGlEpm23GaxzBI+RebWTRlsRcW0o9ssPG7TBADxWepg4hHQbtqHsnEGAVe2mqmSR+UNV0wUdWxYgvQucIEdsU9PIVJxWWBE/i5C44W+ozdfylqTMChhBHHxEVfGf8TPy+D7cjYqp+C/S1PQcnmdQ==
  • Cc: <qemu-devel@xxxxxxxxxx>, <xen-devel@xxxxxxxxxxxxxxxxxxxx>, Huang Rui <ray.huang@xxxxxxx>
  • Delivery-date: Fri, 01 Nov 2024 13:09:46 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

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"
>  




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.