Skip to content
  • Denis Vlasenko's avatar
    [NET]: Deinline some larger functions from netdevice.h · 56079431
    Denis Vlasenko authored
    
    
    On a allyesconfig'ured kernel:
    
    Size  Uses Wasted Name and definition
    ===== ==== ====== ================================================
       95  162  12075 netif_wake_queue      include/linux/netdevice.h
      129   86   9265 dev_kfree_skb_any     include/linux/netdevice.h
      127   56   5885 netif_device_attach   include/linux/netdevice.h
       73   86   4505 dev_kfree_skb_irq     include/linux/netdevice.h
       46   60   1534 netif_device_detach   include/linux/netdevice.h
      119   16   1485 __netif_rx_schedule   include/linux/netdevice.h
      143    5    492 netif_rx_schedule     include/linux/netdevice.h
       81    7    366 netif_schedule        include/linux/netdevice.h
    
    netif_wake_queue is big because __netif_schedule is a big inline:
    
    static inline void __netif_schedule(struct net_device *dev)
    {
            if (!test_and_set_bit(__LINK_STATE_SCHED, &dev->state)) {
                    unsigned long flags;
                    struct softnet_data *sd;
    
                    local_irq_save(flags);
                    sd = &__get_cpu_var(softnet_data);
                    dev->next_sched = sd->output_queue;
                    sd->output_queue = dev;
                    raise_softirq_irqoff(NET_TX_SOFTIRQ);
                    local_irq_restore(flags);
            }
    }
    
    static inline void netif_wake_queue(struct net_device *dev)
    {
    #ifdef CONFIG_NETPOLL_TRAP
            if (netpoll_trap())
                    return;
    #endif
            if (test_and_clear_bit(__LINK_STATE_XOFF, &dev->state))
                    __netif_schedule(dev);
    }
    
    By de-inlining __netif_schedule we are saving a lot of text
    at each callsite of netif_wake_queue and netif_schedule.
    __netif_rx_schedule is also big, and it makes more sense to keep
    both of them out of line.
    
    Patch also deinlines dev_kfree_skb_any. We can deinline dev_kfree_skb_irq
    instead... oh well.
    
    netif_device_attach/detach are not hot paths, we can deinline them too.
    
    Signed-off-by: default avatarDenis Vlasenko <vda@ilport.com.ua>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    56079431