[Devel] Re: [PATCH 6/14][RTNL]: Introduce the rtnl_kill_links call.
Daniel Hokka Zakrisson
daniel at hozac.com
Thu Apr 10 15:09:55 PDT 2008
Pavel Emelyanov wrote:
> ... which will kill all the devices in the given net with
> the given rtnl_link_ops. Will be used in VLAN patches later.
>
> Signed-off-by: Pavel Emelyanov <xemul at openvz.org>
>
> ---
> include/net/rtnetlink.h | 1 +
> net/core/rtnetlink.c | 29 +++++++++++++++++++++--------
> 2 files changed, 22 insertions(+), 8 deletions(-)
>
> diff --git a/include/net/rtnetlink.h b/include/net/rtnetlink.h
> index 793863e..3c1895e 100644
> --- a/include/net/rtnetlink.h
> +++ b/include/net/rtnetlink.h
> @@ -74,6 +74,7 @@ struct rtnl_link_ops {
>
> extern int __rtnl_link_register(struct rtnl_link_ops *ops);
> extern void __rtnl_link_unregister(struct rtnl_link_ops *ops);
> +extern void rtnl_kill_links(struct net *net, struct rtnl_link_ops *ops);
>
> extern int rtnl_link_register(struct rtnl_link_ops *ops);
> extern void rtnl_link_unregister(struct rtnl_link_ops *ops);
> diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
> index da99ac0..bc39e41 100644
> --- a/net/core/rtnetlink.c
> +++ b/net/core/rtnetlink.c
> @@ -269,6 +269,26 @@ int rtnl_link_register(struct rtnl_link_ops *ops)
>
> EXPORT_SYMBOL_GPL(rtnl_link_register);
>
> +static void __rtnl_kill_links(struct net *net, struct rtnl_link_ops *ops)
> +{
> + struct net_device *dev;
> +restart:
> + for_each_netdev(net, dev) {
> + if (dev->rtnl_link_ops == ops) {
> + ops->dellink(dev);
> + goto restart;
> + }
> + }
> +}
> +
> +void rtnl_kill_links(struct net *net, struct rtnl_link_ops *ops)
> +{
> + rtnl_lock();
> + __rtnl_kill_links(net, ops);
> + rtnl_unlock();
> +}
> +EXPORT_SYMBOL_GPL(rtnl_kill_links);
> +
> /**
> * __rtnl_link_unregister - Unregister rtnl_link_ops from rtnetlink.
> * @ops: struct rtnl_link_ops * to unregister
> @@ -277,17 +297,10 @@ EXPORT_SYMBOL_GPL(rtnl_link_register);
> */
> void __rtnl_link_unregister(struct rtnl_link_ops *ops)
> {
> - struct net_device *dev, *n;
> struct net *net;
>
> for_each_net(net) {
> -restart:
> - for_each_netdev_safe(net, dev, n) {
> - if (dev->rtnl_link_ops == ops) {
> - ops->dellink(dev);
> - goto restart;
> - }
> - }
> + __rtnl_kill_links(net, ops);
This was _safe, and now it's not. Is that intentional?
> }
> list_del(&ops->list);
> }
> --
> 1.5.3.4
--
Daniel Hokka Zakrisson
_______________________________________________
Containers mailing list
Containers at lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/containers
More information about the Devel
mailing list