@@ -1296,18 +1296,23 @@ static int svc_tcp_sendto(struct svc_rqst *rqstp)
1296
1296
svc_tcp_release_ctxt (xprt , rqstp -> rq_xprt_ctxt );
1297
1297
rqstp -> rq_xprt_ctxt = NULL ;
1298
1298
1299
+ atomic_inc (& svsk -> sk_sendqlen );
1299
1300
mutex_lock (& xprt -> xpt_mutex );
1300
1301
if (svc_xprt_is_dead (xprt ))
1301
1302
goto out_notconn ;
1303
+ tcp_sock_set_cork (svsk -> sk_sk , true);
1302
1304
err = svc_tcp_sendmsg (svsk -> sk_sock , xdr , marker , & sent );
1303
1305
xdr_free_bvec (xdr );
1304
1306
trace_svcsock_tcp_send (xprt , err < 0 ? (long )err : sent );
1305
1307
if (err < 0 || sent != (xdr -> len + sizeof (marker )))
1306
1308
goto out_close ;
1309
+ if (atomic_dec_and_test (& svsk -> sk_sendqlen ))
1310
+ tcp_sock_set_cork (svsk -> sk_sk , false);
1307
1311
mutex_unlock (& xprt -> xpt_mutex );
1308
1312
return sent ;
1309
1313
1310
1314
out_notconn :
1315
+ atomic_dec (& svsk -> sk_sendqlen );
1311
1316
mutex_unlock (& xprt -> xpt_mutex );
1312
1317
return - ENOTCONN ;
1313
1318
out_close :
@@ -1316,6 +1321,7 @@ static int svc_tcp_sendto(struct svc_rqst *rqstp)
1316
1321
(err < 0 ) ? "got error" : "sent" ,
1317
1322
(err < 0 ) ? err : sent , xdr -> len );
1318
1323
svc_xprt_deferred_close (xprt );
1324
+ atomic_dec (& svsk -> sk_sendqlen );
1319
1325
mutex_unlock (& xprt -> xpt_mutex );
1320
1326
return - EAGAIN ;
1321
1327
}
0 commit comments