lkml.org 
[lkml]   [2023]   [Jul]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 32/47] ext4: dynamically allocate the ext4-es shrinker
    Date
    In preparation for implementing lockless slab shrink, use new APIs to
    dynamically allocate the ext4-es shrinker, so that it can be freed
    asynchronously using kfree_rcu(). Then it doesn't need to wait for RCU
    read-side critical section when releasing the struct ext4_sb_info.

    Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
    ---
    fs/ext4/ext4.h | 2 +-
    fs/ext4/extents_status.c | 22 ++++++++++++----------
    2 files changed, 13 insertions(+), 11 deletions(-)

    diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
    index 0a2d55faa095..1bd150d454f5 100644
    --- a/fs/ext4/ext4.h
    +++ b/fs/ext4/ext4.h
    @@ -1651,7 +1651,7 @@ struct ext4_sb_info {
    __u32 s_csum_seed;

    /* Reclaim extents from extent status tree */
    - struct shrinker s_es_shrinker;
    + struct shrinker *s_es_shrinker;
    struct list_head s_es_list; /* List of inodes with reclaimable extents */
    long s_es_nr_inode;
    struct ext4_es_stats s_es_stats;
    diff --git a/fs/ext4/extents_status.c b/fs/ext4/extents_status.c
    index 9b5b8951afb4..8d4a959dd32f 100644
    --- a/fs/ext4/extents_status.c
    +++ b/fs/ext4/extents_status.c
    @@ -1596,7 +1596,7 @@ static unsigned long ext4_es_count(struct shrinker *shrink,
    unsigned long nr;
    struct ext4_sb_info *sbi;

    - sbi = container_of(shrink, struct ext4_sb_info, s_es_shrinker);
    + sbi = shrink->private_data;
    nr = percpu_counter_read_positive(&sbi->s_es_stats.es_stats_shk_cnt);
    trace_ext4_es_shrink_count(sbi->s_sb, sc->nr_to_scan, nr);
    return nr;
    @@ -1605,8 +1605,7 @@ static unsigned long ext4_es_count(struct shrinker *shrink,
    static unsigned long ext4_es_scan(struct shrinker *shrink,
    struct shrink_control *sc)
    {
    - struct ext4_sb_info *sbi = container_of(shrink,
    - struct ext4_sb_info, s_es_shrinker);
    + struct ext4_sb_info *sbi = shrink->private_data;
    int nr_to_scan = sc->nr_to_scan;
    int ret, nr_shrunk;

    @@ -1690,14 +1689,17 @@ int ext4_es_register_shrinker(struct ext4_sb_info *sbi)
    if (err)
    goto err3;

    - sbi->s_es_shrinker.scan_objects = ext4_es_scan;
    - sbi->s_es_shrinker.count_objects = ext4_es_count;
    - sbi->s_es_shrinker.seeks = DEFAULT_SEEKS;
    - err = register_shrinker(&sbi->s_es_shrinker, "ext4-es:%s",
    - sbi->s_sb->s_id);
    - if (err)
    + sbi->s_es_shrinker = shrinker_alloc(0, "ext4-es:%s", sbi->s_sb->s_id);
    + if (!sbi->s_es_shrinker)
    goto err4;

    + sbi->s_es_shrinker->scan_objects = ext4_es_scan;
    + sbi->s_es_shrinker->count_objects = ext4_es_count;
    + sbi->s_es_shrinker->seeks = DEFAULT_SEEKS;
    + sbi->s_es_shrinker->private_data = sbi;
    +
    + shrinker_register(sbi->s_es_shrinker);
    +
    return 0;
    err4:
    percpu_counter_destroy(&sbi->s_es_stats.es_stats_shk_cnt);
    @@ -1716,7 +1718,7 @@ void ext4_es_unregister_shrinker(struct ext4_sb_info *sbi)
    percpu_counter_destroy(&sbi->s_es_stats.es_stats_cache_misses);
    percpu_counter_destroy(&sbi->s_es_stats.es_stats_all_cnt);
    percpu_counter_destroy(&sbi->s_es_stats.es_stats_shk_cnt);
    - unregister_shrinker(&sbi->s_es_shrinker);
    + shrinker_unregister(sbi->s_es_shrinker);
    }

    /*
    --
    2.30.2
    \
     
     \ /
      Last update: 2023-07-24 12:00    [W:4.985 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site