Messages in this thread | | | Date | Wed, 26 Jun 2013 07:17:52 -0700 | From | "Paul E. McKenney" <> | Subject | Re: [PATCH] rculist: list_first_or_null_rcu() should use list_entry_rcu() |
| |
On Tue, Jun 25, 2013 at 04:09:38PM -0700, Tejun Heo wrote: > Hello, Paul. > > On Tue, Jun 25, 2013 at 03:57:59PM -0700, Paul E. McKenney wrote: > > > #define list_first_or_null_rcu(ptr, type, member) \ > > > ({struct list_head *__ptr = (ptr); \ > > > - struct list_head __rcu *__next = list_next_rcu(__ptr); \ > > > - likely(__ptr != __next) ? container_of(__next, type, member) : NULL; \ > > > + struct list_head *__next = __ptr->next; \ > > > + likely(__ptr != __next) ? \ > > > + list_entry_rcu(__next, type, member) : NULL; \ > > > > I am a bit uneasy with this, and would feel better if the volatile > > cast was on the very first fetch of the ->next pointer. > > > > Is there some reason why my unease is ill-founded? > > Do you mean something like the following? > > struct list_head *__next = ACCESS_ONCE(__ptr->next); \ > likely(__ptr != __next) ? \ > list_entry_rcu(__next, type, member) : NULL; \ > > Yeah, that looks right to me.
I would feel much better about this! Does it avoid warnings in your use cases?
Thanx, Paul
| |