rcu_dereference()¶
Purpose¶
rcu_dereference() safely acquires a pointer protected by RCU.
It provides the required memory-ordering guarantees so that readers observe a fully initialized object published by rcu_assign_pointer().
Prototype¶
Header¶
Usage Pattern¶
struct my_object *obj;
rcu_read_lock();
obj = rcu_dereference(g_obj);
if (obj)
use_object(obj);
rcu_read_unlock();
Why Not Direct Pointer Access?¶
Incorrect:
Although this appears to work, it does not provide the required memory-ordering guarantees.
The compiler or CPU may reorder memory operations.
Readers could potentially observe:
Publication Pair¶
rcu_dereference() is paired with:
Writer:
new = kmalloc(sizeof(*new), GFP_KERNEL);
new->version = 1;
new->value = 100;
rcu_assign_pointer(g_obj, new);
Reader:
rcu_read_lock();
obj = rcu_dereference(g_obj);
if (obj)
printk("%d\n", obj->value);
rcu_read_unlock();
Memory Ordering¶
Conceptually:
Writer:
Reader:
This ordering ensures that readers see a fully initialized object.
Typical Use Case¶
RCU-protected global pointer:
Reader:
struct device_entry *dev;
rcu_read_lock();
dev = rcu_dereference(g_device);
if (dev)
process_device(dev);
rcu_read_unlock();
Common Mistake¶
Incorrect:
The pointer is loaded directly.
Correct:
Relationship to RCU Read-Side Critical Sections¶
rcu_dereference() should normally be used inside:
This guarantees that the object remains valid while being accessed.