[Devel] [PATCH rh7] vznetstat: fix RCU-protected "info_V{4, 6}" pointers initialization
Stanislav Kinsburskiy
skinsbursky at virtuozzo.com
Thu Nov 12 05:42:39 PST 2015
This pointers have to be referenced and assigned under rcu_read_lock().
Moreover, there is no need to take tc_lock: it protects stats hash, but not
info pointers.
Fixes the following warning:
[ 31.658913] ===============================
[ 31.659035] [ INFO: suspicious RCU usage. ]
[ 31.659155] 3.10.0+ #121 Not tainted
[ 31.659258] -------------------------------
[ 31.659377] kernel/ve/vznetstat/vznetstat.c:95 suspicious
rcu_dereference_check() usage!
[ 31.659597]
[ 31.659597] other info that might help us debug this:
[ 31.659597]
[ 31.659831]
[ 31.659831] rcu_scheduler_active = 1, debug_locks = 0
[ 31.660026] 1 lock held by vztactl/831:
[ 31.660136] #0: (tc_lock){.+.+..}, at: [<ffffffffa0052e64>]
venet_acct_set_classes+0xf4/0x240 [vznetstat]
[ 31.660454]
[ 31.660454] stack backtrace:
[ 31.660584] CPU: 0 PID: 831 Comm: vztactl ve: 0 Not tainted 3.10.0+ #121
ovz.9.8-21-g6c64ed7
[ 31.660823] Hardware name: Parallels Software International Inc. Parallels
Virtual Platform/Parallels Virtual Platform, BIOS 6.9.23856.1122235 03/18/2015
[ 31.661201] 0000000000000000 000000003e77c710 ffff8800a960bd88
ffffffff816298fe
[ 31.661436] ffff8800a960bdb8 ffffffff810f9667 0000000000000000
ffff8801446e2f08
[ 31.661661] 0000000000000000 000000000000000c ffff8800a960bdf0
ffffffffa0052f61
[ 31.661910] Call Trace:
[ 31.661989] [<ffffffff816298fe>] dump_stack+0x19/0x1b
[ 31.662134] [<ffffffff810f9667>] lockdep_rcu_suspicious+0xe7/0x120
[ 31.662308] [<ffffffffa0052f61>] venet_acct_set_classes+0x1f1/0x240
[vznetstat]
[ 31.662511] [<ffffffffa005390b>] venet_acct_ioctl+0x2bb/0xaf0 [vznetstat]
[ 31.662706] [<ffffffffa003f0d5>] vzctl_ioctl+0x45/0x60 [vzdev]
[ 31.662875] [<ffffffff812296d5>] do_vfs_ioctl+0x265/0x540
[ 31.663041] [<ffffffff81236177>] ? fget_light+0x377/0x4e0
[ 31.663193] [<ffffffff81229a04>] SyS_ioctl+0x54/0xa0
[ 31.663334] [<ffffffff8163bf09>] system_call_fastpath+0x16/0x1b
Signed-off-by: Stanislav Kinsburskiy <skinsbursky at virtuozzo.com>
---
kernel/ve/vznetstat/vznetstat.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/kernel/ve/vznetstat/vznetstat.c b/kernel/ve/vznetstat/vznetstat.c
index 99feafb..c47865a 100644
--- a/kernel/ve/vznetstat/vznetstat.c
+++ b/kernel/ve/vznetstat/vznetstat.c
@@ -87,7 +87,7 @@ static int venet_acct_set_classes(const void __user *user_info, int length, int
goto out_free;
}
- write_lock_irq(&tc_lock);
+ rcu_read_lock();
if (v6) {
old = rcu_dereference(info_v6);
rcu_assign_pointer(info_v6, info);
@@ -95,7 +95,7 @@ static int venet_acct_set_classes(const void __user *user_info, int length, int
old = rcu_dereference(info_v4);
rcu_assign_pointer(info_v4, info);
}
- write_unlock_irq(&tc_lock);
+ rcu_read_unlock();
synchronize_net();
/* IMPORTANT. I think reset of statistics collected should not be
More information about the Devel
mailing list