|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH for-4.22? 2/9] 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>
--- 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;
--- a/xen/common/domctl.c
+++ b/xen/common/domctl.c
@@ -471,38 +471,6 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xe
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);
@@ -563,6 +531,7 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xe
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:
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |