On Sat, Nov 23, 2019 at 1:15 PM Daniel Borkmann <daniel@xxxxxxxxxxxxx> wrote: > > On 11/23/19 9:56 PM, Andrii Nakryiko wrote: > > mmap() support for BPF array depends on vmalloc_user_node_flags, which is > > available only on CONFIG_MMU configurations. Fail mmap-able allocations if no > > CONFIG_MMU is set. > > > > Cc: Johannes Weiner <hannes@xxxxxxxxxxx> > > Reported-by: kbuild test robot <lkp@xxxxxxxxx> > > Signed-off-by: Andrii Nakryiko <andriin@xxxxxx> > > --- > > kernel/bpf/syscall.c | 4 ++++ > > 1 file changed, 4 insertions(+) > > > > diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c > > index bb002f15b32a..242a06fbdf18 100644 > > --- a/kernel/bpf/syscall.c > > +++ b/kernel/bpf/syscall.c > > @@ -156,8 +156,12 @@ static void *__bpf_map_area_alloc(u64 size, int numa_node, bool mmapable) > > } > > if (mmapable) { > > BUG_ON(!PAGE_ALIGNED(size)); > > +#ifndef CONFIG_MMU > > + return NULL; > > +#else > > return vmalloc_user_node_flags(size, numa_node, GFP_KERNEL | > > __GFP_RETRY_MAYFAIL | flags); > > Hmm, this should rather live in include/linux/vmalloc.h, otherwise every future > user of vmalloc_user_node_flags() would need to add this ifdef? vmalloc.h has > the below, so perhaps this could be added there instead: Ok, I finally untangled this all. The real fix is to implement vmalloc_user_node_flags() in mm/no_mmu.c. Took me a bit to understand how all this stuff is supposed to compile. If you take a look at vmalloc.h, you'll see that most variants of vmalloc() are not conditionally defined like __vmalloc_node_flags_caller. I'll send a different patch with proper fix in few minutes. > > [..] > #ifndef CONFIG_MMU > extern void *__vmalloc_node_flags(unsigned long size, int node, gfp_t flags); > static inline void *__vmalloc_node_flags_caller(unsigned long size, int node, > gfp_t flags, void *caller) > { > return __vmalloc_node_flags(size, node, flags); > } > #else > extern void *__vmalloc_node_flags_caller(unsigned long size, > int node, gfp_t flags, void *caller); > #endif > [..] > > > +#endif > > } > > return __vmalloc_node_flags_caller(size, numa_node, > > GFP_KERNEL | __GFP_RETRY_MAYFAIL | > > >