On 28/07/2015 12:33, Wen Congyang wrote: > On 07/28/2015 06:18 PM, Paolo Bonzini wrote: >> >> >> On 28/07/2015 12:02, Wen Congyang wrote: >>> I have a question about rcu: while do we call wait_for_readers() >>> twice for 32-bit host? >> >> Because there is a very small but non-zero probability of the counter >> going up by exactly 2^31 periods (periods are stored in bits 1-31 so you >> lose one bit) while the thread is sleeping. This detail of the >> implementation comes from URCU. > > Yes, so you use rcu_gp_ctr ^ RCU_GP_CTR to instead of rcu_gp_ctr + RCU_GP_CTR. > The initial value is 1, so rcu_gp_ctr is: 1, 3, 1, 3, ... > The rcu_gp_ctr will never be 0. I think calling wait_for_readers() once is > enough. > > Do I miss something?
If you call it just once, you have the same problem as before. In fact, it's worse because instead of having an overflow every 2^31 periods, you have one every 2 periods. Instead, by checking that rcu_reader went through 1 _and_ 3 (or that it was at least once 0, i.e. the thread was quiescent), you are sure that the thread went through _at least one_ grace period. Paolo