On Mon, 2021-12-20 at 11:39 +0800, Bixuan Cui wrote: > ping~ > > 在 2021/12/14 下午9:53, Bixuan Cui 写道: > > When the values of tcp_max_slot_table_entries and > > sunrpc.tcp_slot_table_entries are lower than the number of rpc > > tasks, > > xprt_dynamic_alloc_slot() in xprt_alloc_slot() will return -EAGAIN, > > and > > then set xprt->state to XPRT_CONGESTED: > > xprt_retry_reserve > > ->xprt_do_reserve > > ->xprt_alloc_slot > > ->xprt_dynamic_alloc_slot // return -EAGAIN and task- > > >tk_rqstp is NULL > > ->xprt_add_backlog // set_bit(XPRT_CONGESTED, &xprt- > > >state); > > > > When rpc task is killed, XPRT_CONGESTED bit of xprt->state will not > > be > > cleaned up and nfs hangs: > > rpc_exit_task > > ->xprt_release // if (req == NULL) is true, then > > XPRT_CONGESTED > > // bit not clean > > > > Add xprt_wake_up_backlog(xprt) to clean XPRT_CONGESTED bit in > > xprt_release(). I'm not seeing how this explanation makes sense. If the task doesn't hold a slot, then freeing that task isn't going to clear the congestion caused by all the slots being in use. -- Trond Myklebust Linux NFS client maintainer, Hammerspace trond.myklebust@xxxxxxxxxxxxxxx