[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] restrict concept of pIRQ to x86
commit 13a7b0f9f747b6ecba7a08ea63255093767359c0 Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Thu Mar 14 13:51:19 2024 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Thu Mar 14 13:51:19 2024 +0100 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@xxxxxxxx> Acked-by: Julien Grall <jgrall@xxxxxxxxxx> --- docs/misc/xen-command-line.pandoc | 2 +- xen/arch/arm/include/asm/irq.h | 1 - xen/arch/x86/Kconfig | 1 + xen/common/Kconfig | 3 +++ xen/common/domain.c | 14 ++++++++++++++ xen/common/domctl.c | 2 ++ xen/common/event_channel.c | 14 ++++++++++++-- xen/include/xen/sched.h | 2 ++ 8 files changed, 35 insertions(+), 4 deletions(-) diff --git a/docs/misc/xen-command-line.pandoc b/docs/misc/xen-command-line.pandoc index 54edbc0fbc..04f1415fc3 100644 --- a/docs/misc/xen-command-line.pandoc +++ b/docs/misc/xen-command-line.pandoc @@ -1165,7 +1165,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>` diff --git a/xen/arch/arm/include/asm/irq.h b/xen/arch/arm/include/asm/irq.h index c8044b0371..1bae538887 100644 --- 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; diff --git a/xen/arch/x86/Kconfig b/xen/arch/x86/Kconfig index 01c6bea480..d6f3128588 100644 --- a/xen/arch/x86/Kconfig +++ b/xen/arch/x86/Kconfig @@ -26,6 +26,7 @@ config X86 select HAS_PASSTHROUGH select HAS_PCI select HAS_PCI_MSI + select HAS_PIRQ select HAS_SCHED_GRANULARITY select HAS_UBSAN select HAS_VPCI if HVM diff --git a/xen/common/Kconfig b/xen/common/Kconfig index a5c3d5a6bf..cff3166ff9 100644 --- a/xen/common/Kconfig +++ b/xen/common/Kconfig @@ -71,6 +71,9 @@ config HAS_IOPORTS config HAS_KEXEC bool +config HAS_PIRQ + bool + config HAS_PMAP bool diff --git a/xen/common/domain.c b/xen/common/domain.c index f6f5574996..1f0d23a1e0 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -350,6 +350,8 @@ static int late_hwdom_init(struct domain *d) #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_guest_irqs(const char *s) } 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; @@ -683,6 +687,7 @@ struct domain *domain_create(domid_t domid, 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) ) @@ -694,6 +699,7 @@ struct domain *domain_create(domid_t domid, radix_tree_init(&d->pirq_tree); } +#endif if ( (err = arch_domain_create(d, config, flags)) != 0 ) goto fail; @@ -793,7 +799,9 @@ struct domain *domain_create(domid_t domid, { 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); @@ -1192,7 +1200,9 @@ static void cf_check complete_domain_destroy(struct rcu_head *head) evtchn_destroy_final(d); +#ifdef CONFIG_HAS_PIRQ radix_tree_destroy(&d->pirq_tree, free_pirq_struct); +#endif xfree(d->vcpu); @@ -2058,6 +2068,8 @@ long do_vm_assist(unsigned int cmd, unsigned int type) } #endif +#ifdef CONFIG_HAS_PIRQ + struct pirq *pirq_get_info(struct domain *d, int pirq) { struct pirq *info = pirq_info(d, pirq); @@ -2087,6 +2099,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; diff --git a/xen/common/domctl.c b/xen/common/domctl.c index f5a71ee5f7..d94a9dae91 100644 --- a/xen/common/domctl.c +++ b/xen/common/domctl.c @@ -648,6 +648,7 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) } 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(xen_domctl_t) u_domctl) ret = irq_deny_access(d, irq); break; } +#endif case XEN_DOMCTL_iomem_permission: { diff --git a/xen/common/event_channel.c b/xen/common/event_channel.c index bbfda2538e..20f586cf5e 100644 --- a/xen/common/event_channel.c +++ b/xen/common/event_channel.c @@ -566,6 +566,7 @@ static int evtchn_bind_ipi(evtchn_bind_ipi_t *bind) return rc; } +#ifdef CONFIG_HAS_PIRQ static void link_pirq_port(int port, struct evtchn *chn, struct vcpu *v) { @@ -591,9 +592,11 @@ static void unlink_pirq_port(struct evtchn *chn, struct vcpu *v) 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]; @@ -663,6 +666,9 @@ static int evtchn_bind_pirq(evtchn_bind_pirq_t *bind) write_unlock(&d->event_lock); return rc; +#else /* !CONFIG_HAS_PIRQ */ + return -EOPNOTSUPP; +#endif } @@ -695,6 +701,7 @@ int evtchn_close(struct domain *d1, int port1, bool guest) case ECS_UNBOUND: break; +#ifdef CONFIG_HAS_PIRQ case ECS_PIRQ: { struct pirq *pirq = pirq_info(d1, chn1->u.pirq.irq); @@ -704,14 +711,13 @@ int evtchn_close(struct domain *d1, int port1, bool guest) 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; @@ -1121,6 +1127,8 @@ int evtchn_bind_vcpu(evtchn_port_t port, unsigned int vcpu_id) 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; @@ -1130,6 +1138,8 @@ int evtchn_bind_vcpu(evtchn_port_t port, unsigned int vcpu_id) cpumask_of(v->processor)); link_pirq_port(port, chn, v); break; +#endif + default: rc = -EINVAL; break; diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h index 37f5922f32..7c6be0931a 100644 --- a/xen/include/xen/sched.h +++ b/xen/include/xen/sched.h @@ -439,12 +439,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 */ -- generated by git-patchbot for /home/xen/git/xen.git#staging
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |