lkml.org 
[lkml]   [2018]   [Dec]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.19 040/123] bpf: allocate local storage buffers using GFP_ATOMIC
    Date
    From: Roman Gushchin <guroan@gmail.com>

    [ Upstream commit 569a933b03f3c48b392fe67c0086b3a6b9306b5a ]

    Naresh reported an issue with the non-atomic memory allocation of
    cgroup local storage buffers:

    [ 73.047526] BUG: sleeping function called from invalid context at
    /srv/oe/build/tmp-rpb-glibc/work-shared/intel-corei7-64/kernel-source/mm/slab.h:421
    [ 73.060915] in_atomic(): 1, irqs_disabled(): 0, pid: 3157, name: test_cgroup_sto
    [ 73.068342] INFO: lockdep is turned off.
    [ 73.072293] CPU: 2 PID: 3157 Comm: test_cgroup_sto Not tainted
    4.20.0-rc2-next-20181113 #1
    [ 73.080548] Hardware name: Supermicro SYS-5019S-ML/X11SSH-F, BIOS
    2.0b 07/27/2017
    [ 73.088018] Call Trace:
    [ 73.090463] dump_stack+0x70/0xa5
    [ 73.093783] ___might_sleep+0x152/0x240
    [ 73.097619] __might_sleep+0x4a/0x80
    [ 73.101191] __kmalloc_node+0x1cf/0x2f0
    [ 73.105031] ? cgroup_storage_update_elem+0x46/0x90
    [ 73.109909] cgroup_storage_update_elem+0x46/0x90

    cgroup_storage_update_elem() (as well as other update map update
    callbacks) is called with disabled preemption, so GFP_ATOMIC
    allocation should be used: e.g. alloc_htab_elem() in hashtab.c.

    Reported-by: Naresh Kamboju <naresh.kamboju@linaro.org>
    Tested-by: Naresh Kamboju <naresh.kamboju@linaro.org>
    Signed-off-by: Roman Gushchin <guro@fb.com>
    Cc: Alexei Starovoitov <ast@kernel.org>
    Cc: Daniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    kernel/bpf/local_storage.c | 3 ++-
    1 file changed, 2 insertions(+), 1 deletion(-)

    diff --git a/kernel/bpf/local_storage.c b/kernel/bpf/local_storage.c
    index 830d7f095748..fc1605aee5ea 100644
    --- a/kernel/bpf/local_storage.c
    +++ b/kernel/bpf/local_storage.c
    @@ -138,7 +138,8 @@ static int cgroup_storage_update_elem(struct bpf_map *map, void *_key,
    return -ENOENT;

    new = kmalloc_node(sizeof(struct bpf_storage_buffer) +
    - map->value_size, __GFP_ZERO | GFP_USER,
    + map->value_size,
    + __GFP_ZERO | GFP_ATOMIC | __GFP_NOWARN,
    map->numa_node);
    if (!new)
    return -ENOMEM;
    --
    2.17.1
    \
     
     \ /
      Last update: 2018-12-05 11:11    [W:4.058 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site