Commit 9ba1fb2c authored by Michal Hocko's avatar Michal Hocko Committed by Linus Torvalds

xfs: use memalloc_nofs_{save,restore} instead of memalloc_noio*

kmem_zalloc_large and _xfs_buf_map_pages use memalloc_noio_{save,restore}
API to prevent from reclaim recursion into the fs because vmalloc can
invoke unconditional GFP_KERNEL allocations and these functions might be
called from the NOFS contexts.  The memalloc_noio_save will enforce
GFP_NOIO context which is even weaker than GFP_NOFS and that seems to be
unnecessary.  Let's use memalloc_nofs_{save,restore} instead as it
should provide exactly what we need here - implicit GFP_NOFS context.

Link: http://lkml.kernel.org/r/20170306131408.9828-6-mhocko@kernel.orgSigned-off-by: default avatarMichal Hocko <mhocko@suse.com>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Acked-by: default avatarVlastimil Babka <vbabka@suse.cz>
Cc: Dave Chinner <david@fromorbit.com>
Cc: Theodore Ts'o <tytso@mit.edu>
Cc: Chris Mason <clm@fb.com>
Cc: David Sterba <dsterba@suse.cz>
Cc: Jan Kara <jack@suse.cz>
Cc: Nikolay Borisov <nborisov@suse.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 7dea19f9
...@@ -48,7 +48,7 @@ kmem_alloc(size_t size, xfs_km_flags_t flags) ...@@ -48,7 +48,7 @@ kmem_alloc(size_t size, xfs_km_flags_t flags)
void * void *
kmem_zalloc_large(size_t size, xfs_km_flags_t flags) kmem_zalloc_large(size_t size, xfs_km_flags_t flags)
{ {
unsigned noio_flag = 0; unsigned nofs_flag = 0;
void *ptr; void *ptr;
gfp_t lflags; gfp_t lflags;
...@@ -60,17 +60,17 @@ kmem_zalloc_large(size_t size, xfs_km_flags_t flags) ...@@ -60,17 +60,17 @@ kmem_zalloc_large(size_t size, xfs_km_flags_t flags)
* __vmalloc() will allocate data pages and auxillary structures (e.g. * __vmalloc() will allocate data pages and auxillary structures (e.g.
* pagetables) with GFP_KERNEL, yet we may be under GFP_NOFS context * pagetables) with GFP_KERNEL, yet we may be under GFP_NOFS context
* here. Hence we need to tell memory reclaim that we are in such a * here. Hence we need to tell memory reclaim that we are in such a
* context via PF_MEMALLOC_NOIO to prevent memory reclaim re-entering * context via PF_MEMALLOC_NOFS to prevent memory reclaim re-entering
* the filesystem here and potentially deadlocking. * the filesystem here and potentially deadlocking.
*/ */
if ((current->flags & PF_MEMALLOC_NOFS) || (flags & KM_NOFS)) if (flags & KM_NOFS)
noio_flag = memalloc_noio_save(); nofs_flag = memalloc_nofs_save();
lflags = kmem_flags_convert(flags); lflags = kmem_flags_convert(flags);
ptr = __vmalloc(size, lflags | __GFP_HIGHMEM | __GFP_ZERO, PAGE_KERNEL); ptr = __vmalloc(size, lflags | __GFP_HIGHMEM | __GFP_ZERO, PAGE_KERNEL);
if ((current->flags & PF_MEMALLOC_NOFS) || (flags & KM_NOFS)) if (flags & KM_NOFS)
memalloc_noio_restore(noio_flag); memalloc_nofs_restore(nofs_flag);
return ptr; return ptr;
} }
......
...@@ -443,17 +443,17 @@ _xfs_buf_map_pages( ...@@ -443,17 +443,17 @@ _xfs_buf_map_pages(
bp->b_addr = NULL; bp->b_addr = NULL;
} else { } else {
int retried = 0; int retried = 0;
unsigned noio_flag; unsigned nofs_flag;
/* /*
* vm_map_ram() will allocate auxillary structures (e.g. * vm_map_ram() will allocate auxillary structures (e.g.
* pagetables) with GFP_KERNEL, yet we are likely to be under * pagetables) with GFP_KERNEL, yet we are likely to be under
* GFP_NOFS context here. Hence we need to tell memory reclaim * GFP_NOFS context here. Hence we need to tell memory reclaim
* that we are in such a context via PF_MEMALLOC_NOIO to prevent * that we are in such a context via PF_MEMALLOC_NOFS to prevent
* memory reclaim re-entering the filesystem here and * memory reclaim re-entering the filesystem here and
* potentially deadlocking. * potentially deadlocking.
*/ */
noio_flag = memalloc_noio_save(); nofs_flag = memalloc_nofs_save();
do { do {
bp->b_addr = vm_map_ram(bp->b_pages, bp->b_page_count, bp->b_addr = vm_map_ram(bp->b_pages, bp->b_page_count,
-1, PAGE_KERNEL); -1, PAGE_KERNEL);
...@@ -461,7 +461,7 @@ _xfs_buf_map_pages( ...@@ -461,7 +461,7 @@ _xfs_buf_map_pages(
break; break;
vm_unmap_aliases(); vm_unmap_aliases();
} while (retried++ <= 1); } while (retried++ <= 1);
memalloc_noio_restore(noio_flag); memalloc_nofs_restore(nofs_flag);
if (!bp->b_addr) if (!bp->b_addr)
return -ENOMEM; return -ENOMEM;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment