Atin Mukherjee talks about several interesting details on how to use RCU.
My only quirk is on slide 8 "Different Locking Primitives", RCU is not a locking primitive in the sense that it doesn't provide mutual exclusion by itself, but it's hard to explain exactly what it does, so it's ok to put it on the same slide.
He even talks about a bug in their code where they did something like:
// do some stuff
synchronize_rcu(); // This will deadlock
This happens because we can't call synchronize_rcu() from within a block of code protected with rcu_read_lock().
It's interesting that they went with the Bullet-Proof RCU variant, which just shows that most software engineers are willing to sacrifice a small amount of performance if it gives them more flexibility and ease-of-use (myself included).