kmem_alloc(), kmem_zone_alloc() and xfs_buf_allocate_memory() are doing open-coded __GFP_NOFAIL allocations with warning messages as a canary. But since small !__GFP_NOFAIL allocations retry forever inside memory allocator unless TIF_MEMDIE is set, the canary does not help even if allocations are stalling. Thus, this patch adds __GFP_NORETRY so that we can know possibility of allocation deadlock. If a patchset which makes small !__GFP_NOFAIL !__GFP_FS allocations not retry inside memory allocator is merged, warning messages by warn_alloc_failed() will dominate warning messages by the canary because each thread calls warn_alloc_failed() for approximately every 2 milliseconds. Thus, this patch also adds __GFP_NOWARN so that we won't flood kernel logs by these open-coded __GFP_NOFAIL allocations. Next patch compensates for lack of comm name and pid by addding them to the canary. Signed-off-by: Tetsuo Handa <penguin-kernel@xxxxxxxxxxxxxxxxxxx> Cc: Michal Hocko <mhocko@xxxxxxxx> --- fs/xfs/kmem.c | 4 ++-- fs/xfs/xfs_buf.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fs/xfs/kmem.c b/fs/xfs/kmem.c index a7a3a63..1fcf90d 100644 --- a/fs/xfs/kmem.c +++ b/fs/xfs/kmem.c @@ -46,7 +46,7 @@ void * kmem_alloc(size_t size, xfs_km_flags_t flags) { int retries = 0; - gfp_t lflags = kmem_flags_convert(flags); + gfp_t lflags = kmem_flags_convert(flags) | __GFP_NORETRY | __GFP_NOWARN; void *ptr; do { @@ -111,7 +111,7 @@ void * kmem_zone_alloc(kmem_zone_t *zone, xfs_km_flags_t flags) { int retries = 0; - gfp_t lflags = kmem_flags_convert(flags); + gfp_t lflags = kmem_flags_convert(flags) | __GFP_NORETRY | __GFP_NOWARN; void *ptr; do { diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 8ecffb3..cbd4f91 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -289,7 +289,7 @@ xfs_buf_allocate_memory( { size_t size; size_t nbytes, offset; - gfp_t gfp_mask = xb_to_gfp(flags); + gfp_t gfp_mask = xb_to_gfp(flags) | __GFP_NORETRY | __GFP_NOWARN; unsigned short page_count, i; xfs_off_t start, end; int error; -- 1.8.3.1 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>