Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 26 May 2014 08:52:13 +0000 (UTC)
From:      Attilio Rao <attilio@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r266682 - projects/numa/sys/vm
Message-ID:  <201405260852.s4Q8qDvJ085393@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: attilio
Date: Mon May 26 08:52:13 2014
New Revision: 266682
URL: http://svnweb.freebsd.org/changeset/base/266682

Log:
  - Don't force FT for UMA zones, but allow a method to specify an
    allocation/free policy via selectors and a new zone-specific method.
  - Avoid to select invalid domains for UMA but use the selectors knowledge
  
  Reviewed by:	jeff

Modified:
  projects/numa/sys/vm/uma.h
  projects/numa/sys/vm/uma_core.c
  projects/numa/sys/vm/uma_int.h

Modified: projects/numa/sys/vm/uma.h
==============================================================================
--- projects/numa/sys/vm/uma.h	Mon May 26 08:29:56 2014	(r266681)
+++ projects/numa/sys/vm/uma.h	Mon May 26 08:52:13 2014	(r266682)
@@ -45,6 +45,7 @@
 /* Types and type defs */
 
 struct uma_zone;
+struct vm_domain_select;
 /* Opaque type used as a handle to the zone */
 typedef struct uma_zone * uma_zone_t;
 
@@ -280,11 +281,6 @@ uma_zone_t uma_zcache_create(char *name,
 					 * Allocates mp_ncpus slabs sized to
 					 * sizeof(struct pcpu).
 					 */
-#define	UMA_ZONE_NUMA		0x10000	/*
-					 * Zone is NUMA aware.  Implements
-					 * a best effort first-touch
-					 * allocation policy.
-					 */
 
 /*
  * These flags are shared between the keg and zone.  In zones wishing to add
@@ -585,6 +581,19 @@ void uma_zone_set_allocf(uma_zone_t zone
 void uma_zone_set_freef(uma_zone_t zone, uma_free freef);
 
 /*
+ * XXX
+ *
+ * Arguments:
+ *	zone   	The zone NUMA policy is being installed.
+ *	sel	Selector of the NUMA policy requested. 
+ *
+ * Returns:
+ *	Nothing
+ */
+void uma_zone_set_domain_selector(uma_zone_t zone,
+    struct vm_domain_select *sel);
+
+/*
  * These flags are setable in the allocf and visible in the freef.
  */
 #define UMA_SLAB_BOOT	0x01		/* Slab alloced from boot pages */

Modified: projects/numa/sys/vm/uma_core.c
==============================================================================
--- projects/numa/sys/vm/uma_core.c	Mon May 26 08:29:56 2014	(r266681)
+++ projects/numa/sys/vm/uma_core.c	Mon May 26 08:52:13 2014	(r266682)
@@ -80,6 +80,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/vmmeter.h>
 
 #include <vm/vm.h>
+#include <vm/vm_domain.h>
 #include <vm/vm_object.h>
 #include <vm/vm_page.h>
 #include <vm/vm_pageout.h>
@@ -312,7 +313,8 @@ bucket_init(void)
 		size += sizeof(void *) * ubz->ubz_entries;
 		ubz->ubz_zone = uma_zcreate(ubz->ubz_name, size,
 		    NULL, NULL, NULL, NULL, UMA_ALIGN_PTR,
-		    UMA_ZONE_MTXCLASS | UMA_ZFLAG_BUCKET | UMA_ZONE_NUMA);
+		    UMA_ZONE_MTXCLASS | UMA_ZFLAG_BUCKET);
+		uma_zone_set_domain_selector(ubz->ubz_zone, &vm_sel_ft);
 	}
 }
 
@@ -715,10 +717,10 @@ cache_drain_safe_cpu(uma_zone_t zone)
 
 	ZONE_LOCK(zone);
 	critical_enter();
-	if (zone->uz_flags & UMA_ZONE_NUMA)
-		domain = PCPU_GET(domain);
-	else
+	if (zone->uz_sel == NULL)
 		domain = 0;
+	else
+		domain = vm_domain_select_first(zone->uz_sel);
 	cache = &zone->uz_cpu[curcpu];
 	if (cache->uc_allocbucket) {
 		if (cache->uc_allocbucket->ub_cnt != 0)
@@ -1605,6 +1607,7 @@ zone_ctor(void *mem, int size, void *uda
 	zone->uz_sleeps = 0;
 	zone->uz_count = 0;
 	zone->uz_count_min = 0;
+	zone->uz_sel = NULL;
 	zone->uz_flags = 0;
 	zone->uz_warning = NULL;
 	timevalclear(&zone->uz_ratecheck);
@@ -2268,13 +2271,12 @@ zalloc_start:
 		goto zalloc_start;
 	}
 
-	/* Get the domain according to zone flags. */
-	if (zone->uz_flags & UMA_ZONE_NUMA) {
-		domain = PCPU_GET(domain);
-		zdom = &zone->uz_domain[domain];
-	} else {
+	if (zone->uz_sel == NULL) {
 		domain = UMA_ANYDOMAIN; 
 		zdom = &zone->uz_domain[0];
+	} else {
+		domain = vm_domain_select_first(zone->uz_sel);
+		zdom = &zone->uz_domain[domain];
 	}
 
 	/*
@@ -2835,13 +2837,12 @@ zfree_start:
 	}
 	cache->uc_freebucket = NULL;
 
-	/* Get the domain according to zone flags. */
-	if (zone->uz_flags & UMA_ZONE_NUMA) {
-		domain = PCPU_GET(domain);
-		zdom = &zone->uz_domain[domain];
-	} else {
+	if (zone->uz_sel == NULL) {
 		zdom = &zone->uz_domain[0];
 		domain = UMA_ANYDOMAIN;
+	} else {
+		domain = vm_domain_select_first(zone->uz_sel);
+		zdom = &zone->uz_domain[domain];
 	}
 
 	/* Can we throw this on the zone full list? */
@@ -3166,6 +3167,16 @@ uma_zone_set_allocf(uma_zone_t zone, uma
 
 /* See uma.h */
 void
+uma_zone_set_domain_selector(uma_zone_t zone, struct vm_domain_select *sel)
+{
+
+	ZONE_LOCK(zone);
+	zone->uz_sel = sel;
+	ZONE_UNLOCK(zone);
+}
+
+/* See uma.h */
+void
 uma_zone_reserve(uma_zone_t zone, int items)
 {
 	uma_keg_t keg;

Modified: projects/numa/sys/vm/uma_int.h
==============================================================================
--- projects/numa/sys/vm/uma_int.h	Mon May 26 08:29:56 2014	(r266681)
+++ projects/numa/sys/vm/uma_int.h	Mon May 26 08:52:13 2014	(r266682)
@@ -312,6 +312,8 @@ struct uma_zone_domain {
 
 typedef struct uma_zone_domain * uma_zone_domain_t;
 
+struct vm_domain_select;
+
 /*
  * Zone management structure 
  *
@@ -347,6 +349,7 @@ struct uma_zone {
 	uint64_t	uz_sleeps;	/* Total number of alloc sleeps */
 	uint16_t	uz_count;	/* Amount of items in full bucket */
 	uint16_t	uz_count_min;	/* Minimal amount of items there */
+	struct vm_domain_select	*uz_sel;	/* Domain memory selector. */
 
 	/* The next three fields are used to print a rate-limited warnings. */
 	const char	*uz_warning;	/* Warning to print on failure */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201405260852.s4Q8qDvJ085393>