Commit 4b9d9be8 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller

inetpeer: remove unused list

Andi Kleen and Tim Chen reported huge contention on inetpeer
unused_peers.lock, on memcached workload on a 40 core machine, with
disabled route cache.

It appears we constantly flip peers refcnt between 0 and 1 values, and
we must insert/remove peers from unused_peers.list, holding a contended
spinlock.

Remove this list completely and perform a garbage collection on-the-fly,
at lookup time, using the expired nodes we met during the tree
traversal.

This removes a lot of code, makes locking more standard, and obsoletes
two sysctls (inet_peer_gc_mintime and inet_peer_gc_maxtime). This also
removes two pointers in inet_peer structure.

There is still a false sharing effect because refcnt is in first cache
line of object [were the links and keys used by lookups are located], we
might move it at the end of inet_peer structure to let this first cache
line mostly read by cpus.
Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
CC: Andi Kleen <andi@firstfloor.org>
CC: Tim Chen <tim.c.chen@linux.intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9ad7c049
...@@ -106,16 +106,6 @@ inet_peer_maxttl - INTEGER ...@@ -106,16 +106,6 @@ inet_peer_maxttl - INTEGER
when the number of entries in the pool is very small). when the number of entries in the pool is very small).
Measured in seconds. Measured in seconds.
inet_peer_gc_mintime - INTEGER
Minimum interval between garbage collection passes. This interval is
in effect under high memory pressure on the pool.
Measured in seconds.
inet_peer_gc_maxtime - INTEGER
Minimum interval between garbage collection passes. This interval is
in effect under low (or absent) memory pressure on the pool.
Measured in seconds.
TCP variables: TCP variables:
somaxconn - INTEGER somaxconn - INTEGER
......
...@@ -32,7 +32,6 @@ struct inet_peer { ...@@ -32,7 +32,6 @@ struct inet_peer {
struct inet_peer __rcu *avl_left, *avl_right; struct inet_peer __rcu *avl_left, *avl_right;
struct inetpeer_addr daddr; struct inetpeer_addr daddr;
__u32 avl_height; __u32 avl_height;
struct list_head unused;
__u32 dtime; /* the time of last use of not __u32 dtime; /* the time of last use of not
* referenced entries */ * referenced entries */
atomic_t refcnt; atomic_t refcnt;
...@@ -56,6 +55,7 @@ struct inet_peer { ...@@ -56,6 +55,7 @@ struct inet_peer {
struct inetpeer_addr_base redirect_learned; struct inetpeer_addr_base redirect_learned;
}; };
struct rcu_head rcu; struct rcu_head rcu;
struct inet_peer *gc_next;
}; };
}; };
......
...@@ -228,8 +228,6 @@ extern struct ctl_path net_ipv4_ctl_path[]; ...@@ -228,8 +228,6 @@ extern struct ctl_path net_ipv4_ctl_path[];
extern int inet_peer_threshold; extern int inet_peer_threshold;
extern int inet_peer_minttl; extern int inet_peer_minttl;
extern int inet_peer_maxttl; extern int inet_peer_maxttl;
extern int inet_peer_gc_mintime;
extern int inet_peer_gc_maxtime;
/* From ip_output.c */ /* From ip_output.c */
extern int sysctl_ip_dynaddr; extern int sysctl_ip_dynaddr;
......
This diff is collapsed.
...@@ -397,20 +397,6 @@ static struct ctl_table ipv4_table[] = { ...@@ -397,20 +397,6 @@ static struct ctl_table ipv4_table[] = {
.mode = 0644, .mode = 0644,
.proc_handler = proc_dointvec_jiffies, .proc_handler = proc_dointvec_jiffies,
}, },
{
.procname = "inet_peer_gc_mintime",
.data = &inet_peer_gc_mintime,
.maxlen = sizeof(int),
.mode = 0644,
.proc_handler = proc_dointvec_jiffies,
},
{
.procname = "inet_peer_gc_maxtime",
.data = &inet_peer_gc_maxtime,
.maxlen = sizeof(int),
.mode = 0644,
.proc_handler = proc_dointvec_jiffies,
},
{ {
.procname = "tcp_orphan_retries", .procname = "tcp_orphan_retries",
.data = &sysctl_tcp_orphan_retries, .data = &sysctl_tcp_orphan_retries,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment