On Thu, Jul 6, 2023 at 7:07 PM Hou Tao <houtao@xxxxxxxxxxxxxxx> wrote: > > Hi, > > On 7/6/2023 11:34 AM, Alexei Starovoitov wrote: > > From: Alexei Starovoitov <ast@xxxxxxxxxx> > > > > alloc_bulk() can reuse elements from free_by_rcu_ttrace. > > Let it reuse from waiting_for_gp_ttrace as well to avoid unnecessary kmalloc(). > > > > Signed-off-by: Alexei Starovoitov <ast@xxxxxxxxxx> > > --- > > kernel/bpf/memalloc.c | 16 ++++++++++------ > > 1 file changed, 10 insertions(+), 6 deletions(-) > > > > diff --git a/kernel/bpf/memalloc.c b/kernel/bpf/memalloc.c > > index 9986c6b7df4d..e5a87f6cf2cc 100644 > > --- a/kernel/bpf/memalloc.c > > +++ b/kernel/bpf/memalloc.c > > @@ -212,6 +212,15 @@ static void alloc_bulk(struct bpf_mem_cache *c, int cnt, int node) > > if (i >= cnt) > > return; > > > > + for (; i < cnt; i++) { > > + obj = llist_del_first(&c->waiting_for_gp_ttrace); > > + if (!obj) > > + break; > > + add_obj_to_free_list(c, obj); > > + } > > + if (i >= cnt) > > + return; > > I still think using llist_del_first() here is not safe as reported in > [1]. Not sure whether or not invoking enque_to_free() firstly for > free_llist_extra will close the race completely. Will check later. lol. see my reply a second ago in the other thread. and it's not just waiting_for_gp_ttrace. free_by_rcu_ttrace is similar.