• Sebastian Andrzej Siewior's avatar
    net: dev: Makes sure netif_rx() can be invoked in any context. · baebdf48
    Sebastian Andrzej Siewior authored
    Dave suggested a while ago (eleven years by now) "Let's make netif_rx()
    work in all contexts and get rid of netif_rx_ni()". Eric agreed and
    pointed out that modern devices should use netif_receive_skb() to avoid
    the overhead.
    In the meantime someone added another variant, netif_rx_any_context(),
    which behaves as suggested.
    
    netif_rx() must be invoked with disabled bottom halves to ensure that
    pending softirqs, which were raised within the function, are handled.
    netif_rx_ni() can be invoked only from process context (bottom halves
    must be enabled) because the function handles pending softirqs without
    checking if bottom halves were disabled or not.
    netif_rx_any_context() invokes on the former functions by checking
    in_interrupts().
    
    netif_rx() could be taught to handle both cases (disabled and enabled
    bottom halves) by simply disabling bottom halves while invoking
    netif_rx_internal(). The local_bh_enable() invocation will then invoke
    pending softirqs only if the BH-disable counter drops to zero.
    
    Eric is concerned about the overhead of BH-disable+enable especially in
    regard to the loopback driver. As critical as this driver is, it will
    receive a shortcut to avoid the additional overhead which is not needed.
    
    Add a local_bh_disable() section in netif_rx() to ensure softirqs are
    handled if needed.
    Provide __netif_rx() which does not disable BH and has a lockdep assert
    to ensure that interrupts are disabled. Use this shortcut in the
    loopback driver and in drivers/net/*.c.
    Make netif_rx_ni() and netif_rx_any_context() invoke netif_rx() so they
    can be removed once they are no more users left.
    
    Link: https://lkml.kernel.org/r/20100415.020246.218622820.davem@davemloft.netSigned-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
    Reviewed-by: default avatarToke Høiland-Jørgensen <toke@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    baebdf48
ntb_netdev.c 12.2 KB