diff options
Diffstat (limited to 'net/core/netprio_cgroup.c')
| -rw-r--r-- | net/core/netprio_cgroup.c | 30 | 
1 files changed, 7 insertions, 23 deletions
diff --git a/net/core/netprio_cgroup.c b/net/core/netprio_cgroup.c index ed0c0431fcd8..c75e3f9d060f 100644 --- a/net/core/netprio_cgroup.c +++ b/net/core/netprio_cgroup.c @@ -101,12 +101,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;  } @@ -256,17 +254,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: @@ -277,12 +275,6 @@ out_free_devname:  void net_prio_attach(struct cgroup *cgrp, struct cgroup_taskset *tset)  {  	struct task_struct *p; -	char *tmp = kzalloc(sizeof(char) * PATH_MAX, GFP_KERNEL); - -	if (!tmp) { -		pr_warn("Unable to attach cgrp due to alloc failure!\n"); -		return; -	}  	cgroup_taskset_for_each(p, cgrp, tset) {  		unsigned int fd; @@ -296,32 +288,24 @@ void net_prio_attach(struct cgroup *cgrp, struct cgroup_taskset *tset)  			continue;  		} -		rcu_read_lock(); +		spin_lock(&files->file_lock);  		fdt = files_fdtable(files);  		for (fd = 0; fd < fdt->max_fds; fd++) { -			char *path;  			struct file *file;  			struct socket *sock; -			unsigned long s; -			int rv, err = 0; +			int err;  			file = fcheck_files(files, fd);  			if (!file)  				continue; -			path = d_path(&file->f_path, tmp, PAGE_SIZE); -			rv = sscanf(path, "socket:[%lu]", &s); -			if (rv <= 0) -				continue; -  			sock = sock_from_file(file, &err); -			if (!err) +			if (sock)  				sock_update_netprioidx(sock->sk, p);  		} -		rcu_read_unlock(); +		spin_unlock(&files->file_lock);  		task_unlock(p);  	} -	kfree(tmp);  }  static struct cftype ss_files[] = {  |