Skip to content

Commit

Permalink
io-wq: fix max-workers not correctly set on multi-node system
Browse files Browse the repository at this point in the history
[ Upstream commit 71c9ce2 ]

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: 2e48005 ("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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
beldzhang authored and gregkh committed Nov 18, 2021
1 parent e99270d commit cd63d08
Showing 1 changed file with 13 additions and 3 deletions.
16 changes: 13 additions & 3 deletions fs/io-wq.c
Expand Up @@ -1318,7 +1318,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);
Expand All @@ -1329,6 +1331,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];
Expand All @@ -1337,14 +1342,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;
}

Expand Down

0 comments on commit cd63d08

Please sign in to comment.