> > > rcu_read_lock();
> > > map = rcu_dereference(d->cur_map)
> > > if (unlikely(d->prev_map!=map) {
> > > d->root = map->root;
> > > d->pgtbl = map->pgtbl;
> > > }
> > > ......
> > > rcu_read_unlock();
> > >
> > > Then it can avoid ABA problem.
> >
> > I don't see the assignment of prev_map, which is where the ABA problem
> > arises.
If you do this:
> rcu_read_lock();
> map = rcu_derefenrence(d->cur_map)
> if (unlikely(d->prev_map!=map) {
> d->root = map->root;
> d->pgtbl = map->pgtbl;
> d->prev_map = map;
> }
> ....
> rcu_read_unlock();
It can happen. The problem is that prev_map can change _after_
the rcu_read_unlock. It is the same as your previous solution.
Please just use the load-and-check idiom. I'll post my RCU
implementation as soon as I finish the documentation.
Paolo