Re: Q: smp.c && barriers (Was: [PATCH 1/4] generic-smp: remove single ipi fallback for smp_call_function_many())

Peter Zijlstra
2009-02-16T21:45:47Z

On Mon, 2009-02-16 at 22:32 +0100, Oleg Nesterov wrote:
> > I was about to write a response, but found it to be a justification for
> > the read_barrier_depends() at the end of the loop.
>
> I forgot to mention I don't understand the read_barrier_depends() at the
> end of the loop as well ;)

Suppose cpu0 adds to csd to cpu1:

cpu0: cpu1:

add entry1
mb();
send ipi
run ipi handler
read_barrier_depends()
while (!list_empty()) [A]
do foo

add entry2
mb();
[no ipi -- we still observe entry1]

remove foo
read_barrier_depends()
while (!list_empty()) [B]

The read_barrier_depends() matches the mb() on the other cpu, without
which the 'new' entry might not be observed.

So it turns out the initial one is needed as well.