在 2025/9/26 12:02, Kuniyuki Iwashima 写道:
On Thu, Sep 25, 2025 at 8:23 PM luoxuanqiang [off-list ref] wrote:
[...]
quoted
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);
[...]quoted
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.
Thank you for the quick and clear explanation!
I'll apply these changes in the next version.
Appreciate it!