|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [RFC XEN PATCH v5 5/5] domctl: Add XEN_DOMCTL_gsi_permission to grant gsi
On Fri, Jan 12, 2024 at 02:13:17PM +0800, Jiqian Chen wrote:
> diff --git a/tools/libs/ctrl/xc_domain.c b/tools/libs/ctrl/xc_domain.c
> index f2d9d14b4d9f..448ba2c59ae1 100644
> --- a/tools/libs/ctrl/xc_domain.c
> +++ b/tools/libs/ctrl/xc_domain.c
> @@ -1394,6 +1394,21 @@ int xc_domain_irq_permission(xc_interface *xch,
> return do_domctl(xch, &domctl);
> }
>
> +int xc_domain_gsi_permission(xc_interface *xch,
> + uint32_t domid,
> + uint32_t gsi,
> + bool allow_access)
> +{
> + struct xen_domctl domctl = {};
> +
> + domctl.cmd = XEN_DOMCTL_gsi_permission;
> + domctl.domain = domid;
> + domctl.u.gsi_permission.gsi = gsi;
> + domctl.u.gsi_permission.allow_access = allow_access;
This could be written as:
struct xen_domctl domctl = {
.cmd = XEN_DOMCTL_gsi_permission,
.domain = domid,
.u.gsi_permission.gsi = gsi,
.u.gsi_permission.allow_access = allow_access,
};
but your change is fine too.
> +
> + return do_domctl(xch, &domctl);
> +}
> +
> int xc_domain_iomem_permission(xc_interface *xch,
> uint32_t domid,
> unsigned long first_mfn,
> diff --git a/tools/libs/light/libxl_pci.c b/tools/libs/light/libxl_pci.c
> index a1c6e82631e9..4136a860a048 100644
> --- a/tools/libs/light/libxl_pci.c
> +++ b/tools/libs/light/libxl_pci.c
> @@ -1421,6 +1421,8 @@ static void pci_add_dm_done(libxl__egc *egc,
> uint32_t flag = XEN_DOMCTL_DEV_RDM_RELAXED;
> uint32_t domainid = domid;
> bool isstubdom = libxl_is_stubdom(ctx, domid, &domainid);
> + int gsi;
> + bool has_gsi = true;
Why is this function has "gsi" variable, and "gsi = irq" but the next
function pci_remove_detached() does only have "irq" variable?
So, gsi can only be positive integer, right? Could we forgo `has_gsi` and
just set "gsi = -1" when there's no gsi?
> /* Convenience aliases */
> bool starting = pas->starting;
> @@ -1482,6 +1484,7 @@ static void pci_add_dm_done(libxl__egc *egc,
> pci->bus, pci->dev, pci->func);
>
> if ( access(sysfs_path, F_OK) != 0 ) {
> + has_gsi = false;
> if ( errno == ENOENT )
> sysfs_path = GCSPRINTF(SYSFS_PCI_DEV"/"PCI_BDF"/irq",
> pci->domain,
> pci->bus, pci->dev, pci->func);
> @@ -1497,6 +1500,7 @@ static void pci_add_dm_done(libxl__egc *egc,
> goto out_no_irq;
> }
> if ((fscanf(f, "%u", &irq) == 1) && irq) {
> + gsi = irq;
Why do you do this, that that mean that `gsi` and `irq` are the same? Or
does `irq` happen to sometime contain a `gsi` value?
> r = xc_physdev_map_pirq(ctx->xch, domid, irq, &irq);
> if (r < 0) {
> LOGED(ERROR, domainid, "xc_physdev_map_pirq irq=%d (error=%d)",
> @@ -1505,7 +1509,10 @@ static void pci_add_dm_done(libxl__egc *egc,
> rc = ERROR_FAIL;
> goto out;
> }
> - r = xc_domain_irq_permission(ctx->xch, domid, irq, 1);
> + if ( has_gsi )
> + r = xc_domain_gsi_permission(ctx->xch, domid, gsi, 1);
> + if ( !has_gsi || r == -EOPNOTSUPP )
> + r = xc_domain_irq_permission(ctx->xch, domid, irq, 1);
> if (r < 0) {
> LOGED(ERROR, domainid,
> "xc_domain_irq_permission irq=%d (error=%d)", irq, r);
Looks like this error message could be wrong, I think we want to know if
which call between xc_domain_irq_permission() and
xc_domain_gsi_permission() has failed.
> @@ -2185,6 +2192,7 @@ static void pci_remove_detached(libxl__egc *egc,
> FILE *f;
> uint32_t domainid = prs->domid;
> bool isstubdom;
> + bool has_gsi = true;
>
> /* Convenience aliases */
> libxl_device_pci *const pci = &prs->pci;
> @@ -2244,6 +2252,7 @@ skip_bar:
> pci->bus, pci->dev, pci->func);
>
> if ( access(sysfs_path, F_OK) != 0 ) {
> + has_gsi = false;
> if ( errno == ENOENT )
> sysfs_path = GCSPRINTF(SYSFS_PCI_DEV"/"PCI_BDF"/irq",
> pci->domain,
> pci->bus, pci->dev, pci->func);
> @@ -2270,7 +2279,10 @@ skip_bar:
> */
> LOGED(ERROR, domid, "xc_physdev_unmap_pirq irq=%d", irq);
> }
> - rc = xc_domain_irq_permission(ctx->xch, domid, irq, 0);
> + if ( has_gsi )
> + rc = xc_domain_gsi_permission(ctx->xch, domid, irq, 0);
Why do you use the xc_domain_gsi_permission() with "irq" here, but not
in pci_add_dm_done() ?
> + if ( !has_gsi || rc == -EOPNOTSUPP )
> + rc = xc_domain_irq_permission(ctx->xch, domid, irq, 0);
> if (rc < 0) {
> LOGED(ERROR, domid, "xc_domain_irq_permission irq=%d", irq);
> }
These changes to libxl are quite confusing, there's a mixed up between
"gsi" and "irq", it's hard to follow.
Thanks,
--
Anthony PERARD
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |