On Tuesday 10 June 2008 05:00:36 Christoph Lameter wrote: > On Fri, 6 Jun 2008, Rusty Russell wrote: > > > Also, the above cpu_local_wrap(...) adds: > > > > > > #define cpu_local_wrap(l) \ > > > ({ \ > > > preempt_disable(); \ > > > (l); \ > > > preempt_enable(); \ > > > }) \ > > > > > > ... and there isn't a non-preemption version that I can find. > > > > Yes, this should be fixed. I thought i386 had optimized versions > > pre-merge, but I was wrong (%gs for per-cpu came later, and noone cleaned > > up these naive versions). Did you want me to write them? > > How can that be fixed? You have no atomic instruction that calculates the > per cpu address in one go. Huh? "incl %fs:varname" does exactly this. > And as long as that is the case you need to > disable preempt. Otherwise you may increment the per cpu variable of > another processor because the process was rescheduled after the address > was calculated but before the increment was done. But of course, that is not a problem. You make local_t an atomic_t, and then it doesn't matter which CPU you incremented. By definition if the caller cared, they would have had premption disabled. Hope that clarifies, Rusty. -- To unsubscribe from this list: send the line "unsubscribe linux-arch" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html