Add basic support for TASKQ_THREADS_CPU_PCT taskq flag which is

used to scale the number of threads based on the number of online
CPUs.  As CPUs are added/removed we should rescale the thread
count appropriately, but currently this is only done at create.
This commit is contained in:
Brian Behlendorf 2009-07-09 10:07:52 -07:00
parent aaad2f7226
commit 915404bd50
2 changed files with 10 additions and 0 deletions

View File

@ -44,6 +44,7 @@ extern "C" {
#define TASKQ_PREPOPULATE 0x00000001 #define TASKQ_PREPOPULATE 0x00000001
#define TASKQ_CPR_SAFE 0x00000002 #define TASKQ_CPR_SAFE 0x00000002
#define TASKQ_DYNAMIC 0x00000004 #define TASKQ_DYNAMIC 0x00000004
#define TASKQ_THREADS_CPU_PCT 0x00000008
typedef unsigned long taskqid_t; typedef unsigned long taskqid_t;
typedef void (task_func_t)(void *); typedef void (task_func_t)(void *);

View File

@ -375,6 +375,15 @@ __taskq_create(const char *name, int nthreads, pri_t pri,
ASSERT(maxalloc <= INT_MAX); ASSERT(maxalloc <= INT_MAX);
ASSERT(!(flags & (TASKQ_CPR_SAFE | TASKQ_DYNAMIC))); /* Unsupported */ ASSERT(!(flags & (TASKQ_CPR_SAFE | TASKQ_DYNAMIC))); /* Unsupported */
/* Scale the number of threads using nthreads as a percentage */
if (flags & TASKQ_THREADS_CPU_PCT) {
ASSERT(nthreads <= 100);
ASSERT(nthreads >= 0);
nthreads = MIN(nthreads, 100);
nthreads = MAX(nthreads, 0);
nthreads = MAX((num_online_cpus() * nthreads) / 100, 1);
}
tq = kmem_alloc(sizeof(*tq), KM_SLEEP); tq = kmem_alloc(sizeof(*tq), KM_SLEEP);
if (tq == NULL) if (tq == NULL)
RETURN(NULL); RETURN(NULL);