net: netif_tx_queue_stopped too expensive
Subsystems (2)
PATCH 1/1 net: netif_tx_queue_stopped too expensive
netif_tx_queue_stopped(txq) is most of the time false.
Yet its cost is very expensive on SMP.
static inline int netif_tx_queue_stopped(const struct netdev_queue *dev_queue)
{
return test_bit(__QUEUE_STATE_XOFF, &dev_queue->state);
}I saw this on oprofile hunting and bnx2 driver bnx2_tx_int().
We probably should split "struct netdev_queue" in two parts, one being read mostly.
__netif_tx_lock() touches _xmit_lock & xmit_lock_owner, these deserve a separate cache line.
Signed-off-by Eric Dumazet <[email protected]>
include/linux/netdevice.h +8 -2
@@ -447,12 +447,18 @@ enum netdev_queue_state_t };struct netdev_queue { +/* +* read mostly part +*/ struct net_device *dev;struct Qdisc *qdisc;unsigned long state; -spinlock_t _xmit_lock; -int xmit_lock_owner;struct Qdisc *qdisc_sleeping; +/* +* write mostly part +*/ +spinlock_t _xmit_lock____cacheline_aligned_in_smp ; +int xmit_lock_owner; }____cacheline_aligned_in_smp ;
David Miller
maintainerFrom: Eric Dumazet <[email protected]>
Date: Tue, 28 Apr 2009 11:32:20 +0200
Quoted 3 lines
netif_tx_queue_stopped(txq)is most of the time false.Yet its cost is very expensive on SMP.
...
Quoted 1 line
Signed-off-by Eric Dumazet <[email protected]>
Fair enough, applied to net-next-2.6, thanks Eric.