|
@@ -364,7 +364,7 @@ uses of RCU may be found in listRCU.txt, arrayRCU.txt, and NMI-RCU.txt.
|
|
|
};
|
|
|
DEFINE_SPINLOCK(foo_mutex);
|
|
|
|
|
|
- struct foo *gbl_foo;
|
|
|
+ struct foo __rcu *gbl_foo;
|
|
|
|
|
|
/*
|
|
|
* Create a new struct foo that is the same as the one currently
|
|
@@ -386,7 +386,7 @@ uses of RCU may be found in listRCU.txt, arrayRCU.txt, and NMI-RCU.txt.
|
|
|
|
|
|
new_fp = kmalloc(sizeof(*new_fp), GFP_KERNEL);
|
|
|
spin_lock(&foo_mutex);
|
|
|
- old_fp = gbl_foo;
|
|
|
+ old_fp = rcu_dereference_protected(gbl_foo, lockdep_is_held(&foo_mutex));
|
|
|
*new_fp = *old_fp;
|
|
|
new_fp->a = new_a;
|
|
|
rcu_assign_pointer(gbl_foo, new_fp);
|
|
@@ -487,7 +487,7 @@ The foo_update_a() function might then be written as follows:
|
|
|
|
|
|
new_fp = kmalloc(sizeof(*new_fp), GFP_KERNEL);
|
|
|
spin_lock(&foo_mutex);
|
|
|
- old_fp = gbl_foo;
|
|
|
+ old_fp = rcu_dereference_protected(gbl_foo, lockdep_is_held(&foo_mutex));
|
|
|
*new_fp = *old_fp;
|
|
|
new_fp->a = new_a;
|
|
|
rcu_assign_pointer(gbl_foo, new_fp);
|