Thread (18 messages) 18 messages, 6 authors, 2011-08-17

Re: [net-next RFC PATCH 4/7] tuntap: multiqueue support

flat view

From: Eric Dumazet <hidden>
Date: 2011-08-12 14:29:41
Also in: kvm, lkml, qemu-devel

Le vendredi 12 août 2011 à 09:55 +0800, Jason Wang a écrit :
quoted hunk ↗ jump to hunk
+       rxq = skb_get_rxhash(skb);
+       if (rxq) {
+               tfile = rcu_dereference(tun->tfiles[rxq % numqueues]);
+               if (tfile)
+                       goto out;
+       }
You can avoid an expensive divide with following trick :

u32 idx = ((u64)rxq * numqueues) >> 32;


quoted hunk ↗ jump to hunk
-static struct tun_struct *tun_get(struct file *file)
+static void tun_detach_all(struct net_device *dev)
 {
-	return __tun_get(file->private_data);
+	struct tun_struct *tun = netdev_priv(dev);
+	struct tun_file *tfile, *tfile_list[MAX_TAP_QUEUES];
+	int i, j = 0;
+
+	spin_lock(&tun_lock);
+
+	for (i = 0; i < MAX_TAP_QUEUES && tun->numqueues; i++) {
+		tfile = rcu_dereference_protected(tun->tfiles[i],
+						lockdep_is_held(&tun_lock));
+		if (tfile) {
+			wake_up_all(&tfile->wq.wait);
+			tfile_list[i++] = tfile;
	typo here, you want tfile_list[j++] = tfile;
quoted hunk ↗ jump to hunk
+			rcu_assign_pointer(tun->tfiles[i], NULL);
+			rcu_assign_pointer(tfile->tun, NULL);
+			--tun->numqueues;
+		}
+	}
+	BUG_ON(tun->numqueues != 0);
+	spin_unlock(&tun_lock);
+
+	synchronize_rcu();
+	for(--j; j >= 0; j--)
+		sock_put(&tfile_list[j]->sk);
 }
 
Could you take a look at net/packet/af_packet.c, to check how David did
the whole fanout thing ?

__fanout_unlink() 

Trick is to not leave NULL entries in the tun->tfiles[] array.

It makes things easier in hot path.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help