From: Goldwyn Rodrigues <rgoldwyn@xxxxxxxx> Perform generic_perform_write() under memalloc_nofs because any allocations should not recurse into fs writebacks. This covers grab and write cache pages, Signed-off-by: Goldwyn Rodrigues <rgoldwyn@xxxxxxxx> --- mm/filemap.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mm/filemap.c b/mm/filemap.c index 3c9ead9a1e32..5fe54614c69f 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -36,6 +36,7 @@ #include <linux/cleancache.h> #include <linux/shmem_fs.h> #include <linux/rmap.h> +#include <linux/sched/mm.h> #include "internal.h" #define CREATE_TRACE_POINTS @@ -3105,6 +3106,7 @@ ssize_t generic_perform_write(struct file *file, long status = 0; ssize_t written = 0; unsigned int flags = 0; + unsigned nofs_flags = memalloc_nofs_save(); do { struct page *page; @@ -3177,6 +3179,8 @@ ssize_t generic_perform_write(struct file *file, balance_dirty_pages_ratelimited(mapping); } while (iov_iter_count(i)); + memalloc_nofs_restore(nofs_flags); + return written ? written : status; } EXPORT_SYMBOL(generic_perform_write); -- 2.16.2