--- mm/filemap.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/mm/filemap.c b/mm/filemap.c index f61cf51c2238..1b6ab9915bc8 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1236,6 +1236,8 @@ static inline int folio_wait_bit_common(struct folio *folio, int bit_nr, bool thrashing = false; unsigned long pflags; bool in_thrashing; + pgoff_t index = folio->index; + long timeout = 60 * HZ; if (bit_nr == PG_locked && !folio_test_uptodate(folio) && folio_test_workingset(folio)) { @@ -1305,7 +1307,14 @@ static inline int folio_wait_bit_common(struct folio *folio, int bit_nr, if (signal_pending_state(state, current)) break; - io_schedule(); + if (timeout > 0) { + timeout = io_schedule_timeout(timeout); + if (timeout <= 0) + pr_warn("folio wait took too long (ix=%lx)\n", + index); + } else { + io_schedule(); + } continue; }