• David S. Miller's avatar
    net: Fix lockdep regression caused by initializing netdev queues too early. · 8d3bdbd5
    David S. Miller authored
    In commit aa942104 ("net: init ingress
    queue") we moved the allocation and lock initialization of the queues
    into alloc_netdev_mq() since register_netdevice() is way too late.
    
    The problem is that dev->type is not setup until the setup()
    callback is invoked by alloc_netdev_mq(), and the dev->type is
    what determines the lockdep class to use for the locks in the
    queues.
    
    Fix this by doing the queue allocation after the setup() callback
    runs.
    
    This is safe because the setup() callback is not allowed to make any
    state changes that need to be undone on error (memory allocations,
    etc.).  It may, however, make state changes that are undone by
    free_netdev() (such as netif_napi_add(), which is done by the
    ipoib driver's setup routine).
    
    The previous code also leaked a reference to the &init_net namespace
    object on RX/TX queue allocation failures.
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    8d3bdbd5
dev.c 153 KB