Re: Why do we need READ_ONCE() in list_empty()?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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/perfbook.html
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

_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@xxxxxxxxxxxxxxxxx
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies



[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]

  Powered by Linux