forked from Minki/linux
xprtrdma: Eliminate rpcrdma_ia::ri_device
Clean up.
Since commit 54cbd6b0c6
("xprtrdma: Delay DMA mapping Send and
Receive buffers"), a pointer to the device is now saved in each
regbuf when it is DMA mapped.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
c209e49cea
commit
f19bd0bbd3
@ -82,13 +82,13 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* frwr_is_supported - Check if device supports FRWR
|
* frwr_is_supported - Check if device supports FRWR
|
||||||
* @ia: interface adapter to check
|
* @device: interface adapter to check
|
||||||
*
|
*
|
||||||
* Returns true if device supports FRWR, otherwise false
|
* Returns true if device supports FRWR, otherwise false
|
||||||
*/
|
*/
|
||||||
bool frwr_is_supported(struct rpcrdma_ia *ia)
|
bool frwr_is_supported(struct ib_device *device)
|
||||||
{
|
{
|
||||||
struct ib_device_attr *attrs = &ia->ri_device->attrs;
|
struct ib_device_attr *attrs = &device->attrs;
|
||||||
|
|
||||||
if (!(attrs->device_cap_flags & IB_DEVICE_MEM_MGT_EXTENSIONS))
|
if (!(attrs->device_cap_flags & IB_DEVICE_MEM_MGT_EXTENSIONS))
|
||||||
goto out_not_supported;
|
goto out_not_supported;
|
||||||
@ -98,7 +98,7 @@ bool frwr_is_supported(struct rpcrdma_ia *ia)
|
|||||||
|
|
||||||
out_not_supported:
|
out_not_supported:
|
||||||
pr_info("rpcrdma: 'frwr' mode is not supported by device %s\n",
|
pr_info("rpcrdma: 'frwr' mode is not supported by device %s\n",
|
||||||
ia->ri_device->name);
|
device->name);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,7 +131,7 @@ frwr_mr_recycle_worker(struct work_struct *work)
|
|||||||
|
|
||||||
if (mr->mr_dir != DMA_NONE) {
|
if (mr->mr_dir != DMA_NONE) {
|
||||||
trace_xprtrdma_mr_unmap(mr);
|
trace_xprtrdma_mr_unmap(mr);
|
||||||
ib_dma_unmap_sg(r_xprt->rx_ia.ri_device,
|
ib_dma_unmap_sg(r_xprt->rx_ia.ri_id->device,
|
||||||
mr->mr_sg, mr->mr_nents, mr->mr_dir);
|
mr->mr_sg, mr->mr_nents, mr->mr_dir);
|
||||||
mr->mr_dir = DMA_NONE;
|
mr->mr_dir = DMA_NONE;
|
||||||
}
|
}
|
||||||
@ -211,7 +211,7 @@ out_list_err:
|
|||||||
int frwr_open(struct rpcrdma_ia *ia, struct rpcrdma_ep *ep,
|
int frwr_open(struct rpcrdma_ia *ia, struct rpcrdma_ep *ep,
|
||||||
struct rpcrdma_create_data_internal *cdata)
|
struct rpcrdma_create_data_internal *cdata)
|
||||||
{
|
{
|
||||||
struct ib_device_attr *attrs = &ia->ri_device->attrs;
|
struct ib_device_attr *attrs = &ia->ri_id->device->attrs;
|
||||||
int max_qp_wr, depth, delta;
|
int max_qp_wr, depth, delta;
|
||||||
|
|
||||||
ia->ri_mrtype = IB_MR_TYPE_MEM_REG;
|
ia->ri_mrtype = IB_MR_TYPE_MEM_REG;
|
||||||
@ -253,7 +253,7 @@ int frwr_open(struct rpcrdma_ia *ia, struct rpcrdma_ep *ep,
|
|||||||
} while (delta > 0);
|
} while (delta > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
max_qp_wr = ia->ri_device->attrs.max_qp_wr;
|
max_qp_wr = ia->ri_id->device->attrs.max_qp_wr;
|
||||||
max_qp_wr -= RPCRDMA_BACKWARD_WRS;
|
max_qp_wr -= RPCRDMA_BACKWARD_WRS;
|
||||||
max_qp_wr -= 1;
|
max_qp_wr -= 1;
|
||||||
if (max_qp_wr < RPCRDMA_MIN_SLOT_TABLE)
|
if (max_qp_wr < RPCRDMA_MIN_SLOT_TABLE)
|
||||||
@ -436,7 +436,8 @@ struct rpcrdma_mr_seg *frwr_map(struct rpcrdma_xprt *r_xprt,
|
|||||||
}
|
}
|
||||||
mr->mr_dir = rpcrdma_data_dir(writing);
|
mr->mr_dir = rpcrdma_data_dir(writing);
|
||||||
|
|
||||||
mr->mr_nents = ib_dma_map_sg(ia->ri_device, mr->mr_sg, i, mr->mr_dir);
|
mr->mr_nents =
|
||||||
|
ib_dma_map_sg(ia->ri_id->device, mr->mr_sg, i, mr->mr_dir);
|
||||||
if (!mr->mr_nents)
|
if (!mr->mr_nents)
|
||||||
goto out_dmamap_err;
|
goto out_dmamap_err;
|
||||||
|
|
||||||
|
@ -250,7 +250,7 @@ rpcrdma_cm_event_handler(struct rdma_cm_id *id, struct rdma_cm_event *event)
|
|||||||
case RDMA_CM_EVENT_DEVICE_REMOVAL:
|
case RDMA_CM_EVENT_DEVICE_REMOVAL:
|
||||||
#if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
|
#if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
|
||||||
pr_info("rpcrdma: removing device %s for %s:%s\n",
|
pr_info("rpcrdma: removing device %s for %s:%s\n",
|
||||||
ia->ri_device->name,
|
ia->ri_id->device->name,
|
||||||
rpcrdma_addrstr(r_xprt), rpcrdma_portstr(r_xprt));
|
rpcrdma_addrstr(r_xprt), rpcrdma_portstr(r_xprt));
|
||||||
#endif
|
#endif
|
||||||
set_bit(RPCRDMA_IAF_REMOVING, &ia->ri_flags);
|
set_bit(RPCRDMA_IAF_REMOVING, &ia->ri_flags);
|
||||||
@ -259,7 +259,6 @@ rpcrdma_cm_event_handler(struct rdma_cm_id *id, struct rdma_cm_event *event)
|
|||||||
wait_for_completion(&ia->ri_remove_done);
|
wait_for_completion(&ia->ri_remove_done);
|
||||||
|
|
||||||
ia->ri_id = NULL;
|
ia->ri_id = NULL;
|
||||||
ia->ri_device = NULL;
|
|
||||||
/* Return 1 to ensure the core destroys the id. */
|
/* Return 1 to ensure the core destroys the id. */
|
||||||
return 1;
|
return 1;
|
||||||
case RDMA_CM_EVENT_ESTABLISHED:
|
case RDMA_CM_EVENT_ESTABLISHED:
|
||||||
@ -294,7 +293,7 @@ disconnected:
|
|||||||
|
|
||||||
dprintk("RPC: %s: %s:%s on %s/frwr: %s\n", __func__,
|
dprintk("RPC: %s: %s:%s on %s/frwr: %s\n", __func__,
|
||||||
rpcrdma_addrstr(r_xprt), rpcrdma_portstr(r_xprt),
|
rpcrdma_addrstr(r_xprt), rpcrdma_portstr(r_xprt),
|
||||||
ia->ri_device->name, rdma_event_msg(event->event));
|
ia->ri_id->device->name, rdma_event_msg(event->event));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -373,9 +372,8 @@ rpcrdma_ia_open(struct rpcrdma_xprt *xprt)
|
|||||||
rc = PTR_ERR(ia->ri_id);
|
rc = PTR_ERR(ia->ri_id);
|
||||||
goto out_err;
|
goto out_err;
|
||||||
}
|
}
|
||||||
ia->ri_device = ia->ri_id->device;
|
|
||||||
|
|
||||||
ia->ri_pd = ib_alloc_pd(ia->ri_device, 0);
|
ia->ri_pd = ib_alloc_pd(ia->ri_id->device, 0);
|
||||||
if (IS_ERR(ia->ri_pd)) {
|
if (IS_ERR(ia->ri_pd)) {
|
||||||
rc = PTR_ERR(ia->ri_pd);
|
rc = PTR_ERR(ia->ri_pd);
|
||||||
pr_err("rpcrdma: ib_alloc_pd() returned %d\n", rc);
|
pr_err("rpcrdma: ib_alloc_pd() returned %d\n", rc);
|
||||||
@ -384,12 +382,12 @@ rpcrdma_ia_open(struct rpcrdma_xprt *xprt)
|
|||||||
|
|
||||||
switch (xprt_rdma_memreg_strategy) {
|
switch (xprt_rdma_memreg_strategy) {
|
||||||
case RPCRDMA_FRWR:
|
case RPCRDMA_FRWR:
|
||||||
if (frwr_is_supported(ia))
|
if (frwr_is_supported(ia->ri_id->device))
|
||||||
break;
|
break;
|
||||||
/*FALLTHROUGH*/
|
/*FALLTHROUGH*/
|
||||||
default:
|
default:
|
||||||
pr_err("rpcrdma: Device %s does not support memreg mode %d\n",
|
pr_err("rpcrdma: Device %s does not support memreg mode %d\n",
|
||||||
ia->ri_device->name, xprt_rdma_memreg_strategy);
|
ia->ri_id->device->name, xprt_rdma_memreg_strategy);
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
goto out_err;
|
goto out_err;
|
||||||
}
|
}
|
||||||
@ -471,7 +469,6 @@ rpcrdma_ia_close(struct rpcrdma_ia *ia)
|
|||||||
rdma_destroy_id(ia->ri_id);
|
rdma_destroy_id(ia->ri_id);
|
||||||
}
|
}
|
||||||
ia->ri_id = NULL;
|
ia->ri_id = NULL;
|
||||||
ia->ri_device = NULL;
|
|
||||||
|
|
||||||
/* If the pd is still busy, xprtrdma missed freeing a resource */
|
/* If the pd is still busy, xprtrdma missed freeing a resource */
|
||||||
if (ia->ri_pd && !IS_ERR(ia->ri_pd))
|
if (ia->ri_pd && !IS_ERR(ia->ri_pd))
|
||||||
@ -491,7 +488,7 @@ rpcrdma_ep_create(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia,
|
|||||||
unsigned int max_sge;
|
unsigned int max_sge;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
max_sge = min_t(unsigned int, ia->ri_device->attrs.max_send_sge,
|
max_sge = min_t(unsigned int, ia->ri_id->device->attrs.max_send_sge,
|
||||||
RPCRDMA_MAX_SEND_SGES);
|
RPCRDMA_MAX_SEND_SGES);
|
||||||
if (max_sge < RPCRDMA_MIN_SEND_SGES) {
|
if (max_sge < RPCRDMA_MIN_SEND_SGES) {
|
||||||
pr_warn("rpcrdma: HCA provides only %d send SGEs\n", max_sge);
|
pr_warn("rpcrdma: HCA provides only %d send SGEs\n", max_sge);
|
||||||
@ -526,16 +523,16 @@ rpcrdma_ep_create(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia,
|
|||||||
init_waitqueue_head(&ep->rep_connect_wait);
|
init_waitqueue_head(&ep->rep_connect_wait);
|
||||||
ep->rep_receive_count = 0;
|
ep->rep_receive_count = 0;
|
||||||
|
|
||||||
sendcq = ib_alloc_cq(ia->ri_device, NULL,
|
sendcq = ib_alloc_cq(ia->ri_id->device, NULL,
|
||||||
ep->rep_attr.cap.max_send_wr + 1,
|
ep->rep_attr.cap.max_send_wr + 1,
|
||||||
ia->ri_device->num_comp_vectors > 1 ? 1 : 0,
|
ia->ri_id->device->num_comp_vectors > 1 ? 1 : 0,
|
||||||
IB_POLL_WORKQUEUE);
|
IB_POLL_WORKQUEUE);
|
||||||
if (IS_ERR(sendcq)) {
|
if (IS_ERR(sendcq)) {
|
||||||
rc = PTR_ERR(sendcq);
|
rc = PTR_ERR(sendcq);
|
||||||
goto out1;
|
goto out1;
|
||||||
}
|
}
|
||||||
|
|
||||||
recvcq = ib_alloc_cq(ia->ri_device, NULL,
|
recvcq = ib_alloc_cq(ia->ri_id->device, NULL,
|
||||||
ep->rep_attr.cap.max_recv_wr + 1,
|
ep->rep_attr.cap.max_recv_wr + 1,
|
||||||
0, IB_POLL_WORKQUEUE);
|
0, IB_POLL_WORKQUEUE);
|
||||||
if (IS_ERR(recvcq)) {
|
if (IS_ERR(recvcq)) {
|
||||||
@ -561,7 +558,7 @@ rpcrdma_ep_create(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia,
|
|||||||
/* Client offers RDMA Read but does not initiate */
|
/* Client offers RDMA Read but does not initiate */
|
||||||
ep->rep_remote_cma.initiator_depth = 0;
|
ep->rep_remote_cma.initiator_depth = 0;
|
||||||
ep->rep_remote_cma.responder_resources =
|
ep->rep_remote_cma.responder_resources =
|
||||||
min_t(int, U8_MAX, ia->ri_device->attrs.max_qp_rd_atom);
|
min_t(int, U8_MAX, ia->ri_id->device->attrs.max_qp_rd_atom);
|
||||||
|
|
||||||
/* Limit transport retries so client can detect server
|
/* Limit transport retries so client can detect server
|
||||||
* GID changes quickly. RPC layer handles re-establishing
|
* GID changes quickly. RPC layer handles re-establishing
|
||||||
@ -673,7 +670,7 @@ rpcrdma_ep_reconnect(struct rpcrdma_xprt *r_xprt, struct rpcrdma_ep *ep,
|
|||||||
*/
|
*/
|
||||||
old = id;
|
old = id;
|
||||||
rc = -ENETUNREACH;
|
rc = -ENETUNREACH;
|
||||||
if (ia->ri_device != id->device) {
|
if (ia->ri_id->device != id->device) {
|
||||||
pr_err("rpcrdma: can't reconnect on different device!\n");
|
pr_err("rpcrdma: can't reconnect on different device!\n");
|
||||||
goto out_destroy;
|
goto out_destroy;
|
||||||
}
|
}
|
||||||
@ -1296,7 +1293,7 @@ rpcrdma_mr_unmap_and_put(struct rpcrdma_mr *mr)
|
|||||||
|
|
||||||
if (mr->mr_dir != DMA_NONE) {
|
if (mr->mr_dir != DMA_NONE) {
|
||||||
trace_xprtrdma_mr_unmap(mr);
|
trace_xprtrdma_mr_unmap(mr);
|
||||||
ib_dma_unmap_sg(r_xprt->rx_ia.ri_device,
|
ib_dma_unmap_sg(r_xprt->rx_ia.ri_id->device,
|
||||||
mr->mr_sg, mr->mr_nents, mr->mr_dir);
|
mr->mr_sg, mr->mr_nents, mr->mr_dir);
|
||||||
mr->mr_dir = DMA_NONE;
|
mr->mr_dir = DMA_NONE;
|
||||||
}
|
}
|
||||||
@ -1429,7 +1426,7 @@ bool rpcrdma_regbuf_realloc(struct rpcrdma_regbuf *rb, size_t size, gfp_t flags)
|
|||||||
bool __rpcrdma_regbuf_dma_map(struct rpcrdma_xprt *r_xprt,
|
bool __rpcrdma_regbuf_dma_map(struct rpcrdma_xprt *r_xprt,
|
||||||
struct rpcrdma_regbuf *rb)
|
struct rpcrdma_regbuf *rb)
|
||||||
{
|
{
|
||||||
struct ib_device *device = r_xprt->rx_ia.ri_device;
|
struct ib_device *device = r_xprt->rx_ia.ri_id->device;
|
||||||
|
|
||||||
if (rb->rg_direction == DMA_NONE)
|
if (rb->rg_direction == DMA_NONE)
|
||||||
return false;
|
return false;
|
||||||
|
@ -66,11 +66,8 @@
|
|||||||
* Interface Adapter -- one per transport instance
|
* Interface Adapter -- one per transport instance
|
||||||
*/
|
*/
|
||||||
struct rpcrdma_ia {
|
struct rpcrdma_ia {
|
||||||
struct ib_device *ri_device;
|
|
||||||
struct rdma_cm_id *ri_id;
|
struct rdma_cm_id *ri_id;
|
||||||
struct ib_pd *ri_pd;
|
struct ib_pd *ri_pd;
|
||||||
struct completion ri_done;
|
|
||||||
struct completion ri_remove_done;
|
|
||||||
int ri_async_rc;
|
int ri_async_rc;
|
||||||
unsigned int ri_max_segs;
|
unsigned int ri_max_segs;
|
||||||
unsigned int ri_max_frwr_depth;
|
unsigned int ri_max_frwr_depth;
|
||||||
@ -80,6 +77,8 @@ struct rpcrdma_ia {
|
|||||||
bool ri_implicit_roundup;
|
bool ri_implicit_roundup;
|
||||||
enum ib_mr_type ri_mrtype;
|
enum ib_mr_type ri_mrtype;
|
||||||
unsigned long ri_flags;
|
unsigned long ri_flags;
|
||||||
|
struct completion ri_done;
|
||||||
|
struct completion ri_remove_done;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@ -585,7 +584,7 @@ rpcrdma_data_dir(bool writing)
|
|||||||
|
|
||||||
/* Memory registration calls xprtrdma/frwr_ops.c
|
/* Memory registration calls xprtrdma/frwr_ops.c
|
||||||
*/
|
*/
|
||||||
bool frwr_is_supported(struct rpcrdma_ia *);
|
bool frwr_is_supported(struct ib_device *device);
|
||||||
int frwr_open(struct rpcrdma_ia *ia, struct rpcrdma_ep *ep,
|
int frwr_open(struct rpcrdma_ia *ia, struct rpcrdma_ep *ep,
|
||||||
struct rpcrdma_create_data_internal *cdata);
|
struct rpcrdma_create_data_internal *cdata);
|
||||||
int frwr_init_mr(struct rpcrdma_ia *ia, struct rpcrdma_mr *mr);
|
int frwr_init_mr(struct rpcrdma_ia *ia, struct rpcrdma_mr *mr);
|
||||||
|
Loading…
Reference in New Issue
Block a user