forked from mirrors/linux
		
	net: RCU locking for simple ioctl()
All ioctls() implemented by dev_ifsioc_locked() : SIOCGIFFLAGS, SIOCGIFMETRIC, SIOCGIFMTU, SIOCGIFHWADDR, SIOCGIFSLAVE, SIOCGIFMAP, SIOCGIFINDEX & SIOCGIFTXQLEN can use RCU lock instead of dev_base_lock rwlock Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									685c794405
								
							
						
					
					
						commit
						3710becf8a
					
				
					 1 changed files with 4 additions and 4 deletions
				
			
		| 
						 | 
					@ -4315,12 +4315,12 @@ int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa)
 | 
				
			||||||
EXPORT_SYMBOL(dev_set_mac_address);
 | 
					EXPORT_SYMBOL(dev_set_mac_address);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 *	Perform the SIOCxIFxxx calls, inside read_lock(dev_base_lock)
 | 
					 *	Perform the SIOCxIFxxx calls, inside rcu_read_lock()
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static int dev_ifsioc_locked(struct net *net, struct ifreq *ifr, unsigned int cmd)
 | 
					static int dev_ifsioc_locked(struct net *net, struct ifreq *ifr, unsigned int cmd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int err;
 | 
						int err;
 | 
				
			||||||
	struct net_device *dev = __dev_get_by_name(net, ifr->ifr_name);
 | 
						struct net_device *dev = dev_get_by_name_rcu(net, ifr->ifr_name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!dev)
 | 
						if (!dev)
 | 
				
			||||||
		return -ENODEV;
 | 
							return -ENODEV;
 | 
				
			||||||
| 
						 | 
					@ -4552,9 +4552,9 @@ int dev_ioctl(struct net *net, unsigned int cmd, void __user *arg)
 | 
				
			||||||
	case SIOCGIFINDEX:
 | 
						case SIOCGIFINDEX:
 | 
				
			||||||
	case SIOCGIFTXQLEN:
 | 
						case SIOCGIFTXQLEN:
 | 
				
			||||||
		dev_load(net, ifr.ifr_name);
 | 
							dev_load(net, ifr.ifr_name);
 | 
				
			||||||
		read_lock(&dev_base_lock);
 | 
							rcu_read_lock();
 | 
				
			||||||
		ret = dev_ifsioc_locked(net, &ifr, cmd);
 | 
							ret = dev_ifsioc_locked(net, &ifr, cmd);
 | 
				
			||||||
		read_unlock(&dev_base_lock);
 | 
							rcu_read_unlock();
 | 
				
			||||||
		if (!ret) {
 | 
							if (!ret) {
 | 
				
			||||||
			if (colon)
 | 
								if (colon)
 | 
				
			||||||
				*colon = ':';
 | 
									*colon = ':';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue