]> www.infradead.org Git - linux.git/commitdiff
bcachefs: fix lost journal buf wakeup due to improved pipelining
authorBrian Foster <bfoster@redhat.com>
Fri, 1 Mar 2024 17:49:24 +0000 (12:49 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Thu, 14 Mar 2024 01:22:26 +0000 (21:22 -0400)
The journal_write_done() handler was reworked into a loop in commit
746a33c96b7a ("bcachefs: better journal pipelining"). As part of this,
the journal buffer wake was factored into a post-loop branch that
executes if at least one journal buffer has completed.

The journal buffer processing loop iterates on the journal buffer
pointer, however. This means that w refers to the last buffer processed
by the loop, which may or may not be done. This also means that if
multiple buffers are processed by the loop, only the last is awoken.
This lost wakeup behavior has lead to stalling problems in various CI
and fstests, such as generic/703.

Lift the wake into the loop so each done buffer sees a wake call as
it is processed.

Signed-off-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/journal_io.c

index 0b49b2383d8258dd3b63cab6f64d968bcd44d150..8ded059591c7bbf663ae697fad562e7cb4b71220 100644 (file)
@@ -1672,6 +1672,7 @@ static CLOSURE_CALLBACK(journal_write_done)
                        new.unwritten_idx++;
                } while ((v = atomic64_cmpxchg(&j->reservations.counter, old.v, new.v)) != old.v);
 
+               closure_wake_up(&w->wait);
                completed = true;
        }
 
@@ -1682,7 +1683,6 @@ static CLOSURE_CALLBACK(journal_write_done)
                track_event_change(&c->times[BCH_TIME_blocked_journal_max_in_flight],
                                   &j->max_in_flight_start, false);
 
-               closure_wake_up(&w->wait);
                journal_wake(j);
        }