svcrdma: Remove frmr cache
Clean up: Now that the svc_rdma_recvfrom path uses the rdma_rw API, the details of Read sink buffer registration are dealt with by the kernel's RDMA core. This cache is no longer used, and can be removed. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
parent
c84dc900d7
commit
463e63d701
|
@ -77,7 +77,6 @@ extern atomic_t rdma_stat_sq_prod;
|
||||||
*/
|
*/
|
||||||
struct svc_rdma_op_ctxt {
|
struct svc_rdma_op_ctxt {
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
struct svc_rdma_fastreg_mr *frmr;
|
|
||||||
struct xdr_buf arg;
|
struct xdr_buf arg;
|
||||||
struct ib_cqe cqe;
|
struct ib_cqe cqe;
|
||||||
u32 byte_len;
|
u32 byte_len;
|
||||||
|
@ -91,17 +90,6 @@ struct svc_rdma_op_ctxt {
|
||||||
struct page *pages[RPCSVC_MAXPAGES];
|
struct page *pages[RPCSVC_MAXPAGES];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct svc_rdma_fastreg_mr {
|
|
||||||
struct ib_mr *mr;
|
|
||||||
struct scatterlist *sg;
|
|
||||||
int sg_nents;
|
|
||||||
unsigned long access_flags;
|
|
||||||
enum dma_data_direction direction;
|
|
||||||
struct list_head frmr_list;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define RDMACTXT_F_LAST_CTXT 2
|
|
||||||
|
|
||||||
#define SVCRDMA_DEVCAP_FAST_REG 1 /* fast mr registration */
|
#define SVCRDMA_DEVCAP_FAST_REG 1 /* fast mr registration */
|
||||||
#define SVCRDMA_DEVCAP_READ_W_INV 2 /* read w/ invalidate */
|
#define SVCRDMA_DEVCAP_READ_W_INV 2 /* read w/ invalidate */
|
||||||
|
|
||||||
|
@ -136,9 +124,6 @@ struct svcxprt_rdma {
|
||||||
struct ib_cq *sc_rq_cq;
|
struct ib_cq *sc_rq_cq;
|
||||||
struct ib_cq *sc_sq_cq;
|
struct ib_cq *sc_sq_cq;
|
||||||
u32 sc_dev_caps; /* distilled device caps */
|
u32 sc_dev_caps; /* distilled device caps */
|
||||||
unsigned int sc_frmr_pg_list_len;
|
|
||||||
struct list_head sc_frmr_q;
|
|
||||||
spinlock_t sc_frmr_q_lock;
|
|
||||||
|
|
||||||
spinlock_t sc_lock; /* transport lock */
|
spinlock_t sc_lock; /* transport lock */
|
||||||
|
|
||||||
|
@ -210,9 +195,6 @@ extern int svc_rdma_create_listen(struct svc_serv *, int, struct sockaddr *);
|
||||||
extern struct svc_rdma_op_ctxt *svc_rdma_get_context(struct svcxprt_rdma *);
|
extern struct svc_rdma_op_ctxt *svc_rdma_get_context(struct svcxprt_rdma *);
|
||||||
extern void svc_rdma_put_context(struct svc_rdma_op_ctxt *, int);
|
extern void svc_rdma_put_context(struct svc_rdma_op_ctxt *, int);
|
||||||
extern void svc_rdma_unmap_dma(struct svc_rdma_op_ctxt *ctxt);
|
extern void svc_rdma_unmap_dma(struct svc_rdma_op_ctxt *ctxt);
|
||||||
extern struct svc_rdma_fastreg_mr *svc_rdma_get_frmr(struct svcxprt_rdma *);
|
|
||||||
extern void svc_rdma_put_frmr(struct svcxprt_rdma *,
|
|
||||||
struct svc_rdma_fastreg_mr *);
|
|
||||||
extern void svc_sq_reap(struct svcxprt_rdma *);
|
extern void svc_sq_reap(struct svcxprt_rdma *);
|
||||||
extern void svc_rq_reap(struct svcxprt_rdma *);
|
extern void svc_rq_reap(struct svcxprt_rdma *);
|
||||||
extern void svc_rdma_prep_reply_hdr(struct svc_rqst *);
|
extern void svc_rdma_prep_reply_hdr(struct svc_rqst *);
|
||||||
|
|
|
@ -202,7 +202,6 @@ struct svc_rdma_op_ctxt *svc_rdma_get_context(struct svcxprt_rdma *xprt)
|
||||||
out:
|
out:
|
||||||
ctxt->count = 0;
|
ctxt->count = 0;
|
||||||
ctxt->mapped_sges = 0;
|
ctxt->mapped_sges = 0;
|
||||||
ctxt->frmr = NULL;
|
|
||||||
return ctxt;
|
return ctxt;
|
||||||
|
|
||||||
out_empty:
|
out_empty:
|
||||||
|
@ -387,14 +386,12 @@ static struct svcxprt_rdma *rdma_create_xprt(struct svc_serv *serv,
|
||||||
INIT_LIST_HEAD(&cma_xprt->sc_accept_q);
|
INIT_LIST_HEAD(&cma_xprt->sc_accept_q);
|
||||||
INIT_LIST_HEAD(&cma_xprt->sc_rq_dto_q);
|
INIT_LIST_HEAD(&cma_xprt->sc_rq_dto_q);
|
||||||
INIT_LIST_HEAD(&cma_xprt->sc_read_complete_q);
|
INIT_LIST_HEAD(&cma_xprt->sc_read_complete_q);
|
||||||
INIT_LIST_HEAD(&cma_xprt->sc_frmr_q);
|
|
||||||
INIT_LIST_HEAD(&cma_xprt->sc_ctxts);
|
INIT_LIST_HEAD(&cma_xprt->sc_ctxts);
|
||||||
INIT_LIST_HEAD(&cma_xprt->sc_rw_ctxts);
|
INIT_LIST_HEAD(&cma_xprt->sc_rw_ctxts);
|
||||||
init_waitqueue_head(&cma_xprt->sc_send_wait);
|
init_waitqueue_head(&cma_xprt->sc_send_wait);
|
||||||
|
|
||||||
spin_lock_init(&cma_xprt->sc_lock);
|
spin_lock_init(&cma_xprt->sc_lock);
|
||||||
spin_lock_init(&cma_xprt->sc_rq_dto_lock);
|
spin_lock_init(&cma_xprt->sc_rq_dto_lock);
|
||||||
spin_lock_init(&cma_xprt->sc_frmr_q_lock);
|
|
||||||
spin_lock_init(&cma_xprt->sc_ctxt_lock);
|
spin_lock_init(&cma_xprt->sc_ctxt_lock);
|
||||||
spin_lock_init(&cma_xprt->sc_rw_ctxt_lock);
|
spin_lock_init(&cma_xprt->sc_rw_ctxt_lock);
|
||||||
|
|
||||||
|
@ -705,86 +702,6 @@ static struct svc_xprt *svc_rdma_create(struct svc_serv *serv,
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct svc_rdma_fastreg_mr *rdma_alloc_frmr(struct svcxprt_rdma *xprt)
|
|
||||||
{
|
|
||||||
struct ib_mr *mr;
|
|
||||||
struct scatterlist *sg;
|
|
||||||
struct svc_rdma_fastreg_mr *frmr;
|
|
||||||
u32 num_sg;
|
|
||||||
|
|
||||||
frmr = kmalloc(sizeof(*frmr), GFP_KERNEL);
|
|
||||||
if (!frmr)
|
|
||||||
goto err;
|
|
||||||
|
|
||||||
num_sg = min_t(u32, RPCSVC_MAXPAGES, xprt->sc_frmr_pg_list_len);
|
|
||||||
mr = ib_alloc_mr(xprt->sc_pd, IB_MR_TYPE_MEM_REG, num_sg);
|
|
||||||
if (IS_ERR(mr))
|
|
||||||
goto err_free_frmr;
|
|
||||||
|
|
||||||
sg = kcalloc(RPCSVC_MAXPAGES, sizeof(*sg), GFP_KERNEL);
|
|
||||||
if (!sg)
|
|
||||||
goto err_free_mr;
|
|
||||||
|
|
||||||
sg_init_table(sg, RPCSVC_MAXPAGES);
|
|
||||||
|
|
||||||
frmr->mr = mr;
|
|
||||||
frmr->sg = sg;
|
|
||||||
INIT_LIST_HEAD(&frmr->frmr_list);
|
|
||||||
return frmr;
|
|
||||||
|
|
||||||
err_free_mr:
|
|
||||||
ib_dereg_mr(mr);
|
|
||||||
err_free_frmr:
|
|
||||||
kfree(frmr);
|
|
||||||
err:
|
|
||||||
return ERR_PTR(-ENOMEM);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void rdma_dealloc_frmr_q(struct svcxprt_rdma *xprt)
|
|
||||||
{
|
|
||||||
struct svc_rdma_fastreg_mr *frmr;
|
|
||||||
|
|
||||||
while (!list_empty(&xprt->sc_frmr_q)) {
|
|
||||||
frmr = list_entry(xprt->sc_frmr_q.next,
|
|
||||||
struct svc_rdma_fastreg_mr, frmr_list);
|
|
||||||
list_del_init(&frmr->frmr_list);
|
|
||||||
kfree(frmr->sg);
|
|
||||||
ib_dereg_mr(frmr->mr);
|
|
||||||
kfree(frmr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct svc_rdma_fastreg_mr *svc_rdma_get_frmr(struct svcxprt_rdma *rdma)
|
|
||||||
{
|
|
||||||
struct svc_rdma_fastreg_mr *frmr = NULL;
|
|
||||||
|
|
||||||
spin_lock(&rdma->sc_frmr_q_lock);
|
|
||||||
if (!list_empty(&rdma->sc_frmr_q)) {
|
|
||||||
frmr = list_entry(rdma->sc_frmr_q.next,
|
|
||||||
struct svc_rdma_fastreg_mr, frmr_list);
|
|
||||||
list_del_init(&frmr->frmr_list);
|
|
||||||
frmr->sg_nents = 0;
|
|
||||||
}
|
|
||||||
spin_unlock(&rdma->sc_frmr_q_lock);
|
|
||||||
if (frmr)
|
|
||||||
return frmr;
|
|
||||||
|
|
||||||
return rdma_alloc_frmr(rdma);
|
|
||||||
}
|
|
||||||
|
|
||||||
void svc_rdma_put_frmr(struct svcxprt_rdma *rdma,
|
|
||||||
struct svc_rdma_fastreg_mr *frmr)
|
|
||||||
{
|
|
||||||
if (frmr) {
|
|
||||||
ib_dma_unmap_sg(rdma->sc_cm_id->device,
|
|
||||||
frmr->sg, frmr->sg_nents, frmr->direction);
|
|
||||||
spin_lock(&rdma->sc_frmr_q_lock);
|
|
||||||
WARN_ON_ONCE(!list_empty(&frmr->frmr_list));
|
|
||||||
list_add(&frmr->frmr_list, &rdma->sc_frmr_q);
|
|
||||||
spin_unlock(&rdma->sc_frmr_q_lock);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is the xpo_recvfrom function for listening endpoints. Its
|
* This is the xpo_recvfrom function for listening endpoints. Its
|
||||||
* purpose is to accept incoming connections. The CMA callback handler
|
* purpose is to accept incoming connections. The CMA callback handler
|
||||||
|
@ -922,8 +839,6 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
|
||||||
* of an RDMA_READ. IB does not.
|
* of an RDMA_READ. IB does not.
|
||||||
*/
|
*/
|
||||||
if (dev->attrs.device_cap_flags & IB_DEVICE_MEM_MGT_EXTENSIONS) {
|
if (dev->attrs.device_cap_flags & IB_DEVICE_MEM_MGT_EXTENSIONS) {
|
||||||
newxprt->sc_frmr_pg_list_len =
|
|
||||||
dev->attrs.max_fast_reg_page_list_len;
|
|
||||||
newxprt->sc_dev_caps |= SVCRDMA_DEVCAP_FAST_REG;
|
newxprt->sc_dev_caps |= SVCRDMA_DEVCAP_FAST_REG;
|
||||||
} else
|
} else
|
||||||
newxprt->sc_snd_w_inv = false;
|
newxprt->sc_snd_w_inv = false;
|
||||||
|
@ -1063,7 +978,6 @@ static void __svc_rdma_free(struct work_struct *work)
|
||||||
xprt->xpt_bc_xprt = NULL;
|
xprt->xpt_bc_xprt = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
rdma_dealloc_frmr_q(rdma);
|
|
||||||
svc_rdma_destroy_rw_ctxts(rdma);
|
svc_rdma_destroy_rw_ctxts(rdma);
|
||||||
svc_rdma_destroy_ctxts(rdma);
|
svc_rdma_destroy_ctxts(rdma);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue