--- ./source/private_module/target/ist_trgt.c	2021-11-22 02:22:08.753972245 +0000
+++ ./source/private_module/target/ist_trgt.c.hotpatch	2021-11-23 09:40:48.638224318 +0000
@@ -667,7 +667,7 @@
 }
 
 /*ֽ׶ûеΪpclintע,Ժܻܿ,ɾ*/
-
+void ist_tcp_fixup_rcvbuf_patch(struct sock *sk);
 /*
  *****************************************************************************
  *     : IST_TcpNagleOff
@@ -689,8 +689,12 @@
     ISCSI_S32 iRetval = 0;
     ISCSI_S32 iOptlen = 0;
     ISCSI_S32 iOnoff = 0;
-    
-    /*BEGIN: Modified by h90003510,,ȥ 2013/6/06  ⵥ:DTS2013060501016*/
+    struct sock *sk = pstSock->sk;
+    if (ADJUSTBUF_SUPPORT == IST_GetAdjustBufSupport()) {
+        sk->sk_userlocks &= ~SOCK_RCVBUF_LOCK;
+        ist_tcp_fixup_rcvbuf_patch(sk);
+        ISCSI_LOG_PERIOD(INFO, 0x0, 1, 1800*HZ, "%s : socket %p rcvbuf is fixup to %d.", current->comm, pstSock, sk->sk_rcvbuf);
+    }
     iRetval = kernel_setsockopt(pstSock, SOL_TCP, TCP_NODELAY,
                                 (ISCSI_VOID *) &pstSock, sizeof (ISCSI_S32));
     if (iRetval < 0)
@@ -698,10 +702,7 @@
         ISCSI_DBG_LOGIN_INFO(0x32, "%s : Can't turn off Nagle of socket %p , error %d",
                    current->comm , pstSock, iRetval);
     }
-    
-    /* verify current setting of Nagle Algorithm */
     iOptlen = sizeof (ISCSI_S32);
-
     iRetval = kernel_getsockopt(pstSock, SOL_TCP, TCP_NODELAY,
                                 (ISCSI_VOID *) &iOnoff, &iOptlen);
     if (iRetval >= 0)
@@ -709,7 +710,6 @@
         ISCSI_DBG_LOGIN_INFO(0x123, " %s socket %p tcp Nagle  is %s.",
                   current->comm , pstSock, iOnoff ? "off" : "on");
     }
-    /*END: Modified by h90003510,,ȥ 2013/6/06  ⵥ:DTS2013060501016*/
 }
 
 
@@ -1623,3 +1623,36 @@
     }
 }
  
+static inline int ist_tcp_win_from_space_patch(int space)
+{
+    return sysctl_tcp_adv_win_scale<=0 ?
+        (space>>(-sysctl_tcp_adv_win_scale)) :
+        space - (space>>sysctl_tcp_adv_win_scale);
+}
+
+void ist_tcp_fixup_rcvbuf_patch(struct sock *sk)
+{
+    u32 mss = tcp_sk(sk)->advmss;
+    u32 icwnd = TCP_DEFAULT_INIT_RCVWND;
+    int rcvmem;
+
+    /* Limit to 10 segments if mss <= 1460,
+     * or 14600/mss segments, with a minimum of two segments.
+     */
+    if (mss > 1460)
+        icwnd = max_t(u32, (1460 * TCP_DEFAULT_INIT_RCVWND) / mss, 2);
+
+    rcvmem = SKB_TRUESIZE(mss + MAX_TCP_HEADER);
+    while (ist_tcp_win_from_space_patch(rcvmem) < mss)
+        rcvmem += 128;
+
+    rcvmem *= icwnd;
+
+    /* ˴EulerСն룬ҪrcvbufԭĬֵ
+     * iSCSIǰùrcvbufҪifȥָĬֵ
+     * ֱȥif֮ӰEulerӰ졣
+     */
+    // if (sk->sk_rcvbuf < rcvmem)
+    sk->sk_rcvbuf = min(rcvmem, sysctl_tcp_rmem[2]);
+}
+
