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;
 }

Reply via email to