ipip: Optimize multiple unregistration
Subsystems (3)
PATCH 5/6 ipip: Optimize multiple unregistration
Speedup module unloading by factorizing synchronize_rcu() calls
Signed-off-by Eric Dumazet <[email protected]>
--- net/ipv4/ipip.c | 17 +++++++++++------ 1 files changed, 11 insertions(+), 6 deletions(-)
net/ipv4/ipip.c +11 -6
@@ -754,16 +754,19 @@ static struct xfrm_tunnel ipip_handler = {static const char banner[]__initconst =KERN_INFO "IPv4 over IPv4 tunneling driver\n" ; -static void ipip_destroy_tunnels (struct ipip_net *ipn) +static void ipip_destroy_tunnels (struct ipip_net *ipn,struct list_head *head) {int prio;for (prio =1 ; prio <4 ; prio++) {int h;for (h =0 ; h <HASH_SIZE ; h++) { -struct ip_tunnel *t; -while ((t = ipn->tunnels[prio][h]) !=NULL ) -unregister_netdevice (t->dev); +struct ip_tunnel *t = ipn->tunnels[prio][h]; + +while (t !=NULL ) { +unregister_netdevice_queue (t->dev, head); + t = t->next; + } } } }
@@ -816,11 +819,13 @@ err_alloc:static void ipip_exit_net (struct net *net) {struct ipip_net *ipn; +LIST_HEAD (list); ipn =net_generic (net, ipip_net_id);rtnl_lock (); -ipip_destroy_tunnels (ipn); -unregister_netdevice (ipn->fb_tunnel_dev); +ipip_destroy_tunnels (ipn, &list); +unregister_netdevice_queue (ipn->fb_tunnel_dev, &list); +unregister_netdevice_many (&list);rtnl_unlock ();kfree (ipn); }