diff options
author | Herbert Xu <[email protected]> | 2005-10-16 20:29:20 -0700 |
---|---|---|
committer | Linus Torvalds <[email protected]> | 2005-10-17 08:59:10 -0700 |
commit | b24d18aa743dad0c42918157c5d717686269d3a8 (patch) | |
tree | ceade1641a1806c5f3db2f4b344fe9070b488bad /scripts/basic/split-include.c | |
parent | 3d80636a0d5f056ffc26472d05b6027a7a9f6e1c (diff) |
[PATCH] list: add missing rcu_dereference on first element
It seems that all the list_*_rcu primitives are missing a memory barrier
on the very first dereference. For example,
#define list_for_each_rcu(pos, head) \
for (pos = (head)->next; prefetch(pos->next), pos != (head); \
pos = rcu_dereference(pos->next))
It will go something like:
pos = (head)->next
prefetch(pos->next)
pos != (head)
do stuff
We're missing a barrier here.
pos = rcu_dereference(pos->next)
fetch pos->next
barrier given by rcu_dereference(pos->next)
store pos
Without the missing barrier, the pos->next value may turn out to be stale.
In fact, if "do stuff" were also dereferencing pos and relying on
list_for_each_rcu to provide the barrier then it may also break.
So here is a patch to make sure that we have a barrier for the first
element in the list.
Signed-off-by: Herbert Xu <[email protected]>
Acked-by: "Paul E. McKenney" <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
Diffstat (limited to 'scripts/basic/split-include.c')
0 files changed, 0 insertions, 0 deletions