[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <51035EAE.5090004@huawei.com>
Date: Sat, 26 Jan 2013 12:42:22 +0800
From: Li Zefan <lizefan@...wei.com>
To: David Miller <davem@...emloft.net>
CC: <netdev@...r.kernel.org>, Gao feng <gaofeng@...fujitsu.com>,
John Fastabend <john.r.fastabend@...el.com>,
Neil Horman <nhorman@...driver.com>
Subject: [PATCH 3.4.y 3/3] net: netprio: fix cgrp create and write priomap
race
From: John Fastabend <john.r.fastabend@...el.com>
commit 476ad154f3b41dd7d9a08a2f641e28388abc2fd1 upstream.
A race exists where creating cgroups and also updating the priomap
may result in losing a priomap update. This is because priomap
writers are not protected by rtnl_lock.
Move priority writer into rtnl_lock()/rtnl_unlock().
CC: Neil Horman <nhorman@...driver.com>
Reported-by: Al Viro <viro@...IV.linux.org.uk>
Signed-off-by: John Fastabend <john.r.fastabend@...el.com>
Acked-by: Neil Horman <nhorman@...driver.com>
Signed-off-by: David S. Miller <davem@...emloft.net>
Signed-off-by: Li Zefan <lizefan@...wei.com>
---
net/core/netprio_cgroup.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/net/core/netprio_cgroup.c b/net/core/netprio_cgroup.c
index dca347e..eb07ea9 100644
--- a/net/core/netprio_cgroup.c
+++ b/net/core/netprio_cgroup.c
@@ -112,12 +112,10 @@ static int write_update_netdev_table(struct net_device *dev)
u32 max_len;
struct netprio_map *map;
- rtnl_lock();
max_len = atomic_read(&max_prioidx) + 1;
map = rtnl_dereference(dev->priomap);
if (!map || map->priomap_len < max_len)
ret = extend_netdev_table(dev, max_len);
- rtnl_unlock();
return ret;
}
@@ -267,17 +265,17 @@ static int write_priomap(struct cgroup *cgrp, struct cftype *cft,
if (!dev)
goto out_free_devname;
+ rtnl_lock();
ret = write_update_netdev_table(dev);
if (ret < 0)
goto out_put_dev;
- rcu_read_lock();
- map = rcu_dereference(dev->priomap);
+ map = rtnl_dereference(dev->priomap);
if (map)
map->priomap[prioidx] = priority;
- rcu_read_unlock();
out_put_dev:
+ rtnl_unlock();
dev_put(dev);
out_free_devname:
--
1.8.0.2
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists