• Kiran Kumar Modukuri's avatar
    cachefiles: Fix page leak in cachefiles_read_backing_file while vmscan is active · 5e3cd966
    Kiran Kumar Modukuri authored
    [ Upstream commit 9a24ce5b66f9c8190d63b15f4473600db4935f1f ]
    
    [Description]
    
    In a heavily loaded system where the system pagecache is nearing memory
    limits and fscache is enabled, pages can be leaked by fscache while trying
    read pages from cachefiles backend.  This can happen because two
    applications can be reading same page from a single mount, two threads can
    be trying to read the backing page at same time.  This results in one of
    the threads finding that a page for the backing file or netfs file is
    already in the radix tree.  During the error handling cachefiles does not
    clean up the reference on backing page, leading to page leak.
    
    [Fix]
    The fix is straightforward, to decrement the reference when error is
    encountered.
    
      [dhowells: Note that I've removed the clearance and put of newpage as
       they aren't attested in the commit message and don't appear to actually
       achieve anything since a new page is only allocated is newpage!=NULL and
       any residual new page is cleared before returning.]
    
    [Testing]
    I have tested the fix using following method for 12+ hrs.
    
    1) mkdir -p /mnt/nfs ; mount -o vers=3,fsc <server_ip>:/export /mnt/nfs
    2) create 10000 files of 2.8MB in a NFS mount.
    3) start a thread to simulate heavy VM presssure
       (while true ; do echo 3 > /proc/sys/vm/drop_caches ; sleep 1 ; done)&
    4) start multiple parallel reader for data set at same time
       find /mnt/nfs -type f | xargs -P 80 cat > /dev/null &
       find /mnt/nfs -type f | xargs -P 80 cat > /dev/null &
       find /mnt/nfs -type f | xargs -P 80 cat > /dev/null &
       ..
       ..
       find /mnt/nfs -type f | xargs -P 80 cat > /dev/null &
       find /mnt/nfs -type f | xargs -P 80 cat > /dev/null &
    5) finally check using cat /proc/fs/fscache/stats | grep -i pages ;
       free -h , cat /proc/meminfo and page-types -r -b lru
       to ensure all pages are freed.
    Reviewed-by: 's avatarDaniel Axtens <dja@axtens.net>
    Signed-off-by: 's avatarShantanu Goel <sgoel01@yahoo.com>
    Signed-off-by: 's avatarKiran Kumar Modukuri <kiran.modukuri@gmail.com>
    [dja: forward ported to current upstream]
    Signed-off-by: 's avatarDaniel Axtens <dja@axtens.net>
    Signed-off-by: 's avatarDavid Howells <dhowells@redhat.com>
    Signed-off-by: 's avatarSasha Levin <sashal@kernel.org>
    5e3cd966
Name
Last commit
Last update
Documentation Loading commit data...
arch Loading commit data...
block Loading commit data...
certs Loading commit data...
crypto Loading commit data...
drivers Loading commit data...
firmware Loading commit data...
fs Loading commit data...
include Loading commit data...
init Loading commit data...
ipc Loading commit data...
kernel Loading commit data...
lib Loading commit data...
mm Loading commit data...
net Loading commit data...
samples Loading commit data...
scripts Loading commit data...
security Loading commit data...
sound Loading commit data...
tools Loading commit data...
usr Loading commit data...
virt Loading commit data...
.cocciconfig Loading commit data...
.get_maintainer.ignore Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
.mailmap Loading commit data...
COPYING Loading commit data...
CREDITS Loading commit data...
Kbuild Loading commit data...
Kconfig Loading commit data...
MAINTAINERS Loading commit data...
Makefile Loading commit data...
README Loading commit data...
REPORTING-BUGS Loading commit data...