|
[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
Hi Anthony,
On 2024/2/21 23:03, Anthony PERARD wrote:
> 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,
> };
>
That's fine, I will change to this in next version.
> 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?
Because in pci_add_dm_done, it calls " r = xc_physdev_map_pirq(ctx->xch, domid,
irq, &irq); ", it passes the pointer of irq in, and then irq will be changed,
so I need to use gsi to save the origin value.
>
> So, gsi can only be positive integer, right? Could we forgo `has_gsi` and
> just set "gsi = -1" when there's no gsi?
No, we can't forgo 'has_gsi', because we need to set gsi = irq to save the
original val.
>
>> /* 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?
Above reason.
>
>> 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.
You are right, I will separate them in next version.
>
>> @@ -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() ?
Because xc_physdev_unmap_pirq doesn't change the value of irq, but in
pci_add_dm_done, the value of irq is changed by xc_physdev_map_pirq.
>
>> + 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,
>
--
Best regards,
Jiqian Chen.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |