net: shrinks struct net_device
authorEric Dumazet <eric.dumazet@gmail.com>
Thu, 16 Sep 2010 02:58:13 +0000 (02:58 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 17 Sep 2010 04:58:44 +0000 (21:58 -0700)
commit ab95bfe01 (net: replace hooks in __netif_receive_skb) added
rx_handler at wrong place, between two cache line aligned objects,
creating a big hole (a full cache line)

Move rx_handler and rx_handler_data before rx_queue, filling existing
hole.

Move master field in the cache line(s) used in receive path.

This saves 64 bytes (or L1_CACHE_BYTES), and avoids two possible
cache misses in receive path.

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/netdevice.h

index 8992fffb810412c0d7d8107efbb0c0140d452f35..ec17887a5bca4cf2c1b72251a5474844e77a6709 100644 (file)
@@ -918,10 +918,6 @@ struct net_device {
        unsigned short          needed_headroom;
        unsigned short          needed_tailroom;
 
-       struct net_device       *master; /* Pointer to master device of a group,
-                                         * which this device is member of.
-                                         */
-
        /* Interface address info. */
        unsigned char           perm_addr[MAX_ADDR_LEN]; /* permanent hw address */
        unsigned char           addr_assign_type; /* hw address assignment type */
@@ -951,7 +947,7 @@ struct net_device {
                                                   assign before registering */
 
 /*
- * Cache line mostly used on receive path (including eth_type_trans())
+ * Cache lines mostly used on receive path (including eth_type_trans())
  */
        unsigned long           last_rx;        /* Time of last Rx
                                                 * This should not be set in
@@ -961,6 +957,10 @@ struct net_device {
                                                 * avoid dirtying this cache line.
                                                 */
 
+       struct net_device       *master; /* Pointer to master device of a group,
+                                         * which this device is member of.
+                                         */
+
        /* Interface address info used in eth_type_trans() */
        unsigned char           *dev_addr;      /* hw address, (before bcast
                                                   because most packets are
@@ -980,10 +980,14 @@ struct net_device {
        unsigned int            num_rx_queues;
 #endif
 
-       struct netdev_queue     rx_queue;
        rx_handler_func_t       *rx_handler;
        void                    *rx_handler_data;
 
+       struct netdev_queue     rx_queue; /* use two cache lines */
+
+/*
+ * Cache lines mostly used on transmit path
+ */
        struct netdev_queue     *_tx ____cacheline_aligned_in_smp;
 
        /* Number of TX queues allocated at alloc_netdev_mq() time  */
@@ -997,9 +1001,7 @@ struct net_device {
 
        unsigned long           tx_queue_len;   /* Max frames per queue allowed */
        spinlock_t              tx_global_lock;
-/*
- * One part is mostly used on xmit path (device)
- */
+
        /* These may be needed for future network-power-down code. */
 
        /*