mirror of
				https://git.proxmox.com/git/mirror_zfs
				synced 2025-11-04 01:41:27 +00:00 
			
		
		
		
	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
	
	Block a user