• Ido Schimmel's avatar
    devlink: Fix netdev notifier chain corruption · b20b8aec
    Ido Schimmel authored
    Cited commit changed devlink to register its netdev notifier block on
    the global netdev notifier chain instead of on the per network namespace
    one.
    
    However, when changing the network namespace of the devlink instance,
    devlink still tries to unregister its notifier block from the chain of
    the old namespace and register it on the chain of the new namespace.
    This results in corruption of the notifier chains, as the same notifier
    block is registered on two different chains: The global one and the per
    network namespace one. In turn, this causes other problems such as the
    inability to dismantle namespaces due to netdev reference count issues.
    
    Fix by preventing devlink from moving its notifier block between
    namespaces.
    
    Reproducer:
    
     # echo "10 1" > /sys/bus/netdevsim/new_device
     # ip netns add test123
     # devlink dev reload netdevsim/netdevsim10 netns test123
     # ip netns del test123
     [   71.935619] unregister_netdevice: waiting for lo to become free. Usage count = 2
     [   71.938348] leaked reference.
    
    Fixes: 565b4824 ("devlink: change port event netdev notifier from per-net to global")
    Signed-off-by: default avatarIdo Schimmel <idosch@nvidia.com>
    Reviewed-by: default avatarJiri Pirko <jiri@nvidia.com>
    Reviewed-by: default avatarJacob Keller <jacob.e.keller@intel.com>
    Reviewed-by: default avatarJakub Kicinski <kuba@kernel.org>
    Link: https://lore.kernel.org/r/20230215073139.1360108-1-idosch@nvidia.comSigned-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    b20b8aec
dev.c 287 KB