svn commit: r333575 - in head/sys: dev/hwpmc kern

Matt Macy mmacy at FreeBSD.org
Sat May 12 20:00:30 UTC 2018


Author: mmacy
Date: Sat May 12 20:00:29 2018
New Revision: 333575
URL: https://svnweb.freebsd.org/changeset/base/333575

Log:
  hwpmc/epoch - don't reference domain if NUMA is not set
  
  It appears that domain information is set correctly independent
  of whether or not NUMA is defined. However, there is no memory
  backing secondary domains leading to allocation failure.
  
  Reported by:	pho@, np@
  Approved by:	sbruno@

Modified:
  head/sys/dev/hwpmc/hwpmc_logging.c
  head/sys/dev/hwpmc/hwpmc_mod.c
  head/sys/kern/subr_epoch.c

Modified: head/sys/dev/hwpmc/hwpmc_logging.c
==============================================================================
--- head/sys/dev/hwpmc/hwpmc_logging.c	Sat May 12 18:07:53 2018	(r333574)
+++ head/sys/dev/hwpmc/hwpmc_logging.c	Sat May 12 20:00:29 2018	(r333575)
@@ -61,6 +61,24 @@ __FBSDID("$FreeBSD$");
 #include <sys/unistd.h>
 #include <sys/vnode.h>
 
+#ifdef NUMA
+#define NDOMAINS vm_ndomains
+
+static int
+getdomain(int cpu)
+{
+	struct pcpu *pc;
+
+	pc = pcpu_find(cpu);
+	return (pc->pc_domain);
+}
+#else
+#define NDOMAINS 1
+#define malloc_domain(size, type, domain, flags) malloc((size), (type), (flags))
+#define free_domain(addr, type) free(addr, type)
+#define getdomain(cpu) 0
+#endif
+
 /*
  * Sysctl tunables
  */
@@ -1148,7 +1166,6 @@ void
 pmclog_initialize()
 {
 	int domain, cpu;
-	struct pcpu *pc;
 	struct pmclog_buffer *plb;
 
 	if (pmclog_buffer_size <= 0 || pmclog_buffer_size > 16*1024) {
@@ -1170,20 +1187,18 @@ pmclog_initialize()
 		pmc_nlogbuffers_pcpu = PMC_NLOGBUFFERS_PCPU;
 		pmclog_buffer_size = PMC_LOG_BUFFER_SIZE;
 	}
-	for (domain = 0; domain < vm_ndomains; domain++) {
+	for (domain = 0; domain < NDOMAINS; domain++) {
 		pmc_dom_hdrs[domain] = malloc_domain(sizeof(struct pmc_domain_buffer_header), M_PMC, domain,
 										M_WAITOK|M_ZERO);
 		mtx_init(&pmc_dom_hdrs[domain]->pdbh_mtx, "pmc_bufferlist_mtx", "pmc-leaf", MTX_SPIN);
 		TAILQ_INIT(&pmc_dom_hdrs[domain]->pdbh_head);
 	}
 	CPU_FOREACH(cpu) {
-		if (CPU_ABSENT(cpu))
-			continue;
-		pc = pcpu_find(cpu);
-		domain = pc->pc_domain;
+		domain = getdomain(cpu);
+		KASSERT(pmc_dom_hdrs[domain] != NULL, ("no mem allocated for domain: %d", domain));
 		pmc_dom_hdrs[domain]->pdbh_ncpus++;
 	}
-	for (domain = 0; domain < vm_ndomains; domain++) {
+	for (domain = 0; domain < NDOMAINS; domain++) {
 		int ncpus = pmc_dom_hdrs[domain]->pdbh_ncpus;
 		int total = ncpus*pmc_nlogbuffers_pcpu;
 
@@ -1215,7 +1230,7 @@ pmclog_shutdown()
 
 	mtx_destroy(&pmc_kthread_mtx);
 
-	for (domain = 0; domain < vm_ndomains; domain++) {
+	for (domain = 0; domain < NDOMAINS; domain++) {
 		mtx_destroy(&pmc_dom_hdrs[domain]->pdbh_mtx);
 		while ((plb = TAILQ_FIRST(&pmc_dom_hdrs[domain]->pdbh_head)) != NULL) {
 			TAILQ_REMOVE(&pmc_dom_hdrs[domain]->pdbh_head, plb, plb_next);

Modified: head/sys/dev/hwpmc/hwpmc_mod.c
==============================================================================
--- head/sys/dev/hwpmc/hwpmc_mod.c	Sat May 12 18:07:53 2018	(r333574)
+++ head/sys/dev/hwpmc/hwpmc_mod.c	Sat May 12 20:00:29 2018	(r333575)
@@ -76,6 +76,14 @@ __FBSDID("$FreeBSD$");
 
 #include "hwpmc_soft.h"
 
+#ifdef NUMA
+#define NDOMAINS vm_ndomains
+#else
+#define NDOMAINS 1
+#define malloc_domain(size, type, domain, flags) malloc((size), (type), (flags))
+#define free_domain(addr, type) free(addr, type)
+#endif
+
 /*
  * Types
  */

Modified: head/sys/kern/subr_epoch.c
==============================================================================
--- head/sys/kern/subr_epoch.c	Sat May 12 18:07:53 2018	(r333574)
+++ head/sys/kern/subr_epoch.c	Sat May 12 20:00:29 2018	(r333575)
@@ -119,7 +119,7 @@ static __read_mostly int inited;
 
 static void epoch_call_task(void *context);
 
-#if defined(__powerpc64__) || defined(__powerpc__)
+#if defined(__powerpc64__) || defined(__powerpc__) || !defined(NUMA)
 static bool usedomains = false;
 #else
 static bool usedomains = true;


More information about the svn-src-head mailing list