mirror of
				https://kernel.googlesource.com/pub/scm/linux/kernel/git/stable/linux-stable.git
				synced 2025-11-04 07:44:51 +10:00 
			
		
		
		
	io-wq: fix max-workers not correctly set on multi-node system
In io-wq.c:io_wq_max_workers(), new_count[] was changed right after each
node's value was set. This caused the following node getting the setting
of the previous one.
Returned values are copied from node 0.
Fixes: 2e480058dd ("io-wq: provide a way to limit max number of workers")
Signed-off-by: Beld Zhang <beldzhang@gmail.com>
[axboe: minor fixups]
Signed-off-by: Jens Axboe <axboe@kernel.dk>
			
			
This commit is contained in:
		
							parent
							
								
									9881024aab
								
							
						
					
					
						commit
						71c9ce27bb
					
				
							
								
								
									
										16
									
								
								fs/io-wq.c
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								fs/io-wq.c
									
									
									
									
									
								
							@ -1308,7 +1308,9 @@ int io_wq_cpu_affinity(struct io_wq *wq, cpumask_var_t mask)
 | 
			
		||||
 */
 | 
			
		||||
int io_wq_max_workers(struct io_wq *wq, int *new_count)
 | 
			
		||||
{
 | 
			
		||||
	int i, node, prev = 0;
 | 
			
		||||
	int prev[IO_WQ_ACCT_NR];
 | 
			
		||||
	bool first_node = true;
 | 
			
		||||
	int i, node;
 | 
			
		||||
 | 
			
		||||
	BUILD_BUG_ON((int) IO_WQ_ACCT_BOUND   != (int) IO_WQ_BOUND);
 | 
			
		||||
	BUILD_BUG_ON((int) IO_WQ_ACCT_UNBOUND != (int) IO_WQ_UNBOUND);
 | 
			
		||||
@ -1319,6 +1321,9 @@ int io_wq_max_workers(struct io_wq *wq, int *new_count)
 | 
			
		||||
			new_count[i] = task_rlimit(current, RLIMIT_NPROC);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < IO_WQ_ACCT_NR; i++)
 | 
			
		||||
		prev[i] = 0;
 | 
			
		||||
 | 
			
		||||
	rcu_read_lock();
 | 
			
		||||
	for_each_node(node) {
 | 
			
		||||
		struct io_wqe *wqe = wq->wqes[node];
 | 
			
		||||
@ -1327,14 +1332,19 @@ int io_wq_max_workers(struct io_wq *wq, int *new_count)
 | 
			
		||||
		raw_spin_lock(&wqe->lock);
 | 
			
		||||
		for (i = 0; i < IO_WQ_ACCT_NR; i++) {
 | 
			
		||||
			acct = &wqe->acct[i];
 | 
			
		||||
			prev = max_t(int, acct->max_workers, prev);
 | 
			
		||||
			if (first_node)
 | 
			
		||||
				prev[i] = max_t(int, acct->max_workers, prev[i]);
 | 
			
		||||
			if (new_count[i])
 | 
			
		||||
				acct->max_workers = new_count[i];
 | 
			
		||||
			new_count[i] = prev;
 | 
			
		||||
		}
 | 
			
		||||
		raw_spin_unlock(&wqe->lock);
 | 
			
		||||
		first_node = false;
 | 
			
		||||
	}
 | 
			
		||||
	rcu_read_unlock();
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < IO_WQ_ACCT_NR; i++)
 | 
			
		||||
		new_count[i] = prev[i];
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user