Why do we need READ_ONCE() in list_empty()?
Hi, list_empty() uses READ_ONCE() to read head->next [1]. AFAIK, READ_ONCE() is a compile-time memory barrier to prevent the compiler from reordering the read with the previous or the following memory accesses. I checked commit id 1658d35ead5d8dd from its committer Paul E. McKenney when such a thing was added to the kernel, to seek for an explanation, but the commit description is not very insightful. It only says that this macro might be accessed without the protection of a lock and thus the need for READ_ONCE. I still don't understand why READ_ONCE() is needed in list_empty(). Is there a concrete example where not wrapping it inside READ_ONCE() could lead to inconsistency/incorrectness? [1] https://elixir.bootlin.com/linux/v5.14.11/source/include/linux/list.h#L282 Cheers Karim
On Thu, Apr 28, 2022 at 04:00:15PM +0100, Karim Manaouil wrote:
list_empty() uses READ_ONCE() to read head->next [1]. AFAIK, READ_ONCE() is a compile-time memory barrier to prevent the compiler from reordering the read with the previous or the following memory accesses.
I checked commit id 1658d35ead5d8dd from its committer Paul E. McKenney when such a thing was added to the kernel, to seek for an explanation, but the commit description is not very insightful. It only says that this macro might be accessed without the protection of a lock and thus the need for READ_ONCE.
I still don't understand why READ_ONCE() is needed in list_empty(). Is there a concrete example where not wrapping it inside READ_ONCE() could lead to inconsistency/incorrectness?
list_empty is inline so it will be included in many different functions in the kernel and it is possible that cases like this might happen: https://lkml.iu.edu/hypermail/linux/kernel/1602.3/03297.html Also see https://www.kernel.org/doc/Documentation/memory-barriers.txt and https://mirrors.edge.kernel.org/pub/linux/kernel/people/paulmck/perfbook/per... for more examples of READ_ONCE. If this does not help you can always CC the patch author and bug reporter for more info :) -- Valentin
participants (2)
-
Karim Manaouil -
Valentin Vidić