Hi David
This is an RFC, based on net-2.6 for convenience only.
Thank you
[RFC,PATCH] loopback: calls netif_receive_skb() instead of netif_rx()
Loopback transmit function loopback_xmit() actually calls netif_rx() to
queue
a skb to the softnet queue, and arms a softirq so that this skb can be
handled later.
This has a cost on SMP, because we need to hold a reference on the
device, and free this
reference when softirq dequeues packet.
Following patch directly calls netif_receive_skb() and avoids lot of
atomic operations.
(atomic_inc(&dev->refcnt), set_and_set_bit(NAPI_STATE_SCHED, &n->state), ...
atomic_dec(&dev->refcnt)...), cache line ping-pongs on device refcnt,
but also softirq overhead.
This gives a nice boost on tbench for example (5 % on my machine)
Signed-off-by: Eric Dumazet <[EMAIL PROTECTED]>
diff --git a/drivers/net/loopback.c b/drivers/net/loopback.c
index f2a6e71..9bed7ed 100644
--- a/drivers/net/loopback.c
+++ b/drivers/net/loopback.c
@@ -158,7 +158,7 @@ static int loopback_xmit(struct sk_buff *skb, struct
net_device *dev)
lb_stats->bytes += skb->len;
lb_stats->packets++;
- netif_rx(skb);
+ netif_receive_skb(skb);
return 0;
}