Re: ACCESS_ONCE usage inside llist_add_batch function

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

 



On Tue, Mar 3, 2015 at 11:51 AM, John de la Garza <john@xxxxxxxxx> 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.

_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@xxxxxxxxxxxxxxxxx
http://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