• Daniel Borkmann's avatar
    mm, percpu: add support for __GFP_NOWARN flag · 0ea7eeec
    Daniel Borkmann authored
    Add an option for pcpu_alloc() to support __GFP_NOWARN flag.
    Currently, we always throw a warning when size or alignment
    is unsupported (and also dump stack on failed allocation
    requests). The warning itself is harmless since we return
    NULL anyway for any failed request, which callers are
    required to handle anyway. However, it becomes harmful when
    panic_on_warn is set.
    
    The rationale for the WARN() in pcpu_alloc() is that it can
    be tracked when larger than supported allocation requests are
    made such that allocations limits can be tweaked if warranted.
    This makes sense for in-kernel users, however, there are users
    of pcpu allocator where allocation size is derived from user
    space requests, e.g. when creating BPF maps. In these cases,
    the requests should fail gracefully without throwing a splat.
    
    The current work-around was to check allocation size against
    the upper limit of PCPU_MIN_UNIT_SIZE from call-sites for
    bailing out prior to a call to pcpu_alloc() in order to
    avoid throwing the WARN(). This is bad in multiple ways since
    PCPU_MIN_UNIT_SIZE is an implementation detail, and having
    the checks on call-sites only complicates the code for no
    good reason. Thus, lets fix it generically by supporting the
    __GFP_NOWARN flag that users can then use with calling the
    __alloc_percpu_gfp() helper instead.
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Cc: Tejun Heo <tj@kernel.org>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Acked-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    0ea7eeec
percpu.c 82.4 KB