为什么`synchronize_rcu()`在读取锁定块内调用时没有死锁?

synchronize_rcu()用于仅等待正在进行的RCU读取端关键部分完成。 如果是这样,它应该在读取块内调用时永远被阻止。 但是,以下代码在我的linux内核上运行良好,为什么?

 void port_range_clean( void ) { struct port_range *p; redo: rcu_read_lock(); list_for_each_entry_rcu(p, &port_rt->ports, list) { list_del_rcu(&p->list); synchronize_rcu(); rcu_read_unlock(); kfree(p); goto redo; } }