1. Indeed, the upgrade-to-update change would be visible to the remainder of the RCU read-side
critical section. However, in a surprisingly large number of cases, there is no need for
additional verification steps (though verification can be used when needed). This is a key
difference between RCU and non-blocking synchronization (NBS) -- NBS would absolutely require
the validation steps in order to avoid memory corruption.
2. Good point -- although rcu_assign_pointer(head, NULL) is superfluous, it is good practice,
and there is no performance penalty.
3. Good eyes!!!