• C
    bcache: improve multithreaded bch_sectors_dirty_init() · b74afd7f
    Coly Li 提交于
    mainline inclusion
    from v5.19-rc1
    commit 4dc34ae1
    category: bugfix
    bugzilla: https://gitee.com/openeuler/kernel/issues/I59A5L?from=project-issue
    CVE: N/A
    
    -------------------------------------------
    
    Commit b144e45f ("bcache: make bch_sectors_dirty_init() to be
    multithreaded") makes bch_sectors_dirty_init() to be much faster
    when counting dirty sectors by iterating all dirty keys in the btree.
    But it isn't in ideal shape yet, still can be improved.
    
    This patch does the following changes to improve current parallel dirty
    keys iteration on the btree,
    - Add read lock to root node when multiple threads iterating the btree,
      to prevent the root node gets split by I/Os from other registered
      bcache devices.
    - Remove local variable "char name[32]" and generate kernel thread name
      string directly when calling kthread_run().
    - Allocate "struct bch_dirty_init_state state" directly on stack and
      avoid the unnecessary dynamic memory allocation for it.
    - Decrease BCH_DIRTY_INIT_THRD_MAX from 64 to 12 which is enough indeed.
    - Increase &state->started to count created kernel thread after it
      succeeds to create.
    - When wait for all dirty key counting threads to finish, use
      wait_event() to replace wait_event_interruptible().
    
    With the above changes, the code is more clear, and some potential error
    conditions are avoided.
    
    Fixes: b144e45f ("bcache: make bch_sectors_dirty_init() to be multithreaded")
    Signed-off-by: NColy Li <colyli@suse.de>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20220524102336.10684-3-colyli@suse.deSigned-off-by: NJens Axboe <axboe@kernel.dk>
    Reviewed-by: NJason Yan <yanaijie@huawei.com>
    Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
    b74afd7f
writeback.c 27.5 KB