@@ -57,6 +57,9 @@ static ssize_t smb_extract_iter_to_rdma(struct iov_iter *iter, size_t len,
5757/* SMBD negotiation timeout in seconds */
5858#define SMBD_NEGOTIATE_TIMEOUT 120
5959
60+ /* The timeout to wait for a keepalive message from peer in seconds */
61+ #define KEEPALIVE_RECV_TIMEOUT 5
62+
6063/* SMBD minimum receive size and fragmented sized defined in [MS-SMBD] */
6164#define SMBD_MIN_RECEIVE_SIZE 128
6265#define SMBD_MIN_FRAGMENTED_SIZE 131072
@@ -721,6 +724,7 @@ static struct rdma_cm_id *smbd_create_id(
721724 struct sockaddr * dstaddr , int port )
722725{
723726 struct smbdirect_socket * sc = & info -> socket ;
727+ struct smbdirect_socket_parameters * sp = & sc -> parameters ;
724728 struct rdma_cm_id * id ;
725729 int rc ;
726730 __be16 * sport ;
@@ -743,15 +747,15 @@ static struct rdma_cm_id *smbd_create_id(
743747 WARN_ON_ONCE (sc -> status != SMBDIRECT_SOCKET_RESOLVE_ADDR_NEEDED );
744748 sc -> status = SMBDIRECT_SOCKET_RESOLVE_ADDR_RUNNING ;
745749 rc = rdma_resolve_addr (id , NULL , (struct sockaddr * )dstaddr ,
746- RDMA_RESOLVE_TIMEOUT );
750+ sp -> resolve_addr_timeout_msec );
747751 if (rc ) {
748752 log_rdma_event (ERR , "rdma_resolve_addr() failed %i\n" , rc );
749753 goto out ;
750754 }
751755 rc = wait_event_interruptible_timeout (
752756 sc -> status_wait ,
753757 sc -> status != SMBDIRECT_SOCKET_RESOLVE_ADDR_RUNNING ,
754- msecs_to_jiffies (RDMA_RESOLVE_TIMEOUT ));
758+ msecs_to_jiffies (sp -> resolve_addr_timeout_msec ));
755759 /* e.g. if interrupted returns -ERESTARTSYS */
756760 if (rc < 0 ) {
757761 log_rdma_event (ERR , "rdma_resolve_addr timeout rc: %i\n" , rc );
@@ -770,15 +774,15 @@ static struct rdma_cm_id *smbd_create_id(
770774
771775 WARN_ON_ONCE (sc -> status != SMBDIRECT_SOCKET_RESOLVE_ROUTE_NEEDED );
772776 sc -> status = SMBDIRECT_SOCKET_RESOLVE_ROUTE_RUNNING ;
773- rc = rdma_resolve_route (id , RDMA_RESOLVE_TIMEOUT );
777+ rc = rdma_resolve_route (id , sp -> resolve_route_timeout_msec );
774778 if (rc ) {
775779 log_rdma_event (ERR , "rdma_resolve_route() failed %i\n" , rc );
776780 goto out ;
777781 }
778782 rc = wait_event_interruptible_timeout (
779783 sc -> status_wait ,
780784 sc -> status != SMBDIRECT_SOCKET_RESOLVE_ROUTE_RUNNING ,
781- msecs_to_jiffies (RDMA_RESOLVE_TIMEOUT ));
785+ msecs_to_jiffies (sp -> resolve_route_timeout_msec ));
782786 /* e.g. if interrupted returns -ERESTARTSYS */
783787 if (rc < 0 ) {
784788 log_rdma_event (ERR , "rdma_resolve_addr timeout rc: %i\n" , rc );
@@ -1266,6 +1270,7 @@ static int smbd_post_recv(
12661270static int smbd_negotiate (struct smbd_connection * info )
12671271{
12681272 struct smbdirect_socket * sc = & info -> socket ;
1273+ struct smbdirect_socket_parameters * sp = & sc -> parameters ;
12691274 int rc ;
12701275 struct smbdirect_recv_io * response = get_receive_buffer (info );
12711276
@@ -1289,7 +1294,7 @@ static int smbd_negotiate(struct smbd_connection *info)
12891294 rc = wait_event_interruptible_timeout (
12901295 sc -> status_wait ,
12911296 sc -> status != SMBDIRECT_SOCKET_NEGOTIATE_RUNNING ,
1292- secs_to_jiffies ( SMBD_NEGOTIATE_TIMEOUT ));
1297+ msecs_to_jiffies ( sp -> negotiate_timeout_msec ));
12931298 log_rdma_event (INFO , "wait_event_interruptible_timeout rc=%d\n" , rc );
12941299
12951300 if (sc -> status == SMBDIRECT_SOCKET_CONNECTED )
@@ -1718,12 +1723,17 @@ static struct smbd_connection *_smbd_get_connection(
17181723
17191724 INIT_WORK (& sc -> disconnect_work , smbd_disconnect_rdma_work );
17201725
1726+ sp -> resolve_addr_timeout_msec = RDMA_RESOLVE_TIMEOUT ;
1727+ sp -> resolve_route_timeout_msec = RDMA_RESOLVE_TIMEOUT ;
1728+ sp -> rdma_connect_timeout_msec = RDMA_RESOLVE_TIMEOUT ;
1729+ sp -> negotiate_timeout_msec = SMBD_NEGOTIATE_TIMEOUT * 1000 ;
17211730 sp -> recv_credit_max = smbd_receive_credit_max ;
17221731 sp -> send_credit_target = smbd_send_credit_target ;
17231732 sp -> max_send_size = smbd_max_send_size ;
17241733 sp -> max_fragmented_recv_size = smbd_max_fragmented_recv_size ;
17251734 sp -> max_recv_size = smbd_max_receive_size ;
17261735 sp -> keepalive_interval_msec = smbd_keep_alive_interval * 1000 ;
1736+ sp -> keepalive_timeout_msec = KEEPALIVE_RECV_TIMEOUT * 1000 ;
17271737
17281738 rc = smbd_ia_open (info , dstaddr , port );
17291739 if (rc ) {
@@ -1838,7 +1848,7 @@ static struct smbd_connection *_smbd_get_connection(
18381848 wait_event_interruptible_timeout (
18391849 sc -> status_wait ,
18401850 sc -> status != SMBDIRECT_SOCKET_RDMA_CONNECT_RUNNING ,
1841- msecs_to_jiffies (RDMA_RESOLVE_TIMEOUT ));
1851+ msecs_to_jiffies (sp -> rdma_connect_timeout_msec ));
18421852
18431853 if (sc -> status != SMBDIRECT_SOCKET_NEGOTIATE_NEEDED ) {
18441854 log_rdma_event (ERR , "rdma_connect failed port=%d\n" , port );
0 commit comments