mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-19 13:11:14 +00:00
tipc: change socket buffer overflow control to respect sk_rcvbuf
As per feedback from the netdev community, we change the buffer overflow protection algorithm in receiving sockets so that it always respects the nominal upper limit set in sk_rcvbuf. Instead of scaling up from a small sk_rcvbuf value, which leads to violation of the configured sk_rcvbuf limit, we now calculate the weighted per-message limit by scaling down from a much bigger value, still in the same field, according to the importance priority of the received message. To allow for administrative tunability of the socket receive buffer size, we create a tipc_rmem sysctl variable to allow the user to configure an even bigger value via sysctl command. It is a size of three (min/default/max) to be consistent with things like tcp_rmem. By default, the value initialized in tipc_rmem[1] is equal to the receive socket size needed by a TIPC_CRITICAL_IMPORTANCE message. This value is also set as the default value of sk_rcvbuf. Originally-by: Jon Maloy <jon.maloy@ericsson.com> Cc: Neil Horman <nhorman@tuxdriver.com> Cc: Jon Maloy <jon.maloy@ericsson.com> [Ying: added sysctl variation to Jon's original patch] Signed-off-by: Ying Xue <ying.xue@windriver.com> [PG: don't compile sysctl.c if not config'd; add Documentation] Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
8941bbcd57
commit
cc79dd1ba9
7 changed files with 112 additions and 12 deletions
|
@ -39,6 +39,7 @@
|
|||
#include "name_table.h"
|
||||
#include "subscr.h"
|
||||
#include "config.h"
|
||||
#include "port.h"
|
||||
|
||||
#include <linux/module.h>
|
||||
|
||||
|
@ -50,7 +51,7 @@ u32 tipc_own_addr __read_mostly;
|
|||
int tipc_max_ports __read_mostly;
|
||||
int tipc_net_id __read_mostly;
|
||||
int tipc_remote_management __read_mostly;
|
||||
|
||||
int sysctl_tipc_rmem[3] __read_mostly; /* min/default/max */
|
||||
|
||||
/**
|
||||
* tipc_buf_acquire - creates a TIPC message buffer
|
||||
|
@ -118,6 +119,7 @@ static void tipc_core_stop(void)
|
|||
tipc_nametbl_stop();
|
||||
tipc_ref_table_stop();
|
||||
tipc_socket_stop();
|
||||
tipc_unregister_sysctl();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -142,13 +144,14 @@ static int tipc_core_start(void)
|
|||
res = tipc_netlink_start();
|
||||
if (!res)
|
||||
res = tipc_socket_init();
|
||||
if (!res)
|
||||
res = tipc_register_sysctl();
|
||||
if (res)
|
||||
tipc_core_stop();
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
static int __init tipc_init(void)
|
||||
{
|
||||
int res;
|
||||
|
@ -160,6 +163,11 @@ static int __init tipc_init(void)
|
|||
tipc_max_ports = CONFIG_TIPC_PORTS;
|
||||
tipc_net_id = 4711;
|
||||
|
||||
sysctl_tipc_rmem[0] = CONN_OVERLOAD_LIMIT >> 4 << TIPC_LOW_IMPORTANCE;
|
||||
sysctl_tipc_rmem[1] = CONN_OVERLOAD_LIMIT >> 4 <<
|
||||
TIPC_CRITICAL_IMPORTANCE;
|
||||
sysctl_tipc_rmem[2] = CONN_OVERLOAD_LIMIT;
|
||||
|
||||
res = tipc_core_start();
|
||||
if (res)
|
||||
pr_err("Unable to start in single node mode\n");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue