• Michal Hocko's avatar
    mm/vmalloc: alloc GFP_NO{FS,IO} for vmalloc · 451769eb
    Michal Hocko authored
    Patch series "extend vmalloc support for constrained allocations", v2.
    
    Based on a recent discussion with Dave and Neil [1] I have tried to
    implement NOFS, NOIO, NOFAIL support for the vmalloc to make life of
    kvmalloc users easier.
    
    A requirement for NOFAIL support for kvmalloc was new to me but this
    seems to be really needed by the xfs code.
    
    NOFS/NOIO was a known and a long term problem which was hoped to be
    handled by the scope API.  Those scope should have been used at the
    reclaim recursion boundaries both to document them and also to remove
    the necessity of NOFS/NOIO constrains for all allocations within that
    scope.  Instead workarounds were developed to wrap a single allocation
    instead (like ceph_kvmalloc).
    
    First patch implements NOFS/NOIO support for vmalloc.  The second one
    adds NOFAIL support and the third one bundles all together into kvmalloc
    and drops ceph_kvmalloc which can use kvmalloc directly now.
    
    [1] http://lkml.kernel.org/r/163184741778.29351.16920832234899124642.stgit@noble.brown
    
    This patch (of 4):
    
    vmalloc historically hasn't supported GFP_NO{FS,IO} requests because
    page table allocations do not support externally provided gfp mask and
    performed GFP_KERNEL like allocations.
    
    Since few years we have scope (memalloc_no{fs,io}_{save,restore}) APIs
    to enforce NOFS and NOIO constrains implicitly to all allocators within
    the scope.  There was a hope that those scopes would be defined on a
    higher level when the reclaim recursion boundary starts/stops (e.g.
    when a lock required during the memory reclaim is required etc.).  It
    seems that not all NOFS/NOIO users have adopted this approach and
    instead they have taken a workaround approach to wrap a single
    [k]vmalloc allocation by a scope API.
    
    These workarounds do not serve the purpose of a better reclaim recursion
    documentation and reduction of explicit GFP_NO{FS,IO} usege so let's
    just provide them with the semantic they are asking for without a need
    for workarounds.
    
    Add support for GFP_NOFS and GFP_NOIO to vmalloc directly.  All internal
    allocations already comply with the given gfp_mask.  The only current
    exception is vmap_pages_range which maps kernel page tables.  Infer the
    proper scope API based on the given gfp mask.
    
    [sfr@canb.auug.org.au: mm/vmalloc.c needs linux/sched/mm.h]
     Link: https://lkml.kernel.org/r/20211217232641.0148710c@canb.auug.org.au
    
    Link: https://lkml.kernel.org/r/20211122153233.9924-1-mhocko@kernel.org
    Link: https://lkml.kernel.org/r/20211122153233.9924-2-mhocko@kernel.orgSigned-off-by: default avatarMichal Hocko <mhocko@suse.com>
    Signed-off-by: default avatarStephen Rothwell <sfr@canb.auug.org.au>
    Reviewed-by: default avatarUladzislau Rezki (Sony) <urezki@gmail.com>
    Acked-by: default avatarVlastimil Babka <vbabka@suse.cz>
    Cc: Neil Brown <neilb@suse.de>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: Ilya Dryomov <idryomov@gmail.com>
    Cc: Jeff Layton <jlayton@kernel.org>
    Cc: Dave Chinner <dchinner@redhat.com>
    Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    451769eb
vmalloc.c 103 KB