Evenly distribute the taskq threads across available CPUs
The problem is described in commit aeeb4e0c0a
.
However, instead of disabling the binding to CPU altogether we just keep the
last CPU index across calls to taskq_create() and thus achieve even
distribution of the taskq threads across all available CPUs.
The implementation based on assumption that task queues initialization
performed in serial manner.
Signed-off-by: Andrey Vesnovaty <andrey.vesnovaty@gmail.com>
Signed-off-by: Andrey Vesnovaty <andreyv@infinidat.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #336
This commit is contained in:
parent
ae16ed992b
commit
703371d8c7
|
@ -124,3 +124,15 @@ Spin a maximum of N times to acquire lock
|
|||
.sp
|
||||
.ne -4
|
||||
Default value: \fB0\fR.
|
||||
.RE
|
||||
|
||||
.sp
|
||||
.ne 2
|
||||
.na
|
||||
\fBspl_taskq_thread_bind\fR (int)
|
||||
.ad
|
||||
.RS 12n
|
||||
Bind taskq thread to CPU
|
||||
.sp
|
||||
Default value: \fB0\fR.
|
||||
.RE
|
||||
|
|
|
@ -34,6 +34,10 @@
|
|||
|
||||
#define SS_DEBUG_SUBSYS SS_TASKQ
|
||||
|
||||
int spl_taskq_thread_bind = 0;
|
||||
module_param(spl_taskq_thread_bind, int, 0644);
|
||||
MODULE_PARM_DESC(spl_taskq_thread_bind, "Bind taskq thread to CPU by default");
|
||||
|
||||
/* Global system-wide dynamic task queue available for all consumers */
|
||||
taskq_t *system_taskq;
|
||||
EXPORT_SYMBOL(system_taskq);
|
||||
|
@ -781,6 +785,7 @@ taskq_t *
|
|||
taskq_create(const char *name, int nthreads, pri_t pri,
|
||||
int minalloc, int maxalloc, uint_t flags)
|
||||
{
|
||||
static int last_used_cpu = 0;
|
||||
taskq_t *tq;
|
||||
taskq_thread_t *tqt;
|
||||
int rc = 0, i, j = 0;
|
||||
|
@ -843,6 +848,10 @@ taskq_create(const char *name, int nthreads, pri_t pri,
|
|||
"%s/%d", name, i);
|
||||
if (tqt->tqt_thread) {
|
||||
list_add(&tqt->tqt_thread_list, &tq->tq_thread_list);
|
||||
if (spl_taskq_thread_bind) {
|
||||
last_used_cpu = (last_used_cpu + 1) % num_online_cpus();
|
||||
kthread_bind(tqt->tqt_thread, last_used_cpu);
|
||||
}
|
||||
set_user_nice(tqt->tqt_thread, PRIO_TO_NICE(pri));
|
||||
wake_up_process(tqt->tqt_thread);
|
||||
j++;
|
||||
|
|
Loading…
Reference in New Issue