diff options
Diffstat (limited to 'net/sunrpc/xprtrdma/transport.c')
| -rw-r--r-- | net/sunrpc/xprtrdma/transport.c | 41 |
1 files changed, 31 insertions, 10 deletions
diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c index a564c1a39ec5..9839c3d94145 100644 --- a/net/sunrpc/xprtrdma/transport.c +++ b/net/sunrpc/xprtrdma/transport.c | |||
| @@ -70,11 +70,8 @@ static unsigned int xprt_rdma_slot_table_entries = RPCRDMA_DEF_SLOT_TABLE; | |||
| 70 | static unsigned int xprt_rdma_max_inline_read = RPCRDMA_DEF_INLINE; | 70 | static unsigned int xprt_rdma_max_inline_read = RPCRDMA_DEF_INLINE; |
| 71 | static unsigned int xprt_rdma_max_inline_write = RPCRDMA_DEF_INLINE; | 71 | static unsigned int xprt_rdma_max_inline_write = RPCRDMA_DEF_INLINE; |
| 72 | static unsigned int xprt_rdma_inline_write_padding; | 72 | static unsigned int xprt_rdma_inline_write_padding; |
| 73 | #if !RPCRDMA_PERSISTENT_REGISTRATION | 73 | static unsigned int xprt_rdma_memreg_strategy = RPCRDMA_FRMR; |
| 74 | static unsigned int xprt_rdma_memreg_strategy = RPCRDMA_REGISTER; /* FMR? */ | 74 | int xprt_rdma_pad_optimize = 0; |
| 75 | #else | ||
| 76 | static unsigned int xprt_rdma_memreg_strategy = RPCRDMA_ALLPHYSICAL; | ||
| 77 | #endif | ||
| 78 | 75 | ||
| 79 | #ifdef RPC_DEBUG | 76 | #ifdef RPC_DEBUG |
| 80 | 77 | ||
| @@ -140,6 +137,14 @@ static ctl_table xr_tunables_table[] = { | |||
| 140 | .extra2 = &max_memreg, | 137 | .extra2 = &max_memreg, |
| 141 | }, | 138 | }, |
| 142 | { | 139 | { |
| 140 | .ctl_name = CTL_UNNUMBERED, | ||
| 141 | .procname = "rdma_pad_optimize", | ||
| 142 | .data = &xprt_rdma_pad_optimize, | ||
| 143 | .maxlen = sizeof(unsigned int), | ||
| 144 | .mode = 0644, | ||
| 145 | .proc_handler = &proc_dointvec, | ||
| 146 | }, | ||
| 147 | { | ||
| 143 | .ctl_name = 0, | 148 | .ctl_name = 0, |
| 144 | }, | 149 | }, |
| 145 | }; | 150 | }; |
| @@ -458,6 +463,8 @@ xprt_rdma_close(struct rpc_xprt *xprt) | |||
| 458 | struct rpcrdma_xprt *r_xprt = rpcx_to_rdmax(xprt); | 463 | struct rpcrdma_xprt *r_xprt = rpcx_to_rdmax(xprt); |
| 459 | 464 | ||
| 460 | dprintk("RPC: %s: closing\n", __func__); | 465 | dprintk("RPC: %s: closing\n", __func__); |
| 466 | if (r_xprt->rx_ep.rep_connected > 0) | ||
| 467 | xprt->reestablish_timeout = 0; | ||
| 461 | xprt_disconnect_done(xprt); | 468 | xprt_disconnect_done(xprt); |
| 462 | (void) rpcrdma_ep_disconnect(&r_xprt->rx_ep, &r_xprt->rx_ia); | 469 | (void) rpcrdma_ep_disconnect(&r_xprt->rx_ep, &r_xprt->rx_ia); |
| 463 | } | 470 | } |
| @@ -485,6 +492,11 @@ xprt_rdma_connect(struct rpc_task *task) | |||
| 485 | /* Reconnect */ | 492 | /* Reconnect */ |
| 486 | schedule_delayed_work(&r_xprt->rdma_connect, | 493 | schedule_delayed_work(&r_xprt->rdma_connect, |
| 487 | xprt->reestablish_timeout); | 494 | xprt->reestablish_timeout); |
| 495 | xprt->reestablish_timeout <<= 1; | ||
| 496 | if (xprt->reestablish_timeout > (30 * HZ)) | ||
| 497 | xprt->reestablish_timeout = (30 * HZ); | ||
| 498 | else if (xprt->reestablish_timeout < (5 * HZ)) | ||
| 499 | xprt->reestablish_timeout = (5 * HZ); | ||
| 488 | } else { | 500 | } else { |
| 489 | schedule_delayed_work(&r_xprt->rdma_connect, 0); | 501 | schedule_delayed_work(&r_xprt->rdma_connect, 0); |
| 490 | if (!RPC_IS_ASYNC(task)) | 502 | if (!RPC_IS_ASYNC(task)) |
| @@ -591,6 +603,7 @@ xprt_rdma_allocate(struct rpc_task *task, size_t size) | |||
| 591 | } | 603 | } |
| 592 | dprintk("RPC: %s: size %zd, request 0x%p\n", __func__, size, req); | 604 | dprintk("RPC: %s: size %zd, request 0x%p\n", __func__, size, req); |
| 593 | out: | 605 | out: |
| 606 | req->rl_connect_cookie = 0; /* our reserved value */ | ||
| 594 | return req->rl_xdr_buf; | 607 | return req->rl_xdr_buf; |
| 595 | 608 | ||
| 596 | outfail: | 609 | outfail: |
| @@ -694,13 +707,21 @@ xprt_rdma_send_request(struct rpc_task *task) | |||
| 694 | req->rl_reply->rr_xprt = xprt; | 707 | req->rl_reply->rr_xprt = xprt; |
| 695 | } | 708 | } |
| 696 | 709 | ||
| 697 | if (rpcrdma_ep_post(&r_xprt->rx_ia, &r_xprt->rx_ep, req)) { | 710 | /* Must suppress retransmit to maintain credits */ |
| 698 | xprt_disconnect_done(xprt); | 711 | if (req->rl_connect_cookie == xprt->connect_cookie) |
| 699 | return -ENOTCONN; /* implies disconnect */ | 712 | goto drop_connection; |
| 700 | } | 713 | req->rl_connect_cookie = xprt->connect_cookie; |
| 714 | |||
| 715 | if (rpcrdma_ep_post(&r_xprt->rx_ia, &r_xprt->rx_ep, req)) | ||
| 716 | goto drop_connection; | ||
| 701 | 717 | ||
| 718 | task->tk_bytes_sent += rqst->rq_snd_buf.len; | ||
| 702 | rqst->rq_bytes_sent = 0; | 719 | rqst->rq_bytes_sent = 0; |
| 703 | return 0; | 720 | return 0; |
| 721 | |||
| 722 | drop_connection: | ||
| 723 | xprt_disconnect_done(xprt); | ||
| 724 | return -ENOTCONN; /* implies disconnect */ | ||
| 704 | } | 725 | } |
| 705 | 726 | ||
| 706 | static void xprt_rdma_print_stats(struct rpc_xprt *xprt, struct seq_file *seq) | 727 | static void xprt_rdma_print_stats(struct rpc_xprt *xprt, struct seq_file *seq) |
| @@ -770,7 +791,7 @@ static void __exit xprt_rdma_cleanup(void) | |||
| 770 | { | 791 | { |
| 771 | int rc; | 792 | int rc; |
| 772 | 793 | ||
| 773 | dprintk("RPCRDMA Module Removed, deregister RPC RDMA transport\n"); | 794 | dprintk(KERN_INFO "RPCRDMA Module Removed, deregister RPC RDMA transport\n"); |
| 774 | #ifdef RPC_DEBUG | 795 | #ifdef RPC_DEBUG |
| 775 | if (sunrpc_table_header) { | 796 | if (sunrpc_table_header) { |
| 776 | unregister_sysctl_table(sunrpc_table_header); | 797 | unregister_sysctl_table(sunrpc_table_header); |
