Mailing List Archive

[PATCH v3 1/3] restrict concept of pIRQ to x86
... by way of a new arch-selectable Kconfig control.

Note that some smaller pieces of code are left without #ifdef, to keep
things better readable. Hence items like ECS_PIRQ, nr_static_irqs, or
domain_pirq_to_irq() remain uniformly.

As to XEN_DOMCTL_irq_permission - this, despite having a uniformly
available wrapper in libxc, is unused on Arm: libxl bypasses those
calls, and the Python and OCamL bindings have no users at all.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
---
v3: Move #ifdef in xen/common/domctl.c around the entire sub-op.
Re-base.
v2: New.

--- a/docs/misc/xen-command-line.pandoc
+++ b/docs/misc/xen-command-line.pandoc
@@ -1136,7 +1136,7 @@ introduced with the Nehalem architecture
intended as an emergency option for people who first chose fast, then
change their minds to secure, and wish not to reboot.**

-### extra_guest_irqs
+### extra_guest_irqs (x86)
> `= [<domU number>][,<dom0 number>]`

> Default: `32,<variable>`
--- a/xen/arch/arm/include/asm/irq.h
+++ b/xen/arch/arm/include/asm/irq.h
@@ -52,7 +52,6 @@ struct arch_irq_desc {

extern const unsigned int nr_irqs;
#define nr_static_irqs NR_IRQS
-#define arch_hwdom_irqs(domid) NR_IRQS

struct irq_desc;
struct irqaction;
--- a/xen/arch/x86/Kconfig
+++ b/xen/arch/x86/Kconfig
@@ -25,6 +25,7 @@ config X86
select HAS_PCI
select HAS_PCI_MSI
select HAS_PDX
+ select HAS_PIRQ
select HAS_SCHED_GRANULARITY
select HAS_UBSAN
select HAS_VPCI if HVM
--- a/xen/common/Kconfig
+++ b/xen/common/Kconfig
@@ -56,6 +56,9 @@ config HAS_KEXEC
config HAS_PDX
bool

+config HAS_PIRQ
+ bool
+
config HAS_PMAP
bool

--- a/xen/common/domain.c
+++ b/xen/common/domain.c
@@ -350,6 +350,8 @@ static int late_hwdom_init(struct domain
#endif
}

+#ifdef CONFIG_HAS_PIRQ
+
static unsigned int __read_mostly extra_hwdom_irqs;
static unsigned int __read_mostly extra_domU_irqs = 32;

@@ -364,6 +366,8 @@ static int __init cf_check parse_extra_g
}
custom_param("extra_guest_irqs", parse_extra_guest_irqs);

+#endif /* CONFIG_HAS_PIRQ */
+
static int __init cf_check parse_dom0_param(const char *s)
{
const char *ss;
@@ -682,6 +686,7 @@ struct domain *domain_create(domid_t dom
if ( is_system_domain(d) && !is_idle_domain(d) )
return d;

+#ifdef CONFIG_HAS_PIRQ
if ( !is_idle_domain(d) )
{
if ( !is_hardware_domain(d) )
@@ -693,6 +698,7 @@ struct domain *domain_create(domid_t dom

radix_tree_init(&d->pirq_tree);
}
+#endif

if ( (err = arch_domain_create(d, config, flags)) != 0 )
goto fail;
@@ -784,7 +790,9 @@ struct domain *domain_create(domid_t dom
{
evtchn_destroy(d);
evtchn_destroy_final(d);
+#ifdef CONFIG_HAS_PIRQ
radix_tree_destroy(&d->pirq_tree, free_pirq_struct);
+#endif
}
if ( init_status & INIT_watchdog )
watchdog_domain_destroy(d);
@@ -1180,7 +1188,9 @@ static void cf_check complete_domain_des

evtchn_destroy_final(d);

+#ifdef CONFIG_HAS_PIRQ
radix_tree_destroy(&d->pirq_tree, free_pirq_struct);
+#endif

xfree(d->vcpu);

@@ -1893,6 +1903,8 @@ long do_vm_assist(unsigned int cmd, unsi
}
#endif

+#ifdef CONFIG_HAS_PIRQ
+
struct pirq *pirq_get_info(struct domain *d, int pirq)
{
struct pirq *info = pirq_info(d, pirq);
@@ -1922,6 +1934,8 @@ void cf_check free_pirq_struct(void *ptr
call_rcu(&pirq->rcu_head, _free_pirq_struct);
}

+#endif /* CONFIG_HAS_PIRQ */
+
struct migrate_info {
long (*func)(void *data);
void *data;
--- a/xen/common/domctl.c
+++ b/xen/common/domctl.c
@@ -648,6 +648,7 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xe
}
break;

+#ifdef CONFIG_HAS_PIRQ
case XEN_DOMCTL_irq_permission:
{
unsigned int pirq = op->u.irq_permission.pirq, irq;
@@ -667,6 +668,7 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xe
ret = irq_deny_access(d, irq);
break;
}
+#endif

case XEN_DOMCTL_iomem_permission:
{
--- a/xen/common/event_channel.c
+++ b/xen/common/event_channel.c
@@ -567,6 +567,7 @@ static int evtchn_bind_ipi(evtchn_bind_i
return rc;
}

+#ifdef CONFIG_HAS_PIRQ

static void link_pirq_port(int port, struct evtchn *chn, struct vcpu *v)
{
@@ -592,9 +593,11 @@ static void unlink_pirq_port(struct evtc
chn->u.pirq.prev_port;
}

+#endif /* CONFIG_HAS_PIRQ */

static int evtchn_bind_pirq(evtchn_bind_pirq_t *bind)
{
+#ifdef CONFIG_HAS_PIRQ
struct evtchn *chn;
struct domain *d = current->domain;
struct vcpu *v = d->vcpu[0];
@@ -664,6 +667,9 @@ static int evtchn_bind_pirq(evtchn_bind_
write_unlock(&d->event_lock);

return rc;
+#else /* !CONFIG_HAS_PIRQ */
+ return -EOPNOTSUPP;
+#endif
}


@@ -696,6 +702,7 @@ int evtchn_close(struct domain *d1, int
case ECS_UNBOUND:
break;

+#ifdef CONFIG_HAS_PIRQ
case ECS_PIRQ: {
struct pirq *pirq = pirq_info(d1, chn1->u.pirq.irq);

@@ -705,14 +712,13 @@ int evtchn_close(struct domain *d1, int
pirq_guest_unbind(d1, pirq);
pirq->evtchn = 0;
pirq_cleanup_check(pirq, d1);
-#ifdef CONFIG_X86
if ( is_hvm_domain(d1) && domain_pirq_to_irq(d1, pirq->pirq) > 0 )
unmap_domain_pirq_emuirq(d1, pirq->pirq);
-#endif
}
unlink_pirq_port(chn1, d1->vcpu[chn1->notify_vcpu_id]);
break;
}
+#endif

case ECS_VIRQ: {
struct vcpu *v;
@@ -1122,6 +1128,8 @@ int evtchn_bind_vcpu(evtchn_port_t port,
case ECS_INTERDOMAIN:
chn->notify_vcpu_id = v->vcpu_id;
break;
+
+#ifdef CONFIG_HAS_PIRQ
case ECS_PIRQ:
if ( chn->notify_vcpu_id == v->vcpu_id )
break;
@@ -1131,6 +1139,8 @@ int evtchn_bind_vcpu(evtchn_port_t port,
cpumask_of(v->processor));
link_pirq_port(port, chn, v);
break;
+#endif
+
default:
rc = -EINVAL;
break;
--- a/xen/include/xen/sched.h
+++ b/xen/include/xen/sched.h
@@ -438,12 +438,14 @@ struct domain

struct grant_table *grant_table;

+#ifdef CONFIG_HAS_PIRQ
/*
* Interrupt to event-channel mappings and other per-guest-pirq data.
* Protected by the domain's event-channel spinlock.
*/
struct radix_tree_root pirq_tree;
unsigned int nr_pirqs;
+#endif

unsigned int options; /* copy of createdomain flags */
Re: [PATCH v3 1/3] restrict concept of pIRQ to x86 [ In reply to ]
Hi Jan,

On 27/07/2023 08:38, Jan Beulich wrote:
> ... by way of a new arch-selectable Kconfig control.
>
> Note that some smaller pieces of code are left without #ifdef, to keep
> things better readable. Hence items like ECS_PIRQ, nr_static_irqs, or
> domain_pirq_to_irq() remain uniformly.
>
> As to XEN_DOMCTL_irq_permission - this, despite having a uniformly
> available wrapper in libxc, is unused on Arm: libxl bypasses those
> calls, and the Python and OCamL bindings have no users at all.
>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Sorry for the late reply:

Acked-by: Julien Grall <jgrall@amazon.com>

Cheers,

--
Julien Grall