svn commit: r339939 - in stable/12: share/man/man9 sys/kern sys/sys sys/vm sys/x86/acpica
Mark Johnston
markj at FreeBSD.org
Wed Oct 31 02:02:15 UTC 2018
Author: markj
Date: Wed Oct 31 02:02:12 2018
New Revision: 339939
URL: https://svnweb.freebsd.org/changeset/base/339939
Log:
MFC r339452, r339664:
Create some global domainsets and refactor NUMA registration.
Approved by: re (kib)
Modified:
stable/12/share/man/man9/domainset.9
stable/12/sys/kern/kern_cpuset.c
stable/12/sys/sys/domainset.h
stable/12/sys/vm/vm_init.c
stable/12/sys/vm/vm_phys.c
stable/12/sys/vm/vm_phys.h
stable/12/sys/x86/acpica/srat.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/share/man/man9/domainset.9
==============================================================================
--- stable/12/share/man/man9/domainset.9 Wed Oct 31 02:01:28 2018 (r339938)
+++ stable/12/share/man/man9/domainset.9 Wed Oct 31 02:02:12 2018 (r339939)
@@ -24,14 +24,11 @@
.\"
.\" $FreeBSD$
.\"
-.Dd March 24, 2018
+.Dd October 20, 2018
.Dt DOMAINSET 9
.Os
.Sh NAME
.Nm domainset(9)
-\(em
-.Nm domainset_create ,
-.Nm sysctl_handle_domainset .
.Nd domainset functions and operation
.Sh SYNOPSIS
.In sys/_domainset.h
@@ -46,6 +43,8 @@ struct domainset {
};
.Ed
.Pp
+.Fn DOMAINSET_RR
+.Fn DOMAINSET_PREF domain
.Ft struct domainset *
.Fn domainset_create "const struct domainset *key"
.Ft int
@@ -98,6 +97,12 @@ This gives good distribution among memory domains whil
efficiency higher and is preferential to round-robin for general use.
.El
.Pp
+The
+.Fn DOMAINSET_RR
+and
+.Fn DOMAINSET_PREF
+provide pointers to global pre-defined policies for use when the
+desired policy is known at compile time.
The
.Fn domainset_create
function takes a partially filled in domainset as a key and returns a
Modified: stable/12/sys/kern/kern_cpuset.c
==============================================================================
--- stable/12/sys/kern/kern_cpuset.c Wed Oct 31 02:01:28 2018 (r339938)
+++ stable/12/sys/kern/kern_cpuset.c Wed Oct 31 02:02:12 2018 (r339939)
@@ -119,6 +119,8 @@ __FBSDID("$FreeBSD$");
*/
LIST_HEAD(domainlist, domainset);
+struct domainset __read_mostly domainset_prefer[MAXMEMDOM];
+struct domainset __read_mostly domainset_roundrobin;
static uma_zone_t cpuset_zone;
static uma_zone_t domainset_zone;
@@ -1369,28 +1371,53 @@ cpuset_setithread(lwpid_t id, int cpu)
}
/*
+ * Initialize static domainsets after NUMA information is available. This is
+ * called very early during boot.
+ */
+void
+domainset_init(void)
+{
+ struct domainset *dset;
+ int i;
+
+ dset = &domainset_roundrobin;
+ DOMAINSET_COPY(&all_domains, &dset->ds_mask);
+ dset->ds_policy = DOMAINSET_POLICY_ROUNDROBIN;
+ dset->ds_prefer = -1;
+ _domainset_create(dset, NULL);
+
+ for (i = 0; i < vm_ndomains; i++) {
+ dset = &domainset_prefer[i];
+ DOMAINSET_COPY(&all_domains, &dset->ds_mask);
+ dset->ds_policy = DOMAINSET_POLICY_PREFER;
+ dset->ds_prefer = i;
+ _domainset_create(dset, NULL);
+ }
+}
+
+/*
* Create the domainset for cpuset 0, 1 and cpuset 2.
*/
void
domainset_zero(void)
{
struct domainset *dset;
- int i;
mtx_init(&cpuset_lock, "cpuset", NULL, MTX_SPIN | MTX_RECURSE);
dset = &domainset0;
- DOMAINSET_ZERO(&dset->ds_mask);
- for (i = 0; i < vm_ndomains; i++)
- DOMAINSET_SET(i, &dset->ds_mask);
+ DOMAINSET_COPY(&all_domains, &dset->ds_mask);
dset->ds_policy = DOMAINSET_POLICY_FIRSTTOUCH;
dset->ds_prefer = -1;
- (void)domainset_empty_vm(dset);
curthread->td_domain.dr_policy = _domainset_create(dset, NULL);
domainset_copy(dset, &domainset2);
domainset2.ds_policy = DOMAINSET_POLICY_INTERLEAVE;
kernel_object->domain.dr_policy = _domainset_create(&domainset2, NULL);
+
+ /* Remove empty domains from the global policies. */
+ LIST_FOREACH(dset, &cpuset_domains, ds_link)
+ (void)domainset_empty_vm(dset);
}
/*
Modified: stable/12/sys/sys/domainset.h
==============================================================================
--- stable/12/sys/sys/domainset.h Wed Oct 31 02:01:28 2018 (r339938)
+++ stable/12/sys/sys/domainset.h Wed Oct 31 02:02:12 2018 (r339939)
@@ -32,8 +32,8 @@
#define _SYS_DOMAINSET_H_
#include <sys/_domainset.h>
-
#include <sys/bitset.h>
+#include <sys/queue.h>
#define _NDOMAINSETBITS _BITSET_BITS
#define _NDOMAINSETWORDS __bitset_words(DOMAINSET_SETSIZE)
@@ -96,6 +96,12 @@ struct domainset {
domainid_t ds_order[MAXMEMDOM]; /* nth domain table. */
};
+extern struct domainset domainset_prefer[MAXMEMDOM];
+#define DOMAINSET_PREF(domain) (&domainset_prefer[(domain)])
+extern struct domainset domainset_roundrobin;
+#define DOMAINSET_RR() (&domainset_roundrobin)
+
+void domainset_init(void);
void domainset_zero(void);
/*
Modified: stable/12/sys/vm/vm_init.c
==============================================================================
--- stable/12/sys/vm/vm_init.c Wed Oct 31 02:01:28 2018 (r339938)
+++ stable/12/sys/vm/vm_init.c Wed Oct 31 02:02:12 2018 (r339939)
@@ -68,6 +68,7 @@
__FBSDID("$FreeBSD$");
#include <sys/param.h>
+#include <sys/domainset.h>
#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/proc.h>
@@ -115,6 +116,11 @@ SYSINIT(vm_mem, SI_SUB_VM, SI_ORDER_FIRST, vm_mem_init
static void
vm_mem_init(void *dummy)
{
+
+ /*
+ * Initialize static domainsets, used by various allocators.
+ */
+ domainset_init();
/*
* Initializes resident memory structures. From here on, all physical
Modified: stable/12/sys/vm/vm_phys.c
==============================================================================
--- stable/12/sys/vm/vm_phys.c Wed Oct 31 02:01:28 2018 (r339938)
+++ stable/12/sys/vm/vm_phys.c Wed Oct 31 02:02:12 2018 (r339939)
@@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
+#include <sys/domainset.h>
#include <sys/lock.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
@@ -584,6 +585,31 @@ vm_phys_init(void)
}
rw_init(&vm_phys_fictitious_reg_lock, "vmfctr");
+}
+
+/*
+ * Register info about the NUMA topology of the system.
+ *
+ * Invoked by platform-dependent code prior to vm_phys_init().
+ */
+void
+vm_phys_register_domains(int ndomains, struct mem_affinity *affinity,
+ int *locality)
+{
+#ifdef NUMA
+ int i;
+
+ vm_ndomains = ndomains;
+ mem_affinity = affinity;
+ mem_locality = locality;
+
+ for (i = 0; i < vm_ndomains; i++)
+ DOMAINSET_SET(i, &all_domains);
+#else
+ (void)ndomains;
+ (void)affinity;
+ (void)locality;
+#endif
}
/*
Modified: stable/12/sys/vm/vm_phys.h
==============================================================================
--- stable/12/sys/vm/vm_phys.h Wed Oct 31 02:01:28 2018 (r339938)
+++ stable/12/sys/vm/vm_phys.h Wed Oct 31 02:02:12 2018 (r339939)
@@ -88,6 +88,8 @@ void vm_phys_free_contig(vm_page_t m, u_long npages);
void vm_phys_free_pages(vm_page_t m, int order);
void vm_phys_init(void);
vm_page_t vm_phys_paddr_to_vm_page(vm_paddr_t pa);
+void vm_phys_register_domains(int ndomains, struct mem_affinity *affinity,
+ int *locality);
vm_page_t vm_phys_scan_contig(int domain, u_long npages, vm_paddr_t low,
vm_paddr_t high, u_long alignment, vm_paddr_t boundary, int options);
void vm_phys_set_pool(int pool, vm_page_t m, int order);
Modified: stable/12/sys/x86/acpica/srat.c
==============================================================================
--- stable/12/sys/x86/acpica/srat.c Wed Oct 31 02:01:28 2018 (r339938)
+++ stable/12/sys/x86/acpica/srat.c Wed Oct 31 02:02:12 2018 (r339939)
@@ -153,10 +153,6 @@ parse_slit(void)
acpi_unmap_table(slit);
slit = NULL;
-#ifdef NUMA
- /* Tell the VM about it! */
- mem_locality = vm_locality_table;
-#endif
return (0);
}
@@ -481,13 +477,6 @@ parse_srat(void)
return (-1);
}
-#ifdef NUMA
- vm_ndomains = ndomain;
- for (int i = 0; i < vm_ndomains; i++)
- DOMAINSET_SET(i, &all_domains);
- mem_affinity = mem_info;
-#endif
-
return (0);
}
@@ -511,7 +500,8 @@ parse_acpi_tables(void *dummy)
if (parse_srat() < 0)
return;
init_mem_locality();
- (void) parse_slit();
+ (void)parse_slit();
+ vm_phys_register_domains(ndomain, mem_info, vm_locality_table);
}
SYSINIT(parse_acpi_tables, SI_SUB_VM - 1, SI_ORDER_FIRST, parse_acpi_tables,
NULL);
More information about the svn-src-stable
mailing list