rcu_read_unlock_special
union rcu_special rcu_read_unlock_special;
.rcu_read_unlock_special.s = 0,
p->rcu_read_unlock_special.s = 0;
t->rcu_read_unlock_special.b.exp_hint = true;
static void rcu_read_unlock_special(struct task_struct *t);
WRITE_ONCE(current->rcu_read_unlock_special.b.need_qs, false);
!t->rcu_read_unlock_special.b.blocked) {
t->rcu_read_unlock_special.b.blocked = true;
WRITE_ONCE(current->rcu_read_unlock_special.b.need_qs, true);
if (unlikely(READ_ONCE(t->rcu_read_unlock_special.s)))
rcu_read_unlock_special(t);
special = t->rcu_read_unlock_special;
t->rcu_read_unlock_special.s = 0;
READ_ONCE(t->rcu_read_unlock_special.s)) &&
!t->rcu_read_unlock_special.b.need_qs &&
t->rcu_read_unlock_special.b.need_qs = true;
WRITE_ONCE(t->rcu_read_unlock_special.b.blocked, true);
rscrp->rs = t->rcu_read_unlock_special;