Re: [RFC local_t removal V1 1/4] Add add_local() and add_local_return()

From: Arnd Bergmann
Date: Thu Jan 07 2010 - 09:22:46 EST


On Thursday 07 January 2010, Mathieu Desnoyers wrote:
> * Arnd Bergmann (arnd@xxxxxxxx) 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
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/