rcu_assign_pointer() 可以用在 rcu_read_lock() 和 rcu_read_unlock() 之间吗?

Can rcu_assign_pointer() be used between rcu_read_lock() and rcu_read_unlock()?

一开始,我有一个 CPU 核心作为写共享数据的写入器和一个 reader 核心来读取共享数据。
我需要 reader 写回一些数据以共享数据。
我知道 rcu_read_lock()/rcu_read_unlock() 用于 reader 来获取共享数据。但是我不确定 reader 回写共享数据会导致什么问题?

在reader中:

 rcu_read_lock();
 //get shared data
 //modify the data 
 rcu_assign_pointer(ptr1, ptr2)
 rcu_read_unlock();

此代码有效吗?

RCU 的一个相当基本的 属性 是多个编写器之间的协调是通过另一种机制处理的,例如传统锁。 RCU 将保证 readers 看到一致的数据视图,并且他们正在使用的指针在完成之前不会被释放,但它不会对同时发生的不同线程的多个更新进行排序。

RCU 确实保证可以从 reader 升级到作家状态。这可以通过在意识到需要更新时获取自旋锁来完成。在调用 synchronize_rcu 之前必须退出 rcu_read_lock/rcu_read_unlock 块,但是 call_rcu 可以在块内排队回调。

不允许在 rcu_read_lock/rcu_read_unlock 块内进行阻塞,因此在此类内部使用阻塞互斥体管理编写器互斥将不起作用。

参见 kernel.org RCU read-to-write upgrade