Commit 3c689b73 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller

inet: cleanup of local_port_range

I noticed sysctl_local_port_range[] and its associated seqlock
sysctl_local_port_range_lock were on separate cache lines.
Moreover, sysctl_local_port_range[] was close to unrelated
variables, highly modified, leading to cache misses.

Moving these two variables in a structure can help data
locality and moving this structure to read_mostly section
helps sharing of this data among cpus.

Cleanup of extern declarations (moved in include file where
they belong), and use of inet_get_local_port_range()
accessor instead of direct access to ports values.
Signed-off-by: default avatarEric Dumazet <dada1@cosmosbay.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9088c560
...@@ -178,6 +178,10 @@ extern unsigned long snmp_fold_field(void *mib[], int offt); ...@@ -178,6 +178,10 @@ extern unsigned long snmp_fold_field(void *mib[], int offt);
extern int snmp_mib_init(void *ptr[2], size_t mibsize); extern int snmp_mib_init(void *ptr[2], size_t mibsize);
extern void snmp_mib_free(void *ptr[2]); extern void snmp_mib_free(void *ptr[2]);
extern struct local_ports {
seqlock_t lock;
int range[2];
} sysctl_local_ports;
extern void inet_get_local_port_range(int *low, int *high); extern void inet_get_local_port_range(int *low, int *high);
extern int sysctl_ip_default_ttl; extern int sysctl_ip_default_ttl;
......
...@@ -30,20 +30,22 @@ EXPORT_SYMBOL(inet_csk_timer_bug_msg); ...@@ -30,20 +30,22 @@ EXPORT_SYMBOL(inet_csk_timer_bug_msg);
#endif #endif
/* /*
* This array holds the first and last local port number. * This struct holds the first and last local port number.
*/ */
int sysctl_local_port_range[2] = { 32768, 61000 }; struct local_ports sysctl_local_ports __read_mostly = {
DEFINE_SEQLOCK(sysctl_port_range_lock); .lock = SEQLOCK_UNLOCKED,
.range = { 32768, 61000 },
};
void inet_get_local_port_range(int *low, int *high) void inet_get_local_port_range(int *low, int *high)
{ {
unsigned seq; unsigned seq;
do { do {
seq = read_seqbegin(&sysctl_port_range_lock); seq = read_seqbegin(&sysctl_local_ports.lock);
*low = sysctl_local_port_range[0]; *low = sysctl_local_ports.range[0];
*high = sysctl_local_port_range[1]; *high = sysctl_local_ports.range[1];
} while (read_seqretry(&sysctl_port_range_lock, seq)); } while (read_seqretry(&sysctl_local_ports.lock, seq));
} }
EXPORT_SYMBOL(inet_get_local_port_range); EXPORT_SYMBOL(inet_get_local_port_range);
......
...@@ -26,16 +26,13 @@ static int tcp_retr1_max = 255; ...@@ -26,16 +26,13 @@ static int tcp_retr1_max = 255;
static int ip_local_port_range_min[] = { 1, 1 }; static int ip_local_port_range_min[] = { 1, 1 };
static int ip_local_port_range_max[] = { 65535, 65535 }; static int ip_local_port_range_max[] = { 65535, 65535 };
extern seqlock_t sysctl_port_range_lock;
extern int sysctl_local_port_range[2];
/* Update system visible IP port range */ /* Update system visible IP port range */
static void set_local_port_range(int range[2]) static void set_local_port_range(int range[2])
{ {
write_seqlock(&sysctl_port_range_lock); write_seqlock(&sysctl_local_ports.lock);
sysctl_local_port_range[0] = range[0]; sysctl_local_ports.range[0] = range[0];
sysctl_local_port_range[1] = range[1]; sysctl_local_ports.range[1] = range[1];
write_sequnlock(&sysctl_port_range_lock); write_sequnlock(&sysctl_local_ports.lock);
} }
/* Validate changes from /proc interface. */ /* Validate changes from /proc interface. */
...@@ -44,8 +41,7 @@ static int ipv4_local_port_range(ctl_table *table, int write, struct file *filp, ...@@ -44,8 +41,7 @@ static int ipv4_local_port_range(ctl_table *table, int write, struct file *filp,
size_t *lenp, loff_t *ppos) size_t *lenp, loff_t *ppos)
{ {
int ret; int ret;
int range[2] = { sysctl_local_port_range[0], int range[2];
sysctl_local_port_range[1] };
ctl_table tmp = { ctl_table tmp = {
.data = &range, .data = &range,
.maxlen = sizeof(range), .maxlen = sizeof(range),
...@@ -54,6 +50,7 @@ static int ipv4_local_port_range(ctl_table *table, int write, struct file *filp, ...@@ -54,6 +50,7 @@ static int ipv4_local_port_range(ctl_table *table, int write, struct file *filp,
.extra2 = &ip_local_port_range_max, .extra2 = &ip_local_port_range_max,
}; };
inet_get_local_port_range(range, range + 1);
ret = proc_dointvec_minmax(&tmp, write, filp, buffer, lenp, ppos); ret = proc_dointvec_minmax(&tmp, write, filp, buffer, lenp, ppos);
if (write && ret == 0) { if (write && ret == 0) {
...@@ -73,8 +70,7 @@ static int ipv4_sysctl_local_port_range(ctl_table *table, int __user *name, ...@@ -73,8 +70,7 @@ static int ipv4_sysctl_local_port_range(ctl_table *table, int __user *name,
void __user *newval, size_t newlen) void __user *newval, size_t newlen)
{ {
int ret; int ret;
int range[2] = { sysctl_local_port_range[0], int range[2];
sysctl_local_port_range[1] };
ctl_table tmp = { ctl_table tmp = {
.data = &range, .data = &range,
.maxlen = sizeof(range), .maxlen = sizeof(range),
...@@ -83,6 +79,7 @@ static int ipv4_sysctl_local_port_range(ctl_table *table, int __user *name, ...@@ -83,6 +79,7 @@ static int ipv4_sysctl_local_port_range(ctl_table *table, int __user *name,
.extra2 = &ip_local_port_range_max, .extra2 = &ip_local_port_range_max,
}; };
inet_get_local_port_range(range, range + 1);
ret = sysctl_intvec(&tmp, name, nlen, oldval, oldlenp, newval, newlen); ret = sysctl_intvec(&tmp, name, nlen, oldval, oldlenp, newval, newlen);
if (ret == 0 && newval && newlen) { if (ret == 0 && newval && newlen) {
if (range[1] < range[0]) if (range[1] < range[0])
...@@ -396,8 +393,8 @@ static struct ctl_table ipv4_table[] = { ...@@ -396,8 +393,8 @@ static struct ctl_table ipv4_table[] = {
{ {
.ctl_name = NET_IPV4_LOCAL_PORT_RANGE, .ctl_name = NET_IPV4_LOCAL_PORT_RANGE,
.procname = "ip_local_port_range", .procname = "ip_local_port_range",
.data = &sysctl_local_port_range, .data = &sysctl_local_ports.range,
.maxlen = sizeof(sysctl_local_port_range), .maxlen = sizeof(sysctl_local_ports.range),
.mode = 0644, .mode = 0644,
.proc_handler = &ipv4_local_port_range, .proc_handler = &ipv4_local_port_range,
.strategy = &ipv4_sysctl_local_port_range, .strategy = &ipv4_sysctl_local_port_range,
......
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