Messages in this thread | | | From | Arnd Bergmann <> | Subject | Re: [RFC local_t removal V1 1/4] Add add_local() and add_local_return() | Date | Thu, 7 Jan 2010 15:22:30 +0100 |
| |
On Thursday 07 January 2010, Mathieu Desnoyers wrote: > * Arnd Bergmann (arnd@arndb.de) wrote: > > > > + local_irq_save(flags); > > > > + switch (size) { > > > > + case 1: r = (*((u8 *)ptr) += value); > > > > + break; > > > > + case 2: r = (*((u16 *)ptr) += value); > > > > + break; > > > > + case 4: r = (*((u32 *)ptr) += value); > > > > + break; > > > > + case 8: r = (*((u64 *)ptr) += value); > > > > + break; > > > > But I think here you actually need to add the volatile in order > > to make these atomic assignments. > > Yes, you are right. If we ever try to access these variables from a > remote CPU with a load (but not with any concurrent store operation, as > this would be semantically invalid), then the volatile is important.
Just to make sure everyone has the same understanding: We need the volatile in the cast in these lines, not the one in the function prototype which only serves to avoid warnings but has no impact on the object code when we cast the pointer to a non-volatile type for the assignment.
Arnd
| |