diff options
author | Nicolas Dichtel <nicolas.dichtel@6wind.com> | 2014-10-29 19:29:31 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-10-29 16:11:50 -0400 |
commit | 75fbfd33234a71556bec34b099d98f970190905d (patch) | |
tree | 1a5b40b1e9d8035336c8e8ac581cb10165951cc2 /include/net/neighbour.h | |
parent | bc9ad166e38ae1cdcb5323a8aa45dff834d68bfa (diff) | |
download | linux-stable-75fbfd33234a71556bec34b099d98f970190905d.tar.gz linux-stable-75fbfd33234a71556bec34b099d98f970190905d.tar.bz2 linux-stable-75fbfd33234a71556bec34b099d98f970190905d.zip |
neigh: optimize neigh_parms_release()
In neigh_parms_release() we loop over all entries to find the entry given in
argument and being able to remove it from the list. By using a double linked
list, we can avoid this loop.
Here are some numbers with 30 000 dummy interfaces configured:
Before the patch:
$ time rmmod dummy
real 2m0.118s
user 0m0.000s
sys 1m50.048s
After the patch:
$ time rmmod dummy
real 1m9.970s
user 0m0.000s
sys 0m47.976s
Suggested-by: Thierry Herbelot <thierry.herbelot@6wind.com>
Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/neighbour.h')
-rw-r--r-- | include/net/neighbour.h | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/include/net/neighbour.h b/include/net/neighbour.h index f60558d0254c..dedfb188b1a7 100644 --- a/include/net/neighbour.h +++ b/include/net/neighbour.h @@ -69,7 +69,7 @@ struct neigh_parms { struct net *net; #endif struct net_device *dev; - struct neigh_parms *next; + struct list_head list; int (*neigh_setup)(struct neighbour *); void (*neigh_cleanup)(struct neighbour *); struct neigh_table *tbl; @@ -203,6 +203,7 @@ struct neigh_table { void (*proxy_redo)(struct sk_buff *skb); char *id; struct neigh_parms parms; + struct list_head parms_list; int gc_interval; int gc_thresh1; int gc_thresh2; |