Thread (12 messages) 12 messages, 2 authors, 2025-09-26

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

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.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help