aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2011-10-20 00:26:39 -0400
committerDavid S. Miller <davem@davemloft.net>2011-10-21 02:53:07 -0400
commit047af9cfedfa357e1497e327eaa893253ca51971 (patch)
treef4b18244c9daeea9a04b68a0fc050960e5c42507 /drivers/net
parent99f34b38cdc8f75a4b9adb5a617b118253b3efe1 (diff)
macvtap: Fix macvtap_open races in the zero copy enable code.
To see if it is appropriate to enable the macvtap zero copy feature don't test the lowerdev network device flags. Instead test the macvtap network device flags which are a direct copy of the lowerdev flags. This is important because nothing holds a reference to lowerdev and on a very bad day we lowerdev could be a pointer to stale memory. Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/macvtap.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c
index 70aa628834f0..1d9c9c209672 100644
--- a/drivers/net/macvtap.c
+++ b/drivers/net/macvtap.c
@@ -343,7 +343,6 @@ static int macvtap_open(struct inode *inode, struct file *file)
343{ 343{
344 struct net *net = current->nsproxy->net_ns; 344 struct net *net = current->nsproxy->net_ns;
345 struct net_device *dev = dev_get_by_index(net, iminor(inode)); 345 struct net_device *dev = dev_get_by_index(net, iminor(inode));
346 struct macvlan_dev *vlan = netdev_priv(dev);
347 struct macvtap_queue *q; 346 struct macvtap_queue *q;
348 int err; 347 int err;
349 348
@@ -376,12 +375,12 @@ static int macvtap_open(struct inode *inode, struct file *file)
376 /* 375 /*
377 * so far only KVM virtio_net uses macvtap, enable zero copy between 376 * so far only KVM virtio_net uses macvtap, enable zero copy between
378 * guest kernel and host kernel when lower device supports zerocopy 377 * guest kernel and host kernel when lower device supports zerocopy
378 *
379 * The macvlan supports zerocopy iff the lower device supports zero
380 * copy so we don't have to look at the lower device directly.
379 */ 381 */
380 if (vlan) { 382 if ((dev->features & NETIF_F_HIGHDMA) && (dev->features & NETIF_F_SG))
381 if ((vlan->lowerdev->features & NETIF_F_HIGHDMA) && 383 sock_set_flag(&q->sk, SOCK_ZEROCOPY);
382 (vlan->lowerdev->features & NETIF_F_SG))
383 sock_set_flag(&q->sk, SOCK_ZEROCOPY);
384 }
385 384
386 err = macvtap_set_queue(dev, file, q); 385 err = macvtap_set_queue(dev, file, q);
387 if (err) 386 if (err)