Re: [Lse-tech] [RFC, PATCH] 2/5 rcu lock update: Use a sequence lockfor starting batches
From: Manfred Spraul
Date: Fri May 28 2004 - 09:00:29 EST
Paul E. McKenney wrote:
Hello, Manfred,
I am still digging through these, and things look quite good in general,
but I have a question on your second patch.
Let's assume that
batch.completed = 5;
batch.cur = 5;
batch.next_pending = 0;
Given the following sequence of events:
1. CPU 0 executes the
rcu_ctrlblk.batch.next_pending = 1;
batch.next_pending = 1.
at the beginning of rcu_start_batch().
2. CPU 1 executes the read_seqcount code sequence in
rcu_process_callbacks(), setting RCU_batch(cpu) to
the next batch number, and setting next_pending to 1.
RCU_batch(1) is now 6.
next_pending is 1, rcu_process_callbacks continues without calling
rcu_start_batch().
3. CPU 0 executes the remainder of rcu_start_batch(),
setting rcu_ctrlblk.batch.next_pending to 0 and
incrementing rcu_ctrlblk.batch.cur.
batch.cur = 6.
4. CPU 1's state is now as if the grace period had already
completed for the callbacks that were just moved to
RCU_curlist(), which would be very bad.
AFAICS: No. RCU_batch(1) is 6 and rcu_ctrlblk.batch.completed is still
5. The test for grace period completed is
if (!list_empty(&RCU_curlist(cpu)) &&
!rcu_batch_before(rcu_ctrlblk.batch.completed,RCU_batch(cpu))) {
__list_splice(&RCU_curlist(cpu), &list);
INIT_LIST_HEAD(&RCU_curlist(cpu));
}
5 is before 6, thus the callbacks won't be processed.
The only write operation to rcu_ctrlblk.batch.completed is in cpu_quiet,
after checking that the cpu bitmap is empty and under
spin_lock(rcu_ctrlblk.state.mutex).
Thanks for looking at my patches,
--
Manfred
-
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/