summaryrefslogtreecommitdiffstats
path: root/include/net/neighbour.h
diff options
context:
space:
mode:
authorNicolas Dichtel <nicolas.dichtel@6wind.com>2014-10-29 19:29:31 +0100
committerDavid S. Miller <davem@davemloft.net>2014-10-29 16:11:50 -0400
commit75fbfd33234a71556bec34b099d98f970190905d (patch)
tree1a5b40b1e9d8035336c8e8ac581cb10165951cc2 /include/net/neighbour.h
parentbc9ad166e38ae1cdcb5323a8aa45dff834d68bfa (diff)
downloadlinux-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.h3
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;