• Gao feng's avatar
    net: dev: fix the incorrect hold of net namespace's lo device · 6549dd43
    Gao feng authored
    When moving a net device from one net namespace to another
    net namespace,dev_change_net_namespace calls NETDEV_DOWN
    event,so the original net namespace's dst entries which
    beloned to this net device will be put into dst_garbage
    list.
    
    then dev_change_net_namespace will set this net device's
    net to the new net namespace.
    
    If we unregister this net device's driver, this will trigger
    the NETDEV_UNREGISTER_FINAL event, dst_ifdown will be called,
    and get this net device's dst entries from dst_garbage list,
    put these entries' dev to the new net namespace's lo device.
    
    It's not what we want,actually we need these dst entries hold
    the original net namespace's lo device,this incorrect device
    holding will trigger emg message like below.
    unregister_netdevice: waiting for lo to become free. Usage count = 1
    
    so we should call NETDEV_UNREGISTER_FINAL event in
    dev_change_net_namespace too,in order to make sure dst entries
    already in the dst_garbage list, we need rcu_barrier before we
    call NETDEV_UNREGISTER_FINAL event.
    
    With help form Eric Dumazet.
    Signed-off-by: default avatarGao feng <gaofeng@cn.fujitsu.com>
    Cc: Eric Dumazet <eric.dumazet@gmail.com>
    Cc: "Eric W. Biederman" <ebiederm@xmission.com>
    Acked-by: default avatarEric Dumazet <edumazet@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    6549dd43
dev.c 162 KB