Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages


home | help
SMP(4)		       FreeBSD Kernel Interfaces Manual			SMP(4)

     SMP -- description	of the FreeBSD Symmetric Multi-Processor kernel

     options SMP

     The SMP kernel implements symmetric multi-processor support.

     SMP support can be	disabled by setting the	loader tunable
     kern.smp.disabled to 1.

     The number	of CPUs	detected by the	system is available in the read-only
     sysctl variable hw.ncpu.

     The number	of online threads per CPU core is available in the read-only
     sysctl variable kern.smp.threads_per_core.	 The number of physical	CPU
     cores detected by the system is available in the read-only	sysctl vari-
     able kern.smp.cores.

     FreeBSD allows specific CPUs on a multi-processor system to be disabled.
     This can be done using the	hint.lapic.X.disabled tunable, where X is the
     APIC ID of	a CPU.	Setting	this tunable to	1 will result in the corre-
     sponding CPU being	disabled.

     FreeBSD supports simultaneous multithreading on x86 and powerpc plat-
     forms.  On	x86, the logical CPUs can be disabled by setting the
     machdep.hyperthreading_allowed tunable to zero.

     The sched_ule(4) scheduler	implements CPU topology	detection and adjusts
     the scheduling algorithms to make better use of modern multi-core CPUs.
     The sysctl	variable kern.sched.topology_spec reflects the detected	CPU
     hardware in a parsable XML	format.	 The top level XML tag is <groups>,
     which encloses one	or more	<group>	tags containing	data about individual
     CPU groups.  A CPU	group contains CPUs that are detected to be "close"
     together, usually by being	cores in a single multi-core processor.	 At-
     tributes available	in a <group> tag are "level", corresponding to the
     nesting level of the CPU group and	"cache-level", corresponding to	the
     level of CPU caches shared	by the CPUs in the group.  The <group> tag
     contains the <cpu>	and <flags> tags.  The <cpu> tag describes CPUs	in the
     group.  Its attributes are	"count", corresponding to the number of	CPUs
     in	the group and "mask", corresponding to the integer binary mask in
     which each	bit position set to 1 signifies	a CPU belonging	to the group.
     The contents (CDATA) of the <cpu> tag is the comma-delimited list of CPU
     indexes (derived from the "mask" attribute).  The <flags> tag contains
     special tags (if any) describing the relation of the CPUs in the group.
     The possible flags	are currently "HTT" and	"SMT", corresponding to	the
     various implementations of	hardware multithreading.  An example topol-
     ogy_spec output for a system consisting of	two quad-core processors is:

       <group level="1"	cache-level="0">
	 <cpu count="8"	mask="0xff">0, 1, 2, 3,	4, 5, 6, 7</cpu>
	   <group level="2" cache-level="0">
	     <cpu count="4" mask="0xf">0, 1, 2,	3</cpu>
	   <group level="2" cache-level="0">
	     <cpu count="4" mask="0xf0">4, 5, 6, 7</cpu>

     This information is used internally by the	kernel to schedule related
     tasks on CPUs that	are closely grouped together.

     Support for multi-processor systems is present for	all Tier-1 and Tier-2
     architectures on FreeBSD.	Currently, this	includes x86, powerpc, mips,
     arm and arm64.  Support is	enabled	using options SMP.  It is permissible
     to	use the	SMP kernel configuration on non-SMP hardware.

     For i386 systems, the SMP kernel supports motherboards that follow	the
     Intel MP specification, version 1.4.  In addition to options SMP, i386
     also requires device apic.	 The mptable(1)	command	may be used to view
     the status	of multi-processor support.

     cpuset(1),	mptable(1), sched_4bsd(4), sched_ule(4), loader(8), sysctl(8),
     condvar(9), msleep(9), mtx_pool(9), mutex(9), rwlock(9), sema(9), sx(9)

     The SMP kernel's early history is not (properly) recorded.	 It was	devel-
     oped in a separate	CVS branch until April 26, 1997, at which point	it was
     merged into 3.0-current.  By this date 3.0-current	had already been
     merged with Lite2 kernel code.

     FreeBSD 5.0 introduced support for	a host of new synchronization primi-
     tives, and	a move towards fine-grained kernel locking rather than re-
     liance on a Giant kernel lock.  The SMPng Project relied heavily on the
     support of	BSDi, who provided reference source code from the fine-grained
     SMP implementation	found in BSD/OS.

     FreeBSD 5.0 also introduced support for SMP on the	sparc64	architecture.

     Steve Passe <>

     The kern.smp.threads_per_core and kern.smp.cores sysctl variables are
     provided as a best-effort guess.  If an architecture or platform adds SMT
     and FreeBSD has not yet implemented detection, the	reported values	may be
     inaccurate.  In this case,	kern.smp.threads_per_core will report 1	and
     kern.smp.cores will report	the same value as hw.ncpu.

FreeBSD	13.0			January	4, 2019			  FreeBSD 13.0


Want to link to this manual page? Use this URL:

home | help