lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 762/917] io-wq: fix max-workers not correctly set on multi-node system
    Date
    From: Beld Zhang <beldzhang@gmail.com>

    [ Upstream commit 71c9ce27bb57c59d8d7f5298e730c8096eef3d1f ]

    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: 2e480058ddc2 ("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>
    ---
    fs/io-wq.c | 16 +++++++++++++---
    1 file changed, 13 insertions(+), 3 deletions(-)

    diff --git a/fs/io-wq.c b/fs/io-wq.c
    index 5d189b24a8d4b..8c61315657546 100644
    --- a/fs/io-wq.c
    +++ b/fs/io-wq.c
    @@ -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);
    @@ -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];
    @@ -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;
    }

    --
    2.33.0


    \
     
     \ /
      Last update: 2021-11-16 01:10    [W:4.031 / U:0.116 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site