ACCESS_ONCE usage inside llist_add_batch function

Chinmay V S cvs268 at gmail.com
Tue Mar 3 01:38:41 EST 2015


On Tue, Mar 3, 2015 at 11:51 AM, John de la Garza <john at jjdev.com> wrote:
> On Sat, Feb 28, 2015 at 10:12:23PM +0200, Cihangir Akturk wrote:
>> Reading the lib/llist.c file in the kernel sources, I came across
>> the llist_add_bach function defined like this;
>>
>> bool llist_add_batch(struct llist_node *new_first, struct llist_node *new_last,
>>                    struct llist_head *head)
>> {
>>       struct llist_node *first;
>>
>>       do {
>>               new_last->next = first = ACCESS_ONCE(head->first);
>>       } while (cmpxchg(&head->first, first, new_first) != first);
>>
>>       return !first;
>> }
>>
>> One thing bugging my mind is the ACCESS_ONCE macro. Is it really
>> needed here ? I mean I would write this function with ACCES_ONCE
>> moved outside the loop like as follows;

Replace ACCESS_ONCE() with volatile and you would most likely
understand that it is not what it looks like.
A very unfortunate consequence of what the macro is named.
A better name probably would have been - REALLY_REALLY_ACCESS_ONCE()

Checkout http://lwn.net/Articles/624126/ for some obscure bugs and
future plans for this.



More information about the Kernelnewbies mailing list