svn commit: r339616 - in head: share/man/man4 sys/arm64/arm64 sys/kern sys/vm sys/x86/acpica
Rodney W. Grimes
freebsd at pdx.rh.CN85.dnsmgr.net
Mon Oct 22 20:36:27 UTC 2018
> Author: markj
> Date: Mon Oct 22 20:13:51 2018
> New Revision: 339616
> URL: https://svnweb.freebsd.org/changeset/base/339616
>
> Log:
> Make it possible to disable NUMA support with a tunable.
>
> This provides a chicken switch for anyone negatively impacted by
> enabling NUMA in the amd64 GENERIC kernel configuration. With
> NUMA disabled at boot-time, information about the NUMA topology
> is not exposed to the rest of the kernel, and all of physical
> memory is viewed as coming from a single domain.
>
> This method still has some performance overhead relative to disabling
> NUMA support at compile time.
>
> PR: 231460
> Reviewed by: alc, gallatin, kib
> MFC after: 1 week
> Sponsored by: The FreeBSD Foundation
> Differential Revision: https://reviews.freebsd.org/D17439
Thank you Mark.
> Modified:
> head/share/man/man4/numa.4
> head/sys/arm64/arm64/mp_machdep.c
> head/sys/kern/kern_cpuset.c
> head/sys/vm/vm_phys.c
> head/sys/x86/acpica/srat.c
>
> Modified: head/share/man/man4/numa.4
> ==============================================================================
> --- head/share/man/man4/numa.4 Mon Oct 22 20:00:43 2018 (r339615)
> +++ head/share/man/man4/numa.4 Mon Oct 22 20:13:51 2018 (r339616)
> @@ -24,18 +24,16 @@
> .\"
> .\" $FreeBSD$
> .\"
> -.Dd July 10, 2018
> +.Dd October 22, 2018
> .Dt NUMA 4
> .Os
> .Sh NAME
> .Nm NUMA
> .Nd Non-Uniform Memory Access
> .Sh SYNOPSIS
> -.Cd options SMP
> -.Cd options MAXMEMDOM=16
> +.Cd options MAXMEMDOM
> +.Cd options NUMA
> .Pp
> -.In sys/cpuset.h
> -.In sys/bus.h
> .Sh DESCRIPTION
> Non-Uniform Memory Access is a computer architecture design which
> involves unequal costs between processors, memory and IO devices
> @@ -47,14 +45,26 @@ architecture, the latency to access specific memory or
> depends upon which processor the memory or device is attached to.
> Accessing memory local to a processor is faster than accessing memory
> that is connected to one of the other processors.
> +.Fx
> +implements NUMA-aware memory allocation policies.
> +By default it attempts to ensure that allocations are balanced across
> +each domain.
> +Users may override the default domain selection policy using
> +.Xr cpuset 1 .
> .Pp
> .Nm
> -is enabled when the
> +support is enabled when the
> .Cd NUMA
> -option is used in a kernel configuration
> -file and the
> +option is specified in the kernel configuration file.
> +Each platform defines the
> .Cd MAXMEMDOM
> -option is set to a value greater than 1.
> +constant, which specifies the maximum number of supported NUMA domains.
> +This constant may be specified in the kernel configuration file.
> +.Nm
> +support can be disabled at boot time by setting the
> +.Va vm.numa.disabled
> +tunable to 1.
> +Other values for this tunable are currently ignored.
> .Pp
> Thread and process
> .Nm
> @@ -128,7 +138,7 @@ tool first appeared in
> .Fx 11.0
> and were removed in
> .Fx 12.0 .
> -Current implementation appeared in
> +The current implementation appeared in
> .Fx 12.0 .
> .Pp
> .Sh AUTHORS
>
> Modified: head/sys/arm64/arm64/mp_machdep.c
> ==============================================================================
> --- head/sys/arm64/arm64/mp_machdep.c Mon Oct 22 20:00:43 2018 (r339615)
> +++ head/sys/arm64/arm64/mp_machdep.c Mon Oct 22 20:13:51 2018 (r339616)
> @@ -576,11 +576,12 @@ cpu_init_fdt(u_int id, phandle_t node, u_int addr_size
> return (FALSE);
>
> /* Try to read the numa node of this cpu */
> - if (OF_getencprop(node, "numa-node-id", &domain, sizeof(domain)) > 0) {
> - __pcpu[id].pc_domain = domain;
> - if (domain < MAXMEMDOM)
> - CPU_SET(id, &cpuset_domain[domain]);
> - }
> + if (vm_ndomains == 1 ||
> + OF_getencprop(node, "numa-node-id", &domain, sizeof(domain)) <= 0)
> + domain = 0;
> + __pcpu[id].pc_domain = domain;
> + if (domain < MAXMEMDOM)
> + CPU_SET(id, &cpuset_domain[domain]);
>
> return (TRUE);
> }
>
> Modified: head/sys/kern/kern_cpuset.c
> ==============================================================================
> --- head/sys/kern/kern_cpuset.c Mon Oct 22 20:00:43 2018 (r339615)
> +++ head/sys/kern/kern_cpuset.c Mon Oct 22 20:13:51 2018 (r339616)
> @@ -458,6 +458,12 @@ _domainset_create(struct domainset *domain, struct dom
> struct domainset *ndomain;
> int i, j, max;
>
> + KASSERT(domain->ds_cnt <= vm_ndomains,
> + ("invalid domain count in domainset %p", domain));
> + KASSERT(domain->ds_policy != DOMAINSET_POLICY_PREFER ||
> + domain->ds_prefer < vm_ndomains,
> + ("invalid preferred domain in domains %p", domain));
> +
> mtx_lock_spin(&cpuset_lock);
> LIST_FOREACH(ndomain, &cpuset_domains, ds_link)
> if (domainset_equal(ndomain, domain))
>
> Modified: head/sys/vm/vm_phys.c
> ==============================================================================
> --- head/sys/vm/vm_phys.c Mon Oct 22 20:00:43 2018 (r339615)
> +++ head/sys/vm/vm_phys.c Mon Oct 22 20:13:51 2018 (r339616)
> @@ -597,11 +597,22 @@ vm_phys_register_domains(int ndomains, struct mem_affi
> int *locality)
> {
> #ifdef NUMA
> - int i;
> + int d, i;
>
> - vm_ndomains = ndomains;
> - mem_affinity = affinity;
> - mem_locality = locality;
> + /*
> + * For now the only override value that we support is 1, which
> + * effectively disables NUMA-awareness in the allocators.
> + */
> + d = 0;
> + TUNABLE_INT_FETCH("vm.numa.disabled", &d);
> + if (d)
> + ndomains = 1;
> +
> + if (ndomains > 1) {
> + vm_ndomains = ndomains;
> + mem_affinity = affinity;
> + mem_locality = locality;
> + }
>
> for (i = 0; i < vm_ndomains; i++)
> DOMAINSET_SET(i, &all_domains);
>
> Modified: head/sys/x86/acpica/srat.c
> ==============================================================================
> --- head/sys/x86/acpica/srat.c Mon Oct 22 20:00:43 2018 (r339615)
> +++ head/sys/x86/acpica/srat.c Mon Oct 22 20:13:51 2018 (r339616)
> @@ -535,11 +535,7 @@ srat_set_cpus(void *dummy)
> if (!cpu->enabled)
> panic("SRAT: CPU with APIC ID %u is not known",
> pc->pc_apic_id);
> -#ifdef NUMA
> - pc->pc_domain = cpu->domain;
> -#else
> - pc->pc_domain = 0;
> -#endif
> + pc->pc_domain = vm_ndomains > 1 ? cpu->domain : 0;
> CPU_SET(i, &cpuset_domain[pc->pc_domain]);
> if (bootverbose)
> printf("SRAT: CPU %u has memory domain %d\n", i,
> @@ -564,7 +560,7 @@ acpi_map_pxm_to_vm_domainid(int pxm)
>
> for (i = 0; i < ndomain; i++) {
> if (domain_pxm[i] == pxm)
> - return (i);
> + return (vm_ndomains > 1 ? i : 0);
> }
>
> return (-1);
>
>
--
Rod Grimes rgrimes at freebsd.org
More information about the svn-src-all
mailing list