Re: [PATCH net-next v6 1/3] rculist: Add hlist_nulls_replace_rcu() and hlist_nulls_replace_init_rcu()
From: Kuniyuki Iwashima <kuniyu@google.com>
Date: 2025-09-26 04:02:59
From: Kuniyuki Iwashima <kuniyu@google.com>
Date: 2025-09-26 04:02:59
On Thu, Sep 25, 2025 at 8:23 PM luoxuanqiang [off-list ref] wrote: [...]
quoted
quoted
+{ + struct hlist_nulls_node *next = old->next; + + WRITE_ONCE(new->next, next); + WRITE_ONCE(new->pprev, old->pprev); + rcu_assign_pointer(*(struct hlist_nulls_node __rcu **)new->pprev, new);nit: define hlist_nulls_prev_rcu() like hlist_nulls_next_rcu().I'm wondering if defining a macro called hlist_nulls_prev_rcu() might be controversial, since it should actually be getting the prev->next rather than the prev itself.
See hlist_add_before_rcu() for an example:
rcu_assign_pointer(hlist_pprev_rcu(n), n);
You can define hlist_nulls_pprev_rcu() and use it alike.
rcu_assign_pointer(hlist_nulls_pprev_rcu(new), new);
[...]However, I noticed that in the definition of hlist_pprev_rcu(), it directly uses pprev: #define hlist_pprev_rcu(node) (*((struct hlist_node __rcu **)((node)->pprev)))
Note it dereferences *((node)->pprev). The macro is not to iterate the lengthy cast.