On Wed, Jun 1, 2022 at 1:11 PM Feng Zhou <zhoufeng.zf@xxxxxxxxxxxxx> wrote: > > 在 2022/6/1 下午5:50, Alexei Starovoitov 写道: > > On Wed, Jun 1, 2022 at 10:42 AM Feng zhou <zhoufeng.zf@xxxxxxxxxxxxx> wrote: > >> static inline void ___pcpu_freelist_push(struct pcpu_freelist_head *head, > >> @@ -130,14 +134,19 @@ static struct pcpu_freelist_node *___pcpu_freelist_pop(struct pcpu_freelist *s) > >> orig_cpu = cpu = raw_smp_processor_id(); > >> while (1) { > >> head = per_cpu_ptr(s->freelist, cpu); > >> + if (READ_ONCE(head->is_empty)) > >> + goto next_cpu; > >> raw_spin_lock(&head->lock); > >> node = head->first; > >> if (node) { > > extra bool is unnecessary. > > just READ_ONCE(head->first) > > As for why to add is_empty instead of directly judging head->first, my > understanding is this, head->first is frequently modified during updating > map, which will lead to invalid other cpus's cache, and is_empty is after > freelist having no free elems will be changed, the performance will be > better. maybe. pls benchmark it. imo wasting a bool for the corner case is not a good trade off.