Hi, On 12/12/2023 12:50 AM, Alexei Starovoitov wrote: > On Mon, Dec 11, 2023 at 3:27 AM Hou Tao <houtao@xxxxxxxxxxxxxxx> wrote: >> From: Hou Tao <houtao1@xxxxxxxxxx> >> >> An abnormally big cnt may be passed to link_create.uprobe_multi.cnt, >> and it will trigger the following warning in kvmalloc_node(): >> >> if (unlikely(size > INT_MAX)) { >> WARN_ON_ONCE(!(flags & __GFP_NOWARN)); >> return NULL; >> } >> >> Fix the warning by using __GFP_NOWARN when invoking kvzalloc() in >> bpf_uprobe_multi_link_attach(). >> >> Fixes: 89ae89f53d20 ("bpf: Add multi uprobe link") >> Reported-by: xingwei lee <xrivendell7@xxxxxxxxx> >> Closes: https://lore.kernel.org/bpf/CABOYnLwwJY=yFAGie59LFsUsBAgHfroVqbzZ5edAXbFE3YiNVA@xxxxxxxxxxxxxx >> Signed-off-by: Hou Tao <houtao1@xxxxxxxxxx> >> --- >> kernel/trace/bpf_trace.c | 2 +- >> 1 file changed, 1 insertion(+), 1 deletion(-) >> >> diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c >> index 774cf476a892..07b9b5896d6c 100644 >> --- a/kernel/trace/bpf_trace.c >> +++ b/kernel/trace/bpf_trace.c >> @@ -3378,7 +3378,7 @@ int bpf_uprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr >> err = -ENOMEM; >> >> link = kzalloc(sizeof(*link), GFP_KERNEL); >> - uprobes = kvcalloc(cnt, sizeof(*uprobes), GFP_KERNEL); >> + uprobes = kvcalloc(cnt, sizeof(*uprobes), GFP_KERNEL | __GFP_NOWARN); > __GFP_NOWARN will hide actual malloc failures. > Let's limit cnt instead. Both for k and u multi probes. Do you mean there will be no warning messages when the malloc request can not be fulfilled, right ? Because kvcalloc() will still return -ENOMEM when __GFP_NOWARN is used, so the userspace knows the malloc failed. And I also found out that __GFP_NOWARN only effect the invocation of vmalloc(), because kvmalloc_node() enable __GFP_NOWARN for kmalloc() by default when the passed size is greater than PAGE_SIZE. I also though about fixing the problem by limitation, but I could not get good reference values for these limitations. For multiple kprobe, maybe the number of kallsyms can be used as an anchor (e.g, the number is 207617 on my local dev machine), how about using __roundup_pow_of_two(207617 * 4) = 1 << 20 for multiple kprobes ? For multiple uprobes, maybe (1<<20) is also suitable.