From e8d8f87474df08a3394adfc494eb272a7e0e0918 Mon Sep 17 00:00:00 2001 From: Alina Sklarevich Date: Thu, 27 Aug 2020 13:01:23 +0300 Subject: [PATCH 1/4] UCP/UCT/API: add a new env parameter to control the listener's backlog --- src/ucp/core/ucp_context.c | 4 ++++ src/ucp/core/ucp_context.h | 2 ++ src/ucp/core/ucp_listener.c | 4 +++- src/uct/api/uct.h | 2 +- src/uct/base/uct_cm.c | 17 +++++++++++++++++ src/uct/base/uct_cm.h | 3 +++ src/uct/ib/rdmacm/rdmacm_listener.c | 23 +++++++++++++++++++++-- src/uct/tcp/tcp_listener.c | 4 ++-- 8 files changed, 53 insertions(+), 6 deletions(-) diff --git a/src/ucp/core/ucp_context.c b/src/ucp/core/ucp_context.c index b9a261871af..f4218351cdd 100644 --- a/src/ucp/core/ucp_context.c +++ b/src/ucp/core/ucp_context.c @@ -291,6 +291,10 @@ static ucs_config_field_t ucp_config_table[] = { "require out of band synchronization before destroying UCP resources.", ucs_offsetof(ucp_config_t, ctx.sockaddr_cm_enable), UCS_CONFIG_TYPE_TERNARY}, + {"LISTENER_BACKLOG", "auto", + "Maximum number of pending connections for a listener.", + ucs_offsetof(ucp_config_t, ctx.listener_backlog), UCS_CONFIG_TYPE_ULUNITS}, + {"PROTO_ENABLE", "n", "Experimental: enable new protocol selection logic", ucs_offsetof(ucp_config_t, ctx.proto_enable), UCS_CONFIG_TYPE_BOOL}, diff --git a/src/ucp/core/ucp_context.h b/src/ucp/core/ucp_context.h index 2bed2008d10..7ec703699dc 100644 --- a/src/ucp/core/ucp_context.h +++ b/src/ucp/core/ucp_context.h @@ -100,6 +100,8 @@ typedef struct ucp_context_config { int unified_mode; /** Enable cm wireup-and-close protocol for client-server connections */ ucs_ternary_value_t sockaddr_cm_enable; + /** Maximum number of pending connections for a listener */ + size_t listener_backlog; /** Enable new protocol selection logic */ int proto_enable; } ucp_context_config_t; diff --git a/src/ucp/core/ucp_listener.c b/src/ucp/core/ucp_listener.c index b8c442bb2a6..756ee9925ff 100644 --- a/src/ucp/core/ucp_listener.c +++ b/src/ucp/core/ucp_listener.c @@ -242,9 +242,11 @@ ucp_listen_on_cm(ucp_listener_h listener, const ucp_listener_params_t *params) ucs_assert_always(num_cms > 0); uct_params.field_mask = UCT_LISTENER_PARAM_FIELD_CONN_REQUEST_CB | - UCT_LISTENER_PARAM_FIELD_USER_DATA; + UCT_LISTENER_PARAM_FIELD_USER_DATA | + UCT_LISTENER_PARAM_FIELD_BACKLOG; uct_params.conn_request_cb = ucp_cm_server_conn_request_cb; uct_params.user_data = listener; + uct_params.backlog = ucs_min(INT_MAX, worker->context->config.ext.listener_backlog); listener->num_rscs = 0; uct_listeners = ucs_calloc(num_cms, sizeof(*uct_listeners), diff --git a/src/uct/api/uct.h b/src/uct/api/uct.h index 04e1b59f169..45245f71bda 100644 --- a/src/uct/api/uct.h +++ b/src/uct/api/uct.h @@ -1205,7 +1205,7 @@ struct uct_listener_params { /** * Backlog of incoming connection requests. - * If not specified, SOMAXCONN, as defined in , will be used. + * If not specified, each CM transport will select its own value. */ int backlog; diff --git a/src/uct/base/uct_cm.c b/src/uct/base/uct_cm.c index 4c862a39ff1..c3402570081 100644 --- a/src/uct/base/uct_cm.c +++ b/src/uct/base/uct_cm.c @@ -111,6 +111,23 @@ void uct_cm_ep_server_conn_notify_cb(uct_cm_base_ep_t *cep, ucs_status_t status) cep->server.notify_cb(&cep->super.super, cep->user_data, ¬ify_args); } +int uct_cm_set_listener_backlog(const uct_listener_params_t *params, + int default_value) +{ + int backlog; + + if ((params->field_mask & UCT_LISTENER_PARAM_FIELD_BACKLOG) && + (params->backlog == INT_MAX)) { + backlog = default_value; + } else if (params->field_mask & UCT_LISTENER_PARAM_FIELD_BACKLOG) { + backlog = params->backlog; + } else { + backlog = default_value; + } + + return backlog; +} + static ucs_status_t uct_cm_check_ep_params(const uct_ep_params_t *params) { if (!(params->field_mask & UCT_EP_PARAM_FIELD_CM)) { diff --git a/src/uct/base/uct_cm.h b/src/uct/base/uct_cm.h index 9544597465d..9c7d4d7d35a 100644 --- a/src/uct/base/uct_cm.h +++ b/src/uct/base/uct_cm.h @@ -111,6 +111,9 @@ UCS_CLASS_DECLARE(uct_cm_t, uct_cm_ops_t*, uct_iface_ops_t*, uct_worker_h, ucs_status_t uct_cm_set_common_data(uct_cm_base_ep_t *ep, const uct_ep_params_t *params); +int uct_cm_set_listener_backlog(const uct_listener_params_t *params, + int default_value); + ucs_status_t uct_cm_ep_pack_cb(uct_cm_base_ep_t *cep, void *arg, const uct_cm_ep_priv_data_pack_args_t *pack_args, void *priv_data, size_t priv_data_max, diff --git a/src/uct/ib/rdmacm/rdmacm_listener.c b/src/uct/ib/rdmacm/rdmacm_listener.c index f785e0cf369..39a50e09fb9 100644 --- a/src/uct/ib/rdmacm/rdmacm_listener.c +++ b/src/uct/ib/rdmacm/rdmacm_listener.c @@ -11,6 +11,25 @@ #include "rdmacm_listener.h" +#define UCS_RDMACM_MAX_BACKLOG_PATH "/proc/sys/net/rdma_ucm/max_backlog" + + +static long ucs_rdmacm_max_backlog() +{ + long max_backlog; + + if (ucs_read_file_number(&max_backlog, 1, + UCS_RDMACM_MAX_BACKLOG_PATH) == UCS_OK) { + ucs_assert(max_backlog <= INT_MAX); + return max_backlog; + } else { + ucs_warn("unable to read max_backlog value from %s file", + UCS_RDMACM_MAX_BACKLOG_PATH); + max_backlog = 1024; + return max_backlog; + } +} + UCS_CLASS_INIT_FUNC(uct_rdmacm_listener_t, uct_cm_h cm, const struct sockaddr *saddr, socklen_t socklen, const uct_listener_params_t *params) @@ -41,8 +60,8 @@ UCS_CLASS_INIT_FUNC(uct_rdmacm_listener_t, uct_cm_h cm, goto err_destroy_id; } - backlog = (params->field_mask & UCT_LISTENER_PARAM_FIELD_BACKLOG) ? - params->backlog : SOMAXCONN; + backlog = uct_cm_set_listener_backlog(params, ucs_rdmacm_max_backlog()); + if (rdma_listen(self->id, backlog)) { ucs_error("rdma_listen(id:=%p addr=%s backlog=%d) failed: %m", self->id, ucs_sockaddr_str(saddr, ip_port_str, diff --git a/src/uct/tcp/tcp_listener.c b/src/uct/tcp/tcp_listener.c index 74e9de78a93..f874a7c3493 100644 --- a/src/uct/tcp/tcp_listener.c +++ b/src/uct/tcp/tcp_listener.c @@ -106,8 +106,8 @@ UCS_CLASS_INIT_FUNC(uct_tcp_listener_t, uct_cm_h cm, self->conn_request_cb = params->conn_request_cb; self->user_data = (params->field_mask & UCT_LISTENER_PARAM_FIELD_USER_DATA) ? params->user_data : NULL; - backlog = (params->field_mask & UCT_LISTENER_PARAM_FIELD_BACKLOG) ? - params->backlog : ucs_socket_max_conn(); + + backlog = uct_cm_set_listener_backlog(params, ucs_socket_max_conn()); status = ucs_socket_server_init(saddr, socklen, backlog, 0, &self->listen_fd); if (status != UCS_OK) { From aaf9e47cae7c7a061bab5ad739f0aaffe7fad0be Mon Sep 17 00:00:00 2001 From: Alina Sklarevich Date: Mon, 31 Aug 2020 16:11:47 +0300 Subject: [PATCH 2/4] UCP/UCT/API: env param to control the listener's backlog - CR comments --- src/ucp/core/ucp_context.c | 5 +++- src/ucp/core/ucp_context.h | 2 +- src/ucp/core/ucp_listener.c | 2 +- src/uct/api/uct.h | 2 +- src/uct/base/uct_cm.c | 39 ++++++++++++++++------------- src/uct/base/uct_cm.h | 6 ++--- src/uct/ib/rdmacm/rdmacm_listener.c | 6 ++++- src/uct/tcp/tcp_listener.c | 6 ++++- 8 files changed, 42 insertions(+), 26 deletions(-) diff --git a/src/ucp/core/ucp_context.c b/src/ucp/core/ucp_context.c index f4218351cdd..3fe017f9e16 100644 --- a/src/ucp/core/ucp_context.c +++ b/src/ucp/core/ucp_context.c @@ -292,7 +292,10 @@ static ucs_config_field_t ucp_config_table[] = { ucs_offsetof(ucp_config_t, ctx.sockaddr_cm_enable), UCS_CONFIG_TYPE_TERNARY}, {"LISTENER_BACKLOG", "auto", - "Maximum number of pending connections for a listener.", + "Maximum number of pending connection requests for a listener.\n" + "auto means that each transport would use its system default.\n" + "If a value larger than a system default is set, the backlog value would be\n" + "cut to the system default.", ucs_offsetof(ucp_config_t, ctx.listener_backlog), UCS_CONFIG_TYPE_ULUNITS}, {"PROTO_ENABLE", "n", diff --git a/src/ucp/core/ucp_context.h b/src/ucp/core/ucp_context.h index 7ec703699dc..56ed28d33e0 100644 --- a/src/ucp/core/ucp_context.h +++ b/src/ucp/core/ucp_context.h @@ -100,7 +100,7 @@ typedef struct ucp_context_config { int unified_mode; /** Enable cm wireup-and-close protocol for client-server connections */ ucs_ternary_value_t sockaddr_cm_enable; - /** Maximum number of pending connections for a listener */ + /** Maximum number of pending connection requests for a listener */ size_t listener_backlog; /** Enable new protocol selection logic */ int proto_enable; diff --git a/src/ucp/core/ucp_listener.c b/src/ucp/core/ucp_listener.c index 756ee9925ff..2d846c75465 100644 --- a/src/ucp/core/ucp_listener.c +++ b/src/ucp/core/ucp_listener.c @@ -242,7 +242,7 @@ ucp_listen_on_cm(ucp_listener_h listener, const ucp_listener_params_t *params) ucs_assert_always(num_cms > 0); uct_params.field_mask = UCT_LISTENER_PARAM_FIELD_CONN_REQUEST_CB | - UCT_LISTENER_PARAM_FIELD_USER_DATA | + UCT_LISTENER_PARAM_FIELD_USER_DATA | UCT_LISTENER_PARAM_FIELD_BACKLOG; uct_params.conn_request_cb = ucp_cm_server_conn_request_cb; uct_params.user_data = listener; diff --git a/src/uct/api/uct.h b/src/uct/api/uct.h index 45245f71bda..da2d7002a38 100644 --- a/src/uct/api/uct.h +++ b/src/uct/api/uct.h @@ -1205,7 +1205,7 @@ struct uct_listener_params { /** * Backlog of incoming connection requests. - * If not specified, each CM transport will select its own value. + * If not specified, each CM component will select its own value. */ int backlog; diff --git a/src/uct/base/uct_cm.c b/src/uct/base/uct_cm.c index c3402570081..310d4fd0a82 100644 --- a/src/uct/base/uct_cm.c +++ b/src/uct/base/uct_cm.c @@ -111,23 +111,6 @@ void uct_cm_ep_server_conn_notify_cb(uct_cm_base_ep_t *cep, ucs_status_t status) cep->server.notify_cb(&cep->super.super, cep->user_data, ¬ify_args); } -int uct_cm_set_listener_backlog(const uct_listener_params_t *params, - int default_value) -{ - int backlog; - - if ((params->field_mask & UCT_LISTENER_PARAM_FIELD_BACKLOG) && - (params->backlog == INT_MAX)) { - backlog = default_value; - } else if (params->field_mask & UCT_LISTENER_PARAM_FIELD_BACKLOG) { - backlog = params->backlog; - } else { - backlog = default_value; - } - - return backlog; -} - static ucs_status_t uct_cm_check_ep_params(const uct_ep_params_t *params) { if (!(params->field_mask & UCT_EP_PARAM_FIELD_CM)) { @@ -240,6 +223,28 @@ ucs_status_t uct_listener_reject(uct_listener_h listener, return listener->cm->ops->listener_reject(listener, conn_request); } +int uct_listener_backlog_adjust(const uct_listener_params_t *params, + int max_value) +{ + int backlog; + + if (params->field_mask & UCT_LISTENER_PARAM_FIELD_BACKLOG) { + if (params->backlog > max_value) { + ucs_diag("configure value %d is greater than the max_value %d. " + "using max_value", params->backlog, max_value); + } + backlog = ucs_min(params->backlog, max_value); + } else { + backlog = max_value; + } + + if (backlog == 0) { + ucs_error("the backlog value cannot be zero"); + } + + return backlog; +} + #ifdef ENABLE_STATS static ucs_stats_class_t uct_cm_stats_class = { diff --git a/src/uct/base/uct_cm.h b/src/uct/base/uct_cm.h index 9c7d4d7d35a..d8e624705c0 100644 --- a/src/uct/base/uct_cm.h +++ b/src/uct/base/uct_cm.h @@ -108,12 +108,12 @@ extern ucs_config_field_t uct_cm_config_table[]; UCS_CLASS_DECLARE(uct_cm_t, uct_cm_ops_t*, uct_iface_ops_t*, uct_worker_h, uct_component_h); +int uct_listener_backlog_adjust(const uct_listener_params_t *params, + int default_value); + ucs_status_t uct_cm_set_common_data(uct_cm_base_ep_t *ep, const uct_ep_params_t *params); -int uct_cm_set_listener_backlog(const uct_listener_params_t *params, - int default_value); - ucs_status_t uct_cm_ep_pack_cb(uct_cm_base_ep_t *cep, void *arg, const uct_cm_ep_priv_data_pack_args_t *pack_args, void *priv_data, size_t priv_data_max, diff --git a/src/uct/ib/rdmacm/rdmacm_listener.c b/src/uct/ib/rdmacm/rdmacm_listener.c index 39a50e09fb9..dcf2ae2a8f7 100644 --- a/src/uct/ib/rdmacm/rdmacm_listener.c +++ b/src/uct/ib/rdmacm/rdmacm_listener.c @@ -60,7 +60,11 @@ UCS_CLASS_INIT_FUNC(uct_rdmacm_listener_t, uct_cm_h cm, goto err_destroy_id; } - backlog = uct_cm_set_listener_backlog(params, ucs_rdmacm_max_backlog()); + backlog = uct_listener_backlog_adjust(params, ucs_rdmacm_max_backlog()); + if (backlog == 0) { + status = UCS_ERR_INVALID_PARAM; + goto err_destroy_id; + } if (rdma_listen(self->id, backlog)) { ucs_error("rdma_listen(id:=%p addr=%s backlog=%d) failed: %m", diff --git a/src/uct/tcp/tcp_listener.c b/src/uct/tcp/tcp_listener.c index f874a7c3493..685473f71b6 100644 --- a/src/uct/tcp/tcp_listener.c +++ b/src/uct/tcp/tcp_listener.c @@ -107,7 +107,11 @@ UCS_CLASS_INIT_FUNC(uct_tcp_listener_t, uct_cm_h cm, self->user_data = (params->field_mask & UCT_LISTENER_PARAM_FIELD_USER_DATA) ? params->user_data : NULL; - backlog = uct_cm_set_listener_backlog(params, ucs_socket_max_conn()); + backlog = uct_listener_backlog_adjust(params, ucs_socket_max_conn()); + if (backlog == 0) { + status = UCS_ERR_INVALID_PARAM; + goto err; + } status = ucs_socket_server_init(saddr, socklen, backlog, 0, &self->listen_fd); if (status != UCS_OK) { From d7047aa0c99a3bb688eb85c7e142c1f807ba50c6 Mon Sep 17 00:00:00 2001 From: Alina Sklarevich Date: Mon, 31 Aug 2020 17:14:34 +0300 Subject: [PATCH 3/4] UCT: add a check for a negative value for the backlog parameter --- src/uct/base/uct_cm.c | 4 ++-- src/uct/ib/rdmacm/rdmacm_listener.c | 2 +- src/uct/tcp/tcp_listener.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/uct/base/uct_cm.c b/src/uct/base/uct_cm.c index 310d4fd0a82..59c95f51ebc 100644 --- a/src/uct/base/uct_cm.c +++ b/src/uct/base/uct_cm.c @@ -238,8 +238,8 @@ int uct_listener_backlog_adjust(const uct_listener_params_t *params, backlog = max_value; } - if (backlog == 0) { - ucs_error("the backlog value cannot be zero"); + if (backlog <= 0) { + ucs_error("the backlog value cannot be zero or negative"); } return backlog; diff --git a/src/uct/ib/rdmacm/rdmacm_listener.c b/src/uct/ib/rdmacm/rdmacm_listener.c index dcf2ae2a8f7..e0d1c3e4e2e 100644 --- a/src/uct/ib/rdmacm/rdmacm_listener.c +++ b/src/uct/ib/rdmacm/rdmacm_listener.c @@ -61,7 +61,7 @@ UCS_CLASS_INIT_FUNC(uct_rdmacm_listener_t, uct_cm_h cm, } backlog = uct_listener_backlog_adjust(params, ucs_rdmacm_max_backlog()); - if (backlog == 0) { + if (backlog <= 0) { status = UCS_ERR_INVALID_PARAM; goto err_destroy_id; } diff --git a/src/uct/tcp/tcp_listener.c b/src/uct/tcp/tcp_listener.c index 685473f71b6..0bd0e9bd9e7 100644 --- a/src/uct/tcp/tcp_listener.c +++ b/src/uct/tcp/tcp_listener.c @@ -108,7 +108,7 @@ UCS_CLASS_INIT_FUNC(uct_tcp_listener_t, uct_cm_h cm, params->user_data : NULL; backlog = uct_listener_backlog_adjust(params, ucs_socket_max_conn()); - if (backlog == 0) { + if (backlog <= 0) { status = UCS_ERR_INVALID_PARAM; goto err; } From cb631085fae4526bb83bb7ce77cc088ebcc47ea4 Mon Sep 17 00:00:00 2001 From: Alina Sklarevich Date: Tue, 1 Sep 2020 10:10:12 +0300 Subject: [PATCH 4/4] UCP/UCT/API: env param to for the listener's backlog - more CR comments --- src/ucp/core/ucp_context.c | 7 +++---- src/ucp/core/ucp_context.h | 2 +- src/ucp/core/ucp_listener.c | 3 ++- src/uct/api/uct.h | 2 +- src/uct/base/uct_cm.c | 17 +++++++++-------- src/uct/base/uct_cm.h | 4 ++-- src/uct/ib/rdmacm/rdmacm_listener.c | 18 +++++++++--------- src/uct/tcp/tcp_listener.c | 5 ++--- 8 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/ucp/core/ucp_context.c b/src/ucp/core/ucp_context.c index 3fe017f9e16..d7ca3278b80 100644 --- a/src/ucp/core/ucp_context.c +++ b/src/ucp/core/ucp_context.c @@ -292,10 +292,9 @@ static ucs_config_field_t ucp_config_table[] = { ucs_offsetof(ucp_config_t, ctx.sockaddr_cm_enable), UCS_CONFIG_TYPE_TERNARY}, {"LISTENER_BACKLOG", "auto", - "Maximum number of pending connection requests for a listener.\n" - "auto means that each transport would use its system default.\n" - "If a value larger than a system default is set, the backlog value would be\n" - "cut to the system default.", + "'auto' means that each transport would use its maximal allowed value.\n" + "If a value larger than what a transport supports is set, the backlog value\n" + "would be cut to that maximal value.", ucs_offsetof(ucp_config_t, ctx.listener_backlog), UCS_CONFIG_TYPE_ULUNITS}, {"PROTO_ENABLE", "n", diff --git a/src/ucp/core/ucp_context.h b/src/ucp/core/ucp_context.h index 56ed28d33e0..9614236f4db 100644 --- a/src/ucp/core/ucp_context.h +++ b/src/ucp/core/ucp_context.h @@ -100,7 +100,7 @@ typedef struct ucp_context_config { int unified_mode; /** Enable cm wireup-and-close protocol for client-server connections */ ucs_ternary_value_t sockaddr_cm_enable; - /** Maximum number of pending connection requests for a listener */ + /** Maximal number of pending connection requests for a listener */ size_t listener_backlog; /** Enable new protocol selection logic */ int proto_enable; diff --git a/src/ucp/core/ucp_listener.c b/src/ucp/core/ucp_listener.c index 2d846c75465..971fd8095fb 100644 --- a/src/ucp/core/ucp_listener.c +++ b/src/ucp/core/ucp_listener.c @@ -246,7 +246,8 @@ ucp_listen_on_cm(ucp_listener_h listener, const ucp_listener_params_t *params) UCT_LISTENER_PARAM_FIELD_BACKLOG; uct_params.conn_request_cb = ucp_cm_server_conn_request_cb; uct_params.user_data = listener; - uct_params.backlog = ucs_min(INT_MAX, worker->context->config.ext.listener_backlog); + uct_params.backlog = ucs_min((size_t)INT_MAX, + worker->context->config.ext.listener_backlog); listener->num_rscs = 0; uct_listeners = ucs_calloc(num_cms, sizeof(*uct_listeners), diff --git a/src/uct/api/uct.h b/src/uct/api/uct.h index da2d7002a38..04e1b59f169 100644 --- a/src/uct/api/uct.h +++ b/src/uct/api/uct.h @@ -1205,7 +1205,7 @@ struct uct_listener_params { /** * Backlog of incoming connection requests. - * If not specified, each CM component will select its own value. + * If not specified, SOMAXCONN, as defined in , will be used. */ int backlog; diff --git a/src/uct/base/uct_cm.c b/src/uct/base/uct_cm.c index 59c95f51ebc..c730f18d391 100644 --- a/src/uct/base/uct_cm.c +++ b/src/uct/base/uct_cm.c @@ -223,26 +223,27 @@ ucs_status_t uct_listener_reject(uct_listener_h listener, return listener->cm->ops->listener_reject(listener, conn_request); } -int uct_listener_backlog_adjust(const uct_listener_params_t *params, - int max_value) +ucs_status_t uct_listener_backlog_adjust(const uct_listener_params_t *params, + int max_value, int *backlog) { - int backlog; - if (params->field_mask & UCT_LISTENER_PARAM_FIELD_BACKLOG) { if (params->backlog > max_value) { ucs_diag("configure value %d is greater than the max_value %d. " "using max_value", params->backlog, max_value); + *backlog = max_value; + } else { + *backlog = params->backlog; } - backlog = ucs_min(params->backlog, max_value); } else { - backlog = max_value; + *backlog = max_value; } - if (backlog <= 0) { + if (*backlog <= 0) { ucs_error("the backlog value cannot be zero or negative"); + return UCS_ERR_INVALID_PARAM; } - return backlog; + return UCS_OK; } diff --git a/src/uct/base/uct_cm.h b/src/uct/base/uct_cm.h index d8e624705c0..691cc06cc17 100644 --- a/src/uct/base/uct_cm.h +++ b/src/uct/base/uct_cm.h @@ -108,8 +108,8 @@ extern ucs_config_field_t uct_cm_config_table[]; UCS_CLASS_DECLARE(uct_cm_t, uct_cm_ops_t*, uct_iface_ops_t*, uct_worker_h, uct_component_h); -int uct_listener_backlog_adjust(const uct_listener_params_t *params, - int default_value); +ucs_status_t uct_listener_backlog_adjust(const uct_listener_params_t *params, + int max_value, int *backlog); ucs_status_t uct_cm_set_common_data(uct_cm_base_ep_t *ep, const uct_ep_params_t *params); diff --git a/src/uct/ib/rdmacm/rdmacm_listener.c b/src/uct/ib/rdmacm/rdmacm_listener.c index e0d1c3e4e2e..6832fd56979 100644 --- a/src/uct/ib/rdmacm/rdmacm_listener.c +++ b/src/uct/ib/rdmacm/rdmacm_listener.c @@ -16,18 +16,18 @@ static long ucs_rdmacm_max_backlog() { - long max_backlog; + static long max_backlog = 0; - if (ucs_read_file_number(&max_backlog, 1, - UCS_RDMACM_MAX_BACKLOG_PATH) == UCS_OK) { + if ((max_backlog != 0) || + (ucs_read_file_number(&max_backlog, 1, UCS_RDMACM_MAX_BACKLOG_PATH) == UCS_OK)) { ucs_assert(max_backlog <= INT_MAX); - return max_backlog; } else { - ucs_warn("unable to read max_backlog value from %s file", + ucs_diag("unable to read max_backlog value from %s file", UCS_RDMACM_MAX_BACKLOG_PATH); max_backlog = 1024; - return max_backlog; } + + return max_backlog; } UCS_CLASS_INIT_FUNC(uct_rdmacm_listener_t, uct_cm_h cm, @@ -60,9 +60,9 @@ UCS_CLASS_INIT_FUNC(uct_rdmacm_listener_t, uct_cm_h cm, goto err_destroy_id; } - backlog = uct_listener_backlog_adjust(params, ucs_rdmacm_max_backlog()); - if (backlog <= 0) { - status = UCS_ERR_INVALID_PARAM; + status = uct_listener_backlog_adjust(params, ucs_rdmacm_max_backlog(), + &backlog); + if (status != UCS_OK) { goto err_destroy_id; } diff --git a/src/uct/tcp/tcp_listener.c b/src/uct/tcp/tcp_listener.c index 0bd0e9bd9e7..209245bc166 100644 --- a/src/uct/tcp/tcp_listener.c +++ b/src/uct/tcp/tcp_listener.c @@ -107,9 +107,8 @@ UCS_CLASS_INIT_FUNC(uct_tcp_listener_t, uct_cm_h cm, self->user_data = (params->field_mask & UCT_LISTENER_PARAM_FIELD_USER_DATA) ? params->user_data : NULL; - backlog = uct_listener_backlog_adjust(params, ucs_socket_max_conn()); - if (backlog <= 0) { - status = UCS_ERR_INVALID_PARAM; + status = uct_listener_backlog_adjust(params, ucs_socket_max_conn(), &backlog); + if (status != UCS_OK) { goto err; }