• Johannes Weiner's avatar
    fs: fix leaked psi pressure state · 82e60d00
    Johannes Weiner authored
    When psi annotations were added to to btrfs compression reads, the psi
    state tracking over add_ra_bio_pages and btrfs_submit_compressed_read was
    faulty.  A pressure state, once entered, is never left.  This results in
    incorrectly elevated pressure, which triggers OOM kills.
    
    pflags record the *previous* memstall state when we enter a new one.  The
    code tried to initialize pflags to 1, and then optimize the leave call
    when we either didn't enter a memstall, or were already inside a nested
    stall.  However, there can be multiple PageWorkingset pages in the bio, at
    which point it's that path itself that enters repeatedly and overwrites
    pflags.  This causes us to miss the exit.
    
    Enter the stall only once if needed, then unwind correctly.
    
    erofs has the same problem, fix that up too.  And move the memstall exit
    past submit_bio() to restore submit accounting originally added by
    b8e24a93 ("block: annotate refault stalls from IO submission").
    
    Link: https://lkml.kernel.org/r/Y2UHRqthNUwuIQGS@cmpxchg.org
    Fixes: 4088a47e ("btrfs: add manual PSI accounting for compressed reads")
    Fixes: 99486c51 ("erofs: add manual PSI accounting for the compressed address space")
    Fixes: 118f3663 ("block: remove PSI accounting from the bio layer")
    Link: https://lore.kernel.org/r/d20a0a85-e415-cf78-27f9-77dd7a94bc8d@leemhuis.info/Signed-off-by: default avatarJohannes Weiner <hannes@cmpxchg.org>
    Reported-by: default avatarThorsten Leemhuis <linux@leemhuis.info>
    Tested-by: default avatarThorsten Leemhuis <linux@leemhuis.info>
    Cc: Chao Yu <chao@kernel.org>
    Cc: Chris Mason <clm@fb.com>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: David Sterba <dsterba@suse.com>
    Cc: Gao Xiang <xiang@kernel.org>
    Cc: Jens Axboe <axboe@kernel.dk>
    Cc: Josef Bacik <josef@toxicpanda.com>
    Cc: Suren Baghdasaryan <surenb@google.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    82e60d00
compression.c 46.3 KB