|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] domctl: move XEN_DOMCTL_irq_permission handling to x86 code
commit 345ca8b6e74769f95acd3e7853ff84f460bd0dc3
Author: Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Tue Jun 16 14:16:33 2026 +0200
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Tue Jun 16 14:16:33 2026 +0200
domctl: move XEN_DOMCTL_irq_permission handling to x86 code
HAS_PIRQ is selected by x86 only, and that's expected to remain that way.
Avoid the #ifdef needed by moving the logic to arch_do_domctl(). Leverage
"currd" being available as a local variable there while doing so.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
Release-Acked-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
---
xen/arch/x86/domctl.c | 30 ++++++++++++++++++++++++++++++
xen/common/domctl.c | 33 +--------------------------------
2 files changed, 31 insertions(+), 32 deletions(-)
diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c
index 0e9a253288..d1bd753481 100644
--- a/xen/arch/x86/domctl.c
+++ b/xen/arch/x86/domctl.c
@@ -258,6 +258,36 @@ long arch_do_domctl(
break;
}
+ case XEN_DOMCTL_irq_permission:
+ {
+ unsigned int pirq = domctl->u.irq_permission.pirq, irq;
+ bool allow = domctl->u.irq_permission.allow_access;
+
+ ret = -EINVAL;
+ if ( pirq >= currd->nr_pirqs )
+ break;
+
+ irq = domain_pirq_to_irq(currd, pirq);
+
+ ret = -EPERM;
+ if ( irq )
+ ret = xsm_irq_permission(XSM_PRIV, d, irq, allow);
+ if ( ret )
+ break;
+
+ iocaps_double_lock(d, true);
+
+ if ( !irq_access_permitted(currd, irq) )
+ ret = -EPERM;
+ else if ( allow )
+ ret = irq_permit_access(d, irq);
+ else
+ ret = irq_deny_access(d, irq);
+
+ iocaps_double_unlock(d, true);
+ break;
+ }
+
case XEN_DOMCTL_gsi_permission:
{
int irq;
diff --git a/xen/common/domctl.c b/xen/common/domctl.c
index 6f71a68d51..23406548c1 100644
--- a/xen/common/domctl.c
+++ b/xen/common/domctl.c
@@ -473,38 +473,6 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t)
u_domctl)
goto domctl_out_unlock_domonly;
}
-#ifdef CONFIG_HAS_PIRQ
- case XEN_DOMCTL_irq_permission:
- {
- unsigned int pirq = op->u.irq_permission.pirq, irq;
- bool allow = op->u.irq_permission.allow_access;
-
- ret = -EINVAL;
- if ( pirq >= current->domain->nr_pirqs )
- goto domctl_out_unlock_domonly;
-
- irq = domain_pirq_to_irq(current->domain, pirq);
-
- ret = -EPERM;
- if ( irq )
- ret = xsm_irq_permission(XSM_PRIV, d, irq, allow);
- if ( ret )
- goto domctl_out_unlock_domonly;
-
- iocaps_double_lock(d, true);
-
- if ( !irq_access_permitted(current->domain, irq) )
- ret = -EPERM;
- else if ( allow )
- ret = irq_permit_access(d, irq);
- else
- ret = irq_deny_access(d, irq);
-
- iocaps_double_unlock(d, true);
- goto domctl_out_unlock_domonly;
- }
-#endif
-
case XEN_DOMCTL_set_target:
{
struct domain *e = get_domain_by_id(op->u.set_target.target);
@@ -565,6 +533,7 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t)
u_domctl)
case XEN_DOMCTL_ioport_permission:
case XEN_DOMCTL_ioport_mapping:
+ case XEN_DOMCTL_irq_permission:
case XEN_DOMCTL_gsi_permission:
case XEN_DOMCTL_bind_pt_irq:
case XEN_DOMCTL_unbind_pt_irq:
--
generated by git-patchbot for /home/xen/git/xen.git#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |