Commit 0abf5086 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Ingo Molnar
Browse files

x86/smp: Drop 32-bit "bigsmp" machine support



The x86-32 kernel used to support multiple platforms with more than eight
logical CPUs, from the 1999-2003 timeframe: Sequent NUMA-Q, IBM Summit,
Unisys ES7000 and HP F8. Support for all except the latter was dropped
back in 2014, leaving only the F8 based DL740 and DL760 G2 machines in
this catery, with up to eight single-core Socket-603 Xeon-MP processors
with hyperthreading.

Like the already removed machines, the HP F8 servers at the time cost
upwards of $100k in typical configurations, but were quickly obsoleted
by their 64-bit Socket-604 cousins and the AMD Opteron.

Earlier servers with up to 8 Pentium Pro or Xeon processors remain
fully supported as they had no hyperthreading. Similarly, the more
common 4-socket Xeon-MP machines with hyperthreading using Intel
or ServerWorks chipsets continue to work without this, and all the
multi-core Xeon processors also run 64-bit kernels.

While the "bigsmp" support can also be used to run on later 64-bit
machines (including VM guests), it seems best to discourage that
and get any remaining users to update their kernels to 64-bit builds
on these. As a side-effect of this, there is also no more need to
support NUMA configurations on 32-bit x86, as all true 32-bit
NUMA platforms are already gone.

Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Link: https://lore.kernel.org/r/20250226213714.4040853-3-arnd@kernel.org
parent 6ac43f2b
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -416,10 +416,6 @@
			Format: { quiet (default) | verbose | debug }
			Change the amount of debugging information output
			when initialising the APIC and IO-APIC components.
			For X86-32, this can also be used to specify an APIC
			driver name.
			Format: apic=driver_name
			Examples: apic=bigsmp

	apic_extnmi=	[APIC,X86,EARLY] External NMI delivery setting
			Format: { bsp (default) | all | none }
+4 −16
Original line number Diff line number Diff line
@@ -531,12 +531,6 @@ config X86_FRED
	  ring transitions and exception/interrupt handling if the
	  system supports it.

config X86_BIGSMP
	bool "Support for big SMP systems with more than 8 CPUs"
	depends on SMP && X86_32
	help
	  This option is needed for the systems that have more than 8 CPUs.

config X86_EXTENDED_PLATFORM
	bool "Support for extended (non-PC) x86 platforms"
	default y
@@ -735,8 +729,8 @@ config X86_32_NON_STANDARD
	depends on X86_32 && SMP
	depends on X86_EXTENDED_PLATFORM
	help
	  This option compiles in the bigsmp and STA2X11 default
	  subarchitectures.  It is intended for a generic binary
	  This option compiles in the STA2X11 default
	  subarchitecture.  It is intended for a generic binary
	  kernel. If you select them all, kernel will probe it one by
	  one and will fallback to default.

@@ -1013,8 +1007,7 @@ config NR_CPUS_RANGE_BEGIN
config NR_CPUS_RANGE_END
	int
	depends on X86_32
	default   64 if  SMP &&  X86_BIGSMP
	default    8 if  SMP && !X86_BIGSMP
	default    8 if  SMP
	default    1 if !SMP

config NR_CPUS_RANGE_END
@@ -1027,7 +1020,6 @@ config NR_CPUS_RANGE_END
config NR_CPUS_DEFAULT
	int
	depends on X86_32
	default   32 if  X86_BIGSMP
	default    8 if  SMP
	default    1 if !SMP

@@ -1574,8 +1566,7 @@ config AMD_MEM_ENCRYPT
config NUMA
	bool "NUMA Memory Allocation and Scheduler Support"
	depends on SMP
	depends on X86_64 || (X86_32 && HIGHMEM64G && X86_BIGSMP)
	default y if X86_BIGSMP
	depends on X86_64
	select USE_PERCPU_NUMA_NODE_ID
	select OF_NUMA if OF
	help
@@ -1588,9 +1579,6 @@ config NUMA
	  For 64-bit this is recommended if the system is Intel Core i7
	  (or later), AMD Opteron, or EM64T NUMA.

	  For 32-bit this is only needed if you boot a 32-bit
	  kernel on a 64-bit NUMA platform.

	  Otherwise, you should say N.

config AMD_NUMA
+0 −3
Original line number Diff line number Diff line
@@ -23,8 +23,5 @@ obj-$(CONFIG_X86_X2APIC) += x2apic_cluster.o
obj-y				+= apic_flat_64.o
endif

# APIC probe will depend on the listing order here
obj-$(CONFIG_X86_BIGSMP)	+= bigsmp_32.o

# For 32bit, probe_32 need to be listed last
obj-$(CONFIG_X86_LOCAL_APIC)	+= probe_$(BITS).o
+0 −3
Original line number Diff line number Diff line
@@ -1371,8 +1371,6 @@ void __init apic_intr_mode_init(void)

	x86_64_probe_apic();

	x86_32_install_bigsmp();

	if (x86_platform.apic_post_init)
		x86_platform.apic_post_init();

@@ -1674,7 +1672,6 @@ static __init void apic_read_boot_cpu_id(bool x2apic)
		boot_cpu_apic_version = GET_APIC_VERSION(apic_read(APIC_LVR));
	}
	topology_register_boot_apic(boot_cpu_physical_apicid);
	x86_32_probe_bigsmp_early();
}

#ifdef CONFIG_X86_X2APIC

arch/x86/kernel/apic/bigsmp_32.c

deleted100644 → 0
+0 −105
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
/*
 * APIC driver for "bigsmp" xAPIC machines with more than 8 virtual CPUs.
 *
 * Drives the local APIC in "clustered mode".
 */
#include <linux/cpumask.h>
#include <linux/dmi.h>
#include <linux/smp.h>

#include <asm/apic.h>
#include <asm/io_apic.h>

#include "local.h"

static u32 bigsmp_get_apic_id(u32 x)
{
	return (x >> 24) & 0xFF;
}

static void bigsmp_send_IPI_allbutself(int vector)
{
	default_send_IPI_mask_allbutself_phys(cpu_online_mask, vector);
}

static void bigsmp_send_IPI_all(int vector)
{
	default_send_IPI_mask_sequence_phys(cpu_online_mask, vector);
}

static int dmi_bigsmp; /* can be set by dmi scanners */

static int hp_ht_bigsmp(const struct dmi_system_id *d)
{
	printk(KERN_NOTICE "%s detected: force use of apic=bigsmp\n", d->ident);
	dmi_bigsmp = 1;

	return 0;
}


static const struct dmi_system_id bigsmp_dmi_table[] = {
	{ hp_ht_bigsmp, "HP ProLiant DL760 G2",
		{	DMI_MATCH(DMI_BIOS_VENDOR, "HP"),
			DMI_MATCH(DMI_BIOS_VERSION, "P44-"),
		}
	},

	{ hp_ht_bigsmp, "HP ProLiant DL740",
		{	DMI_MATCH(DMI_BIOS_VENDOR, "HP"),
			DMI_MATCH(DMI_BIOS_VERSION, "P47-"),
		}
	},
	{ } /* NULL entry stops DMI scanning */
};

static int probe_bigsmp(void)
{
	return dmi_check_system(bigsmp_dmi_table);
}

static struct apic apic_bigsmp __ro_after_init = {

	.name				= "bigsmp",
	.probe				= probe_bigsmp,

	.dest_mode_logical		= false,

	.disable_esr			= 1,

	.cpu_present_to_apicid		= default_cpu_present_to_apicid,

	.max_apic_id			= 0xFE,
	.get_apic_id			= bigsmp_get_apic_id,

	.calc_dest_apicid		= apic_default_calc_apicid,

	.send_IPI			= default_send_IPI_single_phys,
	.send_IPI_mask			= default_send_IPI_mask_sequence_phys,
	.send_IPI_mask_allbutself	= NULL,
	.send_IPI_allbutself		= bigsmp_send_IPI_allbutself,
	.send_IPI_all			= bigsmp_send_IPI_all,
	.send_IPI_self			= default_send_IPI_self,

	.read				= native_apic_mem_read,
	.write				= native_apic_mem_write,
	.eoi				= native_apic_mem_eoi,
	.icr_read			= native_apic_icr_read,
	.icr_write			= native_apic_icr_write,
	.wait_icr_idle			= apic_mem_wait_icr_idle,
	.safe_wait_icr_idle		= apic_mem_wait_icr_idle_timeout,
};

bool __init apic_bigsmp_possible(bool cmdline_override)
{
	return apic == &apic_bigsmp || !cmdline_override;
}

void __init apic_bigsmp_force(void)
{
	if (apic != &apic_bigsmp)
		apic_install_driver(&apic_bigsmp);
}

apic_driver(apic_bigsmp);
Loading