svn commit: r278879 - in head/sys: kern sys

Adrian Chadd adrian at FreeBSD.org
Tue Feb 17 02:35:07 UTC 2015


Author: adrian
Date: Tue Feb 17 02:35:06 2015
New Revision: 278879
URL: https://svnweb.freebsd.org/changeset/base/278879

Log:
  Implement taskqueue_start_threads_cpuset().
  
  This is a more generic version of taskqueue_start_threads_pinned()
  which only supports a single cpuid.
  
  This originally came from John Baldwin <jhb@> who implemented it
  as part of a push towards NUMA awareness in drivers.  I started implementing
  something similar for RSS and NUMA, then found he already did it.
  
  I'd like to axe taskqueue_start_threads_pinned() so it doesn't become
  part of a longer-term API.  (Read: hps@ wants to MFC things, and
  if I don't do this soon, he'll MFC what's here. :-)
  
  I have a follow-up commit which converts the intel drivers over
  to using the cpuset version of this function, so we can eventually
  nuke the the pinned version.
  
  Tested:
  
  * igb, ixgbe
  
  Obtained from:	jhbbsd

Modified:
  head/sys/kern/subr_taskqueue.c
  head/sys/sys/taskqueue.h

Modified: head/sys/kern/subr_taskqueue.c
==============================================================================
--- head/sys/kern/subr_taskqueue.c	Tue Feb 17 01:45:38 2015	(r278878)
+++ head/sys/kern/subr_taskqueue.c	Tue Feb 17 02:35:06 2015	(r278879)
@@ -571,8 +571,9 @@ taskqueue_swi_giant_run(void *dummy)
 
 static int
 _taskqueue_start_threads(struct taskqueue **tqp, int count, int pri,
-    cpuset_t *mask, const char *ktname)
+    cpuset_t *mask, const char *name, va_list ap)
 {
+	char ktname[MAXCOMLEN + 1];
 	struct thread *td;
 	struct taskqueue *tq;
 	int i, error;
@@ -580,6 +581,7 @@ _taskqueue_start_threads(struct taskqueu
 	if (count <= 0)
 		return (EINVAL);
 
+	vsnprintf(ktname, sizeof(ktname), name, ap);
 	tq = *tqp;
 
 	tq->tq_threads = malloc(sizeof(struct thread *) * count, M_TASKQUEUE,
@@ -635,27 +637,35 @@ int
 taskqueue_start_threads(struct taskqueue **tqp, int count, int pri,
     const char *name, ...)
 {
-	char ktname[MAXCOMLEN + 1];
 	va_list ap;
+	int error;
 
 	va_start(ap, name);
-	vsnprintf(ktname, sizeof(ktname), name, ap);
+	error = _taskqueue_start_threads(tqp, count, pri, NULL, name, ap);
 	va_end(ap);
-
-	return (_taskqueue_start_threads(tqp, count, pri, NULL, ktname));
+	return (error);
 }
 
 int
-taskqueue_start_threads_pinned(struct taskqueue **tqp, int count, int pri,
-    int cpu_id, const char *name, ...)
+taskqueue_start_threads_cpuset(struct taskqueue **tqp, int count, int pri,
+    cpuset_t *mask, const char *name, ...)
 {
-	char ktname[MAXCOMLEN + 1];
 	va_list ap;
-	cpuset_t mask;
+	int error;
 
 	va_start(ap, name);
-	vsnprintf(ktname, sizeof(ktname), name, ap);
+	error = _taskqueue_start_threads(tqp, count, pri, mask, name, ap);
 	va_end(ap);
+	return (error);
+}
+
+int
+taskqueue_start_threads_pinned(struct taskqueue **tqp, int count, int pri,
+    int cpu_id, const char *name, ...)
+{
+	cpuset_t mask;
+	va_list ap;
+	int error;
 
 	/*
 	 * In case someone passes in NOCPU, just fall back to the
@@ -666,8 +676,11 @@ taskqueue_start_threads_pinned(struct ta
 		CPU_SET(cpu_id, &mask);
 	}
 
-	return (_taskqueue_start_threads(tqp, count, pri,
-	    cpu_id == NOCPU ? NULL : &mask, ktname));
+	va_start(ap, name);
+	error = _taskqueue_start_threads(tqp, count, pri,
+	    cpu_id == NOCPU ? NULL : &mask, name, ap);
+	va_end(ap);
+	return (error);
 }
 
 static inline void

Modified: head/sys/sys/taskqueue.h
==============================================================================
--- head/sys/sys/taskqueue.h	Tue Feb 17 01:45:38 2015	(r278878)
+++ head/sys/sys/taskqueue.h	Tue Feb 17 02:35:06 2015	(r278879)
@@ -36,6 +36,7 @@
 #include <sys/queue.h>
 #include <sys/_task.h>
 #include <sys/_callout.h>
+#include <sys/_cpuset.h>
 
 struct taskqueue;
 struct thread;
@@ -71,6 +72,8 @@ struct taskqueue *taskqueue_create(const
 				    void *context);
 int	taskqueue_start_threads(struct taskqueue **tqp, int count, int pri,
 				const char *name, ...) __printflike(4, 5);
+int	taskqueue_start_threads_cpuset(struct taskqueue **tqp, int count,
+	    int pri, cpuset_t *mask, const char *name, ...) __printflike(5, 6);
 int	taskqueue_start_threads_pinned(struct taskqueue **tqp, int count,
 				    int pri, int cpu_id, const char *name,
 				    ...) __printflike(5, 6);


More information about the svn-src-head mailing list