]> git.baikalelectronics.ru Git - kernel.git/commit
net: dev: fix the incorrect hold of net namespace's lo device
authorGao feng <gaofeng@cn.fujitsu.com>
Thu, 23 Aug 2012 15:36:55 +0000 (15:36 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 30 Aug 2012 16:21:16 +0000 (12:21 -0400)
commit3ca8c98319ece3c7502949a8acbb6a0183825a9d
tree4bdce0bcf486197c34f0ce5feaecf58b337d625b
parenta3cfb83219521f96cd0c919ff348e7519cffc0c3
net: dev: fix the incorrect hold of net namespace's lo device

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: Gao feng <gaofeng@cn.fujitsu.com>
Cc: Eric Dumazet <eric.dumazet@gmail.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/dev.c