• Herbert Xu's avatar
    net: Fix netdev_run_todo dead-lock · 858fac9c
    Herbert Xu authored
    [ Upstream commit 58ec3b4d ]
    
    Benjamin Thery tracked down a bug that explains many instances
    of the error
    
    unregister_netdevice: waiting for %s to become free. Usage count = %d
    
    It turns out that netdev_run_todo can dead-lock with itself if
    a second instance of it is run in a thread that will then free
    a reference to the device waited on by the first instance.
    
    The problem is really quite silly.  We were trying to create
    parallelism where none was required.  As netdev_run_todo always
    follows a RTNL section, and that todo tasks can only be added
    with the RTNL held, by definition you should only need to wait
    for the very ones that you've added and be done with it.
    
    There is no need for a second mutex or spinlock.
    
    This is exactly what the following patch does.
    Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    858fac9c
dev.c 112 KB