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 33/47] jbd2,ext4: dynamically allocate the jbd2-journal shrinker
    Date
    In preparation for implementing lockless slab shrink, use new APIs to
    dynamically allocate the jbd2-journal 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 journal_s.

    Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
    ---
    fs/jbd2/journal.c | 27 +++++++++++++++++----------
    include/linux/jbd2.h | 2 +-
    2 files changed, 18 insertions(+), 11 deletions(-)

    diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
    index fbce16fedaa4..a7d555ea06e3 100644
    --- a/fs/jbd2/journal.c
    +++ b/fs/jbd2/journal.c
    @@ -1301,7 +1301,7 @@ static int jbd2_min_tag_size(void)
    static unsigned long jbd2_journal_shrink_scan(struct shrinker *shrink,
    struct shrink_control *sc)
    {
    - journal_t *journal = container_of(shrink, journal_t, j_shrinker);
    + journal_t *journal = shrink->private_data;
    unsigned long nr_to_scan = sc->nr_to_scan;
    unsigned long nr_shrunk;
    unsigned long count;
    @@ -1327,7 +1327,7 @@ static unsigned long jbd2_journal_shrink_scan(struct shrinker *shrink,
    static unsigned long jbd2_journal_shrink_count(struct shrinker *shrink,
    struct shrink_control *sc)
    {
    - journal_t *journal = container_of(shrink, journal_t, j_shrinker);
    + journal_t *journal = shrink->private_data;
    unsigned long count;

    count = percpu_counter_read_positive(&journal->j_checkpoint_jh_count);
    @@ -1415,19 +1415,26 @@ static journal_t *journal_init_common(struct block_device *bdev,
    journal->j_superblock = (journal_superblock_t *)bh->b_data;

    journal->j_shrink_transaction = NULL;
    - journal->j_shrinker.scan_objects = jbd2_journal_shrink_scan;
    - journal->j_shrinker.count_objects = jbd2_journal_shrink_count;
    - journal->j_shrinker.seeks = DEFAULT_SEEKS;
    - journal->j_shrinker.batch = journal->j_max_transaction_buffers;

    if (percpu_counter_init(&journal->j_checkpoint_jh_count, 0, GFP_KERNEL))
    goto err_cleanup;

    - if (register_shrinker(&journal->j_shrinker, "jbd2-journal:(%u:%u)",
    - MAJOR(bdev->bd_dev), MINOR(bdev->bd_dev))) {
    + journal->j_shrinker = shrinker_alloc(0, "jbd2-journal:(%u:%u)",
    + MAJOR(bdev->bd_dev),
    + MINOR(bdev->bd_dev));
    + if (!journal->j_shrinker) {
    percpu_counter_destroy(&journal->j_checkpoint_jh_count);
    goto err_cleanup;
    }
    +
    + journal->j_shrinker->scan_objects = jbd2_journal_shrink_scan;
    + journal->j_shrinker->count_objects = jbd2_journal_shrink_count;
    + journal->j_shrinker->seeks = DEFAULT_SEEKS;
    + journal->j_shrinker->batch = journal->j_max_transaction_buffers;
    + journal->j_shrinker->private_data = journal;
    +
    + shrinker_register(journal->j_shrinker);
    +
    return journal;

    err_cleanup:
    @@ -2190,9 +2197,9 @@ int jbd2_journal_destroy(journal_t *journal)
    brelse(journal->j_sb_buffer);
    }

    - if (journal->j_shrinker.flags & SHRINKER_REGISTERED) {
    + if (journal->j_shrinker) {
    percpu_counter_destroy(&journal->j_checkpoint_jh_count);
    - unregister_shrinker(&journal->j_shrinker);
    + shrinker_unregister(journal->j_shrinker);
    }
    if (journal->j_proc_entry)
    jbd2_stats_proc_exit(journal);
    diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h
    index d860499e15e4..9fdc02565c24 100644
    --- a/include/linux/jbd2.h
    +++ b/include/linux/jbd2.h
    @@ -897,7 +897,7 @@ struct journal_s
    * Journal head shrinker, reclaim buffer's journal head which
    * has been written back.
    */
    - struct shrinker j_shrinker;
    + struct shrinker *j_shrinker;

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