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: Eric Dumazet <dada1@cosmosbay.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
9088c56095
commit
3c689b7320
@ -30,20 +30,22 @@ EXPORT_SYMBOL(inet_csk_timer_bug_msg);
|
||||
#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 };
|
||||
DEFINE_SEQLOCK(sysctl_port_range_lock);
|
||||
struct local_ports sysctl_local_ports __read_mostly = {
|
||||
.lock = SEQLOCK_UNLOCKED,
|
||||
.range = { 32768, 61000 },
|
||||
};
|
||||
|
||||
void inet_get_local_port_range(int *low, int *high)
|
||||
{
|
||||
unsigned seq;
|
||||
do {
|
||||
seq = read_seqbegin(&sysctl_port_range_lock);
|
||||
seq = read_seqbegin(&sysctl_local_ports.lock);
|
||||
|
||||
*low = sysctl_local_port_range[0];
|
||||
*high = sysctl_local_port_range[1];
|
||||
} while (read_seqretry(&sysctl_port_range_lock, seq));
|
||||
*low = sysctl_local_ports.range[0];
|
||||
*high = sysctl_local_ports.range[1];
|
||||
} while (read_seqretry(&sysctl_local_ports.lock, seq));
|
||||
}
|
||||
EXPORT_SYMBOL(inet_get_local_port_range);
|
||||
|
||||
|
Reference in New Issue
Block a user