Skip to contentSkip to conversation

net: sock_bindtodevice() RCU-ification

PATCH Applied Eric Dumazet 2 participants 5 messages Nov 4, 2009 – Nov 6, 2009

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 net: sock_bindtodevice() RCU-ification

Avoid dev_hold()/dev_put() in sock_bindtodevice()

---
 net/core/sock.c |   10 ++++++----
 1 files changed, 6 insertions(+), 4 deletions(-)
net/core/sock.c +6 -4
index 5a51512..38820ea 100644
@@ -420,14 +420,16 @@ static int sock_bindtodevice(struct sock *sk, char __user *optval, int optlen)
 	if (devname[0] == '\0') {
 		index = 0;
 	} else {
-		struct net_device *dev = dev_get_by_name(net, devname);
+		struct net_device *dev;
 
+		rcu_read_lock();
+		dev = dev_get_by_name_rcu(net, devname);
+		if (dev)
+			index = dev->ifindex;
+		rcu_read_unlock();
 		ret = -ENODEV;
 		if (!dev)
 			goto out;
-
-		index = dev->ifindex;
-		dev_put(dev);
 	}
 
 	lock_sock(sk);
maintainer
#2 lore raw

From: David Miller <[email protected]>
Date: Thu, 05 Nov 2009 21:08:30 -0800 (PST)

Quoted 8 lines

From: Eric Dumazet <[email protected]>
Date: Wed, 04 Nov 2009 23:36:44 +0100

Quoted 3 lines

Avoid dev_hold()/dev_put() in sock_bindtodevice()

Applied to net-next-2.6, thanks.

Eric I had to add the following patch to cure a build warning after this, just FYI:

net: Fix build warning in sock_bindtodevice().

net/core/sock.c: In function 'sock_setsockopt':
net/core/sock.c:396: warning: 'index' may be used uninitialized in this function net/core/sock.c:396: note: 'index' was declared here

GCC can't see that all paths initialize index, so just set it to the default (0) and eliminate the specific code block that handles the null device name string.

---
 net/core/sock.c |    5 ++---
 1 files changed, 2 insertions(+), 3 deletions(-)
net/core/sock.c +2 -3
index 38820ea..76ff58d 100644
@@ -417,9 +417,8 @@ static int sock_bindtodevice(struct sock *sk, char __user *optval, int optlen)
 	if (copy_from_user(devname, optval, optlen))
 		goto out;
 
-	if (devname[0] == '\0') {
-		index = 0;
-	} else {
+	index = 0;
+	if (devname[0] != '\0') {
 		struct net_device *dev;
 
 		rcu_read_lock();
Signature · 1 line
1.6.5.2
#3 lore raw
Quoted 16 lines · David Miller

From: David Miller <[email protected]>
Date: Thu, 05 Nov 2009 21:08:30 -0800 (PST)

Quoted 7 lines

From: Eric Dumazet <[email protected]>
Date: Wed, 04 Nov 2009 23:36:44 +0100

Quoted 3 lines

Avoid dev_hold()/dev_put() in sock_bindtodevice()

Applied to net-next-2.6, thanks.

Eric I had to add the following patch to cure a build warning after this, just FYI:

net: Fix build warning in sock_bindtodevice().

Quoted 8 lines

net/core/sock.c: In function 'sock_setsockopt':
net/core/sock.c:396: warning: 'index' may be used uninitialized in this function net/core/sock.c:396: note: 'index' was declared here

GCC can't see that all paths initialize index, so just set it to the default (0) and eliminate the specific code block that handles the null device name string.

Thanks David, which gcc version are you using ?

maintainer
#4 lore raw

From: Eric Dumazet <[email protected]>
Date: Fri, 06 Nov 2009 08:08:59 +0100

Quoted 1 line

Thanks David, which gcc version are you using ?

I'm using "gcc-4.2.4 (Ubuntu 4.2.4-1ubuntu3)" on sparc.