Messages in this thread Patch in this message | | | Date | Thu, 2 Mar 2017 11:35:20 +0100 | From | Michal Hocko <> | Subject | Re: mm allocation failure and hang when running xfstests generic/269 on xfs |
| |
On Thu 02-03-17 19:04:48, Tetsuo Handa wrote: [...] > So, commit 5d17a73a2ebeb8d1("vmalloc: back off when the current task is > killed") implemented __GFP_KILLABLE flag and automatically applied that > flag. As a result, those who are not ready to fail upon SIGKILL are > confused. ;-)
You are right! The function is documented it might fail but the code doesn't really allow that. This seems like a bug to me. What do you think about the following? --- From d02cb0285d8ce3344fd64dc7e2912e9a04bef80d Mon Sep 17 00:00:00 2001 From: Michal Hocko <mhocko@suse.com> Date: Thu, 2 Mar 2017 11:31:11 +0100 Subject: [PATCH] xfs: allow kmem_zalloc_greedy to fail
Even though kmem_zalloc_greedy is documented it might fail the current code doesn't really implement this properly and loops on the smallest allowed size for ever. This is a problem because vzalloc might fail permanently. Since 5d17a73a2ebe ("vmalloc: back off when the current task is killed") such a failure is much more probable than it used to be. Fix this by bailing out if the minimum size request failed.
This has been noticed by a hung generic/269 xfstest by Xiong Zhou.
Reported-by: Xiong Zhou <xzhou@redhat.com> Analyzed-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Signed-off-by: Michal Hocko <mhocko@suse.com> --- fs/xfs/kmem.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/fs/xfs/kmem.c b/fs/xfs/kmem.c index 339c696bbc01..ee95f5c6db45 100644 --- a/fs/xfs/kmem.c +++ b/fs/xfs/kmem.c @@ -34,6 +34,8 @@ kmem_zalloc_greedy(size_t *size, size_t minsize, size_t maxsize) size_t kmsize = maxsize; while (!(ptr = vzalloc(kmsize))) { + if (kmsize == minsize) + break; if ((kmsize >>= 1) <= minsize) kmsize = minsize; } -- 2.11.0 -- Michal Hocko SUSE Labs
| |