lkml.org 
[lkml]   [2022]   [Oct]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 040/255] jbd2: wake up journal waiters in FIFO order, not LIFO
    Date
    From: Andrew Perepechko <anserper@ya.ru>

    commit 34fc8768ec6089565d6d73bad26724083cecf7bd upstream.

    LIFO wakeup order is unfair and sometimes leads to a journal
    user not being able to get a journal handle for hundreds of
    transactions in a row.

    FIFO wakeup can make things more fair.

    Cc: stable@kernel.org
    Signed-off-by: Alexey Lyashkov <alexey.lyashkov@gmail.com>
    Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
    Link: https://lore.kernel.org/r/20220907165959.1137482-1-alexey.lyashkov@gmail.com
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    fs/jbd2/commit.c | 2 +-
    fs/jbd2/transaction.c | 6 +++---
    2 files changed, 4 insertions(+), 4 deletions(-)

    --- a/fs/jbd2/commit.c
    +++ b/fs/jbd2/commit.c
    @@ -531,7 +531,7 @@ void jbd2_journal_commit_transaction(jou
    journal->j_running_transaction = NULL;
    start_time = ktime_get();
    commit_transaction->t_log_start = journal->j_head;
    - wake_up(&journal->j_wait_transaction_locked);
    + wake_up_all(&journal->j_wait_transaction_locked);
    write_unlock(&journal->j_state_lock);

    jbd_debug(3, "JBD2: commit phase 2a\n");
    --- a/fs/jbd2/transaction.c
    +++ b/fs/jbd2/transaction.c
    @@ -149,7 +149,7 @@ static void wait_transaction_locked(jour
    int need_to_start;
    tid_t tid = journal->j_running_transaction->t_tid;

    - prepare_to_wait(&journal->j_wait_transaction_locked, &wait,
    + prepare_to_wait_exclusive(&journal->j_wait_transaction_locked, &wait,
    TASK_UNINTERRUPTIBLE);
    need_to_start = !tid_geq(journal->j_commit_request, tid);
    read_unlock(&journal->j_state_lock);
    @@ -175,7 +175,7 @@ static void wait_transaction_switching(j
    read_unlock(&journal->j_state_lock);
    return;
    }
    - prepare_to_wait(&journal->j_wait_transaction_locked, &wait,
    + prepare_to_wait_exclusive(&journal->j_wait_transaction_locked, &wait,
    TASK_UNINTERRUPTIBLE);
    read_unlock(&journal->j_state_lock);
    /*
    @@ -810,7 +810,7 @@ void jbd2_journal_unlock_updates (journa
    write_lock(&journal->j_state_lock);
    --journal->j_barrier_count;
    write_unlock(&journal->j_state_lock);
    - wake_up(&journal->j_wait_transaction_locked);
    + wake_up_all(&journal->j_wait_transaction_locked);
    }

    static void warn_dirty_buffer(struct buffer_head *bh)

    \
     
     \ /
      Last update: 2022-10-24 14:57    [W:4.045 / U:0.308 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site