|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [RFC XEN PATCH v4 4/5] domctl: Use gsi to grant/revoke irq permission
Some type of domain don't have PIRQ, like PVH, current
implementation is not suitable for those domain.
When passthrough a device to guest on PVH dom0, this
pci_add_dm_done->XEN_DOMCTL_irq_permission will failed
at domain_pirq_to_irq.
So, change it to use gsi to grant/revoke irq permission.
And change the caller of XEN_DOMCTL_irq_permission to
pass gsi to it instead of pirq.
Co-developed-by: Huang Rui <ray.huang@xxxxxxx>
Signed-off-by: Jiqian Chen <Jiqian.Chen@xxxxxxx>
---
tools/libs/light/libxl_pci.c | 6 ++++--
tools/libs/light/libxl_x86.c | 5 ++++-
xen/common/domctl.c | 12 ++++++++++--
3 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/tools/libs/light/libxl_pci.c b/tools/libs/light/libxl_pci.c
index 96cb4da0794e..e1341d1e9850 100644
--- a/tools/libs/light/libxl_pci.c
+++ b/tools/libs/light/libxl_pci.c
@@ -1418,6 +1418,7 @@ static void pci_add_dm_done(libxl__egc *egc,
unsigned long long start, end, flags, size;
int irq, i;
int r;
+ int gsi;
uint32_t flag = XEN_DOMCTL_DEV_RDM_RELAXED;
uint32_t domainid = domid;
bool isstubdom = libxl_is_stubdom(ctx, domid, &domainid);
@@ -1486,6 +1487,7 @@ static void pci_add_dm_done(libxl__egc *egc,
goto out_no_irq;
}
if ((fscanf(f, "%u", &irq) == 1) && irq) {
+ gsi = irq;
r = xc_physdev_map_pirq(ctx->xch, domid, irq, &irq);
if (r < 0) {
LOGED(ERROR, domainid, "xc_physdev_map_pirq irq=%d (error=%d)",
@@ -1494,10 +1496,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);
+ r = xc_domain_irq_permission(ctx->xch, domid, gsi, 1);
if (r < 0) {
LOGED(ERROR, domainid,
- "xc_domain_irq_permission irq=%d (error=%d)", irq, r);
+ "xc_domain_irq_permission irq=%d (error=%d)", gsi, r);
fclose(f);
rc = ERROR_FAIL;
goto out;
diff --git a/tools/libs/light/libxl_x86.c b/tools/libs/light/libxl_x86.c
index d16573e72cd4..88ad50cf6360 100644
--- a/tools/libs/light/libxl_x86.c
+++ b/tools/libs/light/libxl_x86.c
@@ -654,12 +654,15 @@ out:
int libxl__arch_domain_map_irq(libxl__gc *gc, uint32_t domid, int irq)
{
int ret;
+ int gsi;
+
+ gsi = irq;
ret = xc_physdev_map_pirq(CTX->xch, domid, irq, &irq);
if (ret)
return ret;
- ret = xc_domain_irq_permission(CTX->xch, domid, irq, 1);
+ ret = xc_domain_irq_permission(CTX->xch, domid, gsi, 1);
return ret;
}
diff --git a/xen/common/domctl.c b/xen/common/domctl.c
index f5a71ee5f78d..eeb975bd0194 100644
--- a/xen/common/domctl.c
+++ b/xen/common/domctl.c
@@ -653,12 +653,20 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t)
u_domctl)
unsigned int pirq = op->u.irq_permission.pirq, irq;
int allow = op->u.irq_permission.allow_access;
- if ( pirq >= current->domain->nr_pirqs )
+ if ( pirq >= nr_irqs_gsi )
{
ret = -EINVAL;
break;
}
- irq = pirq_access_permitted(current->domain, pirq);
+
+ if ( irq_access_permitted(current->domain, pirq) )
+ irq = pirq;
+ else
+ {
+ ret = -EPERM;
+ break;
+ }
+
if ( !irq || xsm_irq_permission(XSM_HOOK, d, irq, allow) )
ret = -EPERM;
else if ( allow )
--
2.34.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |