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.10 043/575] ext4: fix lazy initialization next schedule time computation in more granular unit
    Date
    From: Shaoying Xu <shaoyi@amazon.com>

    commit 39fec6889d15a658c3a3ebb06fd69d3584ddffd3 upstream.

    Ext4 file system has default lazy inode table initialization setup once
    it is mounted. However, it has issue on computing the next schedule time
    that makes the timeout same amount in jiffies but different real time in
    secs if with various HZ values. Therefore, fix by measuring the current
    time in a more granular unit nanoseconds and make the next schedule time
    independent of the HZ value.

    Fixes: bfff68738f1c ("ext4: add support for lazy inode table initialization")
    Signed-off-by: Shaoying Xu <shaoyi@amazon.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Link: https://lore.kernel.org/r/20210902164412.9994-2-shaoyi@amazon.com
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    fs/ext4/super.c | 9 ++++-----
    1 file changed, 4 insertions(+), 5 deletions(-)

    --- a/fs/ext4/super.c
    +++ b/fs/ext4/super.c
    @@ -3436,9 +3436,9 @@ static int ext4_run_li_request(struct ex
    struct super_block *sb = elr->lr_super;
    ext4_group_t ngroups = EXT4_SB(sb)->s_groups_count;
    ext4_group_t group = elr->lr_next_group;
    - unsigned long timeout = 0;
    unsigned int prefetch_ios = 0;
    int ret = 0;
    + u64 start_time;

    if (elr->lr_mode == EXT4_LI_MODE_PREFETCH_BBITMAP) {
    elr->lr_next_group = ext4_mb_prefetch(sb, group,
    @@ -3475,14 +3475,13 @@ static int ext4_run_li_request(struct ex
    ret = 1;

    if (!ret) {
    - timeout = jiffies;
    + start_time = ktime_get_real_ns();
    ret = ext4_init_inode_table(sb, group,
    elr->lr_timeout ? 0 : 1);
    trace_ext4_lazy_itable_init(sb, group);
    if (elr->lr_timeout == 0) {
    - timeout = (jiffies - timeout) *
    - EXT4_SB(elr->lr_super)->s_li_wait_mult;
    - elr->lr_timeout = timeout;
    + elr->lr_timeout = nsecs_to_jiffies((ktime_get_real_ns() - start_time) *
    + EXT4_SB(elr->lr_super)->s_li_wait_mult);
    }
    elr->lr_next_sched = jiffies + elr->lr_timeout;
    elr->lr_next_group = group + 1;

    \
     
     \ /
      Last update: 2021-11-15 20:07    [W:4.030 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site