]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - net/sunrpc/xprtrdma/transport.c
xprtrdma: Toggle XPRT_CONGESTED in xprtrdma's slot methods
[linux.git] / net / sunrpc / xprtrdma / transport.c
index 52abddac19e5c4402e46e1f2285c8b1f71243e4a..f4763e8a67617fbd5ad700b00550e39bdc74eeb4 100644 (file)
@@ -80,7 +80,6 @@ static unsigned int min_slot_table_size = RPCRDMA_MIN_SLOT_TABLE;
 static unsigned int max_slot_table_size = RPCRDMA_MAX_SLOT_TABLE;
 static unsigned int min_inline_size = RPCRDMA_MIN_INLINE;
 static unsigned int max_inline_size = RPCRDMA_MAX_INLINE;
-static unsigned int zero;
 static unsigned int max_padding = PAGE_SIZE;
 static unsigned int min_memreg = RPCRDMA_BOUNCEBUFFERS;
 static unsigned int max_memreg = RPCRDMA_LAST - 1;
@@ -122,7 +121,7 @@ static struct ctl_table xr_tunables_table[] = {
                .maxlen         = sizeof(unsigned int),
                .mode           = 0644,
                .proc_handler   = proc_dointvec_minmax,
-               .extra1         = &zero,
+               .extra1         = SYSCTL_ZERO,
                .extra2         = &max_padding,
        },
        {
@@ -572,6 +571,7 @@ xprt_rdma_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task)
        return;
 
 out_sleep:
+       set_bit(XPRT_CONGESTED, &xprt->state);
        rpc_sleep_on(&xprt->backlog, task, NULL);
        task->tk_status = -EAGAIN;
 }
@@ -590,7 +590,8 @@ xprt_rdma_free_slot(struct rpc_xprt *xprt, struct rpc_rqst *rqst)
 
        memset(rqst, 0, sizeof(*rqst));
        rpcrdma_buffer_put(&r_xprt->rx_buf, rpcr_to_rdmar(rqst));
-       rpc_wake_up_next(&xprt->backlog);
+       if (unlikely(!rpc_wake_up_next(&xprt->backlog)))
+               clear_bit(XPRT_CONGESTED, &xprt->state);
 }
 
 static bool rpcrdma_check_regbuf(struct rpcrdma_xprt *r_xprt,