diff --git a/CHANGELOG.md b/CHANGELOG.md index 26e7d8dd2a..46c7d38963 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) - On x86: - Support for running on Xeon Phi processors. - Removed the `ucode=allow-same` command line option. + - Removed x2APIC Cluster Mode for external interrupts. x2APIC Physical and + Mixed Modes are still available. ## [4.19.0](https://xenbits.xenproject.org/gitweb/?p=xen.git;a=shortlog;h=RELEASE-4.19.0) - 2024-07-29 diff --git a/docs/misc/xen-command-line.pandoc b/docs/misc/xen-command-line.pandoc index 959cf45b55..5ce63044ad 100644 --- a/docs/misc/xen-command-line.pandoc +++ b/docs/misc/xen-command-line.pandoc @@ -2842,10 +2842,10 @@ the watchdog. Permit use of x2apic setup for SMP environments. ### x2apic-mode (x86) -> `= physical | cluster | mixed` +> `= physical | mixed` > Default: `physical` if **FADT** mandates physical mode, otherwise set at -> build time by CONFIG_X2APIC_{PHYSICAL,LOGICAL,MIXED}. +> build time by CONFIG_X2APIC_{PHYSICAL,MIXED}. In the case that x2apic is in use, this option switches between modes to address APICs in the system as interrupt destinations. diff --git a/xen/arch/x86/Kconfig b/xen/arch/x86/Kconfig index 62f0b5e0f4..ab862b083f 100644 --- a/xen/arch/x86/Kconfig +++ b/xen/arch/x86/Kconfig @@ -275,18 +275,6 @@ config X2APIC_PHYSICAL destination inter processor interrupts (IPIs) slightly slower than Logical Destination mode. -config X2APIC_CLUSTER - bool "Cluster Destination mode" - help - When using this mode APICs are addressed using the Cluster Logical - Destination mode. - - Cluster Destination has the benefit of sending IPIs faster since - multiple APICs can be targeted as destinations of a single IPI. - However the vector space is shared between all CPUs on the cluster, - and hence using this mode reduces the number of available vectors - when compared to Physical mode. - config X2APIC_MIXED bool "Mixed Destination mode" help diff --git a/xen/arch/x86/genapic/x2apic.c b/xen/arch/x86/genapic/x2apic.c index d531035fa4..c277f4f79b 100644 --- a/xen/arch/x86/genapic/x2apic.c +++ b/xen/arch/x86/genapic/x2apic.c @@ -63,26 +63,6 @@ static void cf_check init_apic_ldr_x2apic_cluster(void) cpumask_set_cpu(this_cpu, per_cpu(cluster_cpus, this_cpu)); } -static const cpumask_t *cf_check vector_allocation_cpumask_x2apic_cluster( - int cpu) -{ - return per_cpu(cluster_cpus, cpu); -} - -static unsigned int cf_check cpu_mask_to_apicid_x2apic_cluster( - const cpumask_t *cpumask) -{ - unsigned int cpu = cpumask_any(cpumask); - unsigned int dest = per_cpu(cpu_2_logical_apicid, cpu); - const cpumask_t *cluster_cpus = per_cpu(cluster_cpus, cpu); - - for_each_cpu ( cpu, cluster_cpus ) - if ( cpumask_test_cpu(cpu, cpumask) ) - dest |= per_cpu(cpu_2_logical_apicid, cpu); - - return dest; -} - static void cf_check send_IPI_self_x2apic(uint8_t vector) { apic_wrmsr(APIC_SELF_IPI, vector); @@ -169,17 +149,6 @@ static const struct genapic __initconst_cf_clobber apic_x2apic_phys = { .send_IPI_self = send_IPI_self_x2apic }; -static const struct genapic __initconst_cf_clobber apic_x2apic_cluster = { - APIC_INIT("x2apic_cluster", NULL), - .int_delivery_mode = dest_LowestPrio, - .int_dest_mode = 1 /* logical delivery */, - .init_apic_ldr = init_apic_ldr_x2apic_cluster, - .vector_allocation_cpumask = vector_allocation_cpumask_x2apic_cluster, - .cpu_mask_to_apicid = cpu_mask_to_apicid_x2apic_cluster, - .send_IPI_mask = send_IPI_mask_x2apic_cluster, - .send_IPI_self = send_IPI_self_x2apic -}; - /* * Mixed x2APIC mode: use physical for external (device) interrupts, and * cluster for inter processor interrupts. Such mode has the benefits of not @@ -252,15 +221,13 @@ static int8_t __initdata x2apic_phys = -1; boolean_param("x2apic_phys", x2apic_phys); enum { - unset, physical, cluster, mixed + unset, physical, mixed } static __initdata x2apic_mode = unset; static int __init cf_check parse_x2apic_mode(const char *s) { if ( !cmdline_strcmp(s, "physical") ) x2apic_mode = physical; - else if ( !cmdline_strcmp(s, "cluster") ) - x2apic_mode = cluster; else if ( !cmdline_strcmp(s, "mixed") ) x2apic_mode = mixed; else @@ -274,7 +241,7 @@ const struct genapic *__init apic_x2apic_probe(void) { /* Honour the legacy cmdline setting if it's the only one provided. */ if ( x2apic_mode == unset && x2apic_phys >= 0 ) - x2apic_mode = x2apic_phys ? physical : cluster; + x2apic_mode = x2apic_phys ? physical : mixed; if ( x2apic_mode == unset ) { @@ -286,21 +253,12 @@ const struct genapic *__init apic_x2apic_probe(void) else x2apic_mode = IS_ENABLED(CONFIG_X2APIC_MIXED) ? mixed : (IS_ENABLED(CONFIG_X2APIC_PHYSICAL) ? physical - : cluster); + : mixed); } if ( x2apic_mode == physical ) return &apic_x2apic_phys; - if ( x2apic_mode == cluster && iommu_intremap != iommu_intremap_full ) - { - printk("WARNING: x2APIC cluster mode is not supported %s interrupt remapping -" - " forcing mixed mode\n", - iommu_intremap == iommu_intremap_off ? "without" - : "with restricted"); - x2apic_mode = mixed; - } - if ( !this_cpu(cluster_cpus) ) { update_clusterinfo(NULL, CPU_UP_PREPARE, @@ -309,7 +267,7 @@ const struct genapic *__init apic_x2apic_probe(void) register_cpu_notifier(&x2apic_cpu_nfb); } - return x2apic_mode == cluster ? &apic_x2apic_cluster : &apic_x2apic_mixed; + return &apic_x2apic_mixed; } void __init check_x2apic_preenabled(void)