1

rcu_dereference()谁能解释和有什么区别rcu_dereference_protected()

rcu_dereference()包含屏障代码并且rcu_dereference_protected()不包含。

何时使用rcu_dereference(),何时使用rcu_dereference_protected()

4

1 回答 1

7

简而言之:

  • rcu_dereference()应在读取端使用,受保护rcu_read_lock()或类似。
  • rcu_dereference_protected()应该由单个写入者在写入端更新端)使用,或者受锁保护,以防止多个写入者同时修改取消引用的指针。在这种情况下,指针不能在当前线程之外被修改,因此既不需要编译器也不需要 cpu 屏障。

如果有疑问,使用rcu_dereference总是安全的,并且它的性能惩罚(与 相比rcu_dereference_protected)很低。

内核 4.6 中的确切描述rcu_dereference_protected

/**
 * rcu_dereference_protected() - fetch RCU pointer when updates prevented
 * @p: The pointer to read, prior to dereferencing
 * @c: The conditions under which the dereference will take place
 *
 * Return the value of the specified RCU-protected pointer, but omit
 * both the smp_read_barrier_depends() and the READ_ONCE().  This
 * is useful in cases where update-side locks prevent the value of the
 * pointer from changing.  Please note that this primitive does -not-
 * prevent the compiler from repeating this reference or combining it
 * with other references, so it should not be used without protection
 * of appropriate locks.
 *
 * This function is only for update-side use.  Using this function
 * when protected only by rcu_read_lock() will result in infrequent
 * but very ugly failures.
 */
于 2016-08-31T19:39:06.697 回答