Re: [RFC 1/6] Framework

From: Christoph Lameter
Date: Mon Dec 12 2005 - 11:32:17 EST


On Sat, 10 Dec 2005, Andi Kleen wrote:

> > +#define global_page_state(__x) atomic_long_read(&vm_stat[__x])
> > +#define zone_page_state(__z,__x) atomic_long_read(&(__z)->vm_stat[__x])
> > +extern unsigned long node_page_state(int node, enum zone_stat_item);
> > +
> > +/*
> > + * For use when we know that interrupts are disabled.
>
> Why do you need to disable interupts for atomic_t ?

Interrupts need to be disabled because the processing of the byte sized
differential could be interrupted.

> If you just want to prevent switching CPUs that could be
> done with get_cpu(), but alternatively you could just ignore
> that race (it wouldn't be a big issue to still increment
> the counter on the old CPU)

There is no increment or decrement right now. We add an offset and that
offset could easily burst the limits of a byte sized differential. A check
needs to happen before the differential is updated.

> And why atomic and not just local_t? On x86/x86-64 local_t
> would be much cheaper at least. It's not long, but that could
> be as well added.

local_t is long on ia64.

The atomics are used for global updates of counters in struct zone and the
vm_stats array. local_t wont help there.

local_t could be used for the differentials. Special functions for
increment and decrement could use the non-interruptible nature of inc/decs
on i386 and x86_64.

There is no byte sized local_t though so its difficult to use local_t
here. I think this whole local_t stuff is not too useful after all.
Could we add an incp/decp macro that is like cmpxchg? That macro should
be able to operation on various sizes of counters.
-
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/