svn commit: r325891 - in projects/bsd_rdma_4_9/sys: dev/iser modules/iser
Hans Petter Selasky
hselasky at FreeBSD.org
Thu Nov 16 13:28:02 UTC 2017
Author: hselasky
Date: Thu Nov 16 13:28:00 2017
New Revision: 325891
URL: https://svnweb.freebsd.org/changeset/base/325891
Log:
Update iser backend code to use new ibcore APIs.
Sponsored by: Mellanox Technologies
Modified:
projects/bsd_rdma_4_9/sys/dev/iser/icl_iser.c
projects/bsd_rdma_4_9/sys/dev/iser/icl_iser.h
projects/bsd_rdma_4_9/sys/dev/iser/iser_memory.c
projects/bsd_rdma_4_9/sys/dev/iser/iser_verbs.c
projects/bsd_rdma_4_9/sys/modules/iser/Makefile
Modified: projects/bsd_rdma_4_9/sys/dev/iser/icl_iser.c
==============================================================================
--- projects/bsd_rdma_4_9/sys/dev/iser/icl_iser.c Thu Nov 16 12:51:39 2017 (r325890)
+++ projects/bsd_rdma_4_9/sys/dev/iser/icl_iser.c Thu Nov 16 13:28:00 2017 (r325891)
@@ -395,7 +395,7 @@ iser_conn_connect(struct icl_conn *ic, int domain, int
iser_conn->state = ISER_CONN_PENDING;
- ib_conn->cma_id = rdma_create_id(iser_cma_handler, (void *)iser_conn,
+ ib_conn->cma_id = rdma_create_id(&init_net, iser_cma_handler, (void *)iser_conn,
RDMA_PS_TCP, IB_QPT_RC);
if (IS_ERR(ib_conn->cma_id)) {
err = -PTR_ERR(ib_conn->cma_id);
Modified: projects/bsd_rdma_4_9/sys/dev/iser/icl_iser.h
==============================================================================
--- projects/bsd_rdma_4_9/sys/dev/iser/icl_iser.h Thu Nov 16 12:51:39 2017 (r325890)
+++ projects/bsd_rdma_4_9/sys/dev/iser/icl_iser.h Thu Nov 16 13:28:00 2017 (r325891)
@@ -245,7 +245,7 @@ enum iser_desc_type {
struct iser_data_buf {
struct scatterlist sgl[ISCSI_ISER_SG_TABLESIZE];
void *sg;
- unsigned int size;
+ int size;
unsigned long data_len;
unsigned int dma_nents;
char *copy_buf;
@@ -364,12 +364,10 @@ struct iser_device {
* struct iser_reg_resources - Fast registration recources
*
* @mr: memory region
- * @frpl: fast reg page list
* @mr_valid: is mr valid indicator
*/
struct iser_reg_resources {
struct ib_mr *mr;
- struct ib_fast_reg_page_list *frpl;
u8 mr_valid:1;
};
Modified: projects/bsd_rdma_4_9/sys/dev/iser/iser_memory.c
==============================================================================
--- projects/bsd_rdma_4_9/sys/dev/iser/iser_memory.c Thu Nov 16 12:51:39 2017 (r325890)
+++ projects/bsd_rdma_4_9/sys/dev/iser/iser_memory.c Thu Nov 16 13:28:00 2017 (r325891)
@@ -52,64 +52,6 @@ iser_reg_desc_put(struct ib_conn *ib_conn,
#define IS_4K_ALIGNED(addr) ((((unsigned long)addr) & ~MASK_4K) == 0)
/**
- * iser_sg_to_page_vec - Translates scatterlist entries to physical addresses
- * and returns the length of resulting physical address array (may be less than
- * the original due to possible compaction).
- *
- * we build a "page vec" under the assumption that the SG meets the RDMA
- * alignment requirements. Other then the first and last SG elements, all
- * the "internal" elements can be compacted into a list whose elements are
- * dma addresses of physical pages. The code supports also the weird case
- * where --few fragments of the same page-- are present in the SG as
- * consecutive elements. Also, it handles one entry SG.
- */
-static int
-iser_sg_to_page_vec(struct iser_data_buf *data,
- struct ib_device *ibdev, u64 *pages,
- int *offset, int *data_size)
-{
- struct scatterlist *sg, *sgl = data->sgl;
- u64 start_addr, end_addr, page, chunk_start = 0;
- unsigned long total_sz = 0;
- unsigned int dma_len;
- int i, new_chunk, cur_page, last_ent = data->dma_nents - 1;
-
- /* compute the offset of first element */
- *offset = (u64) sgl[0].offset & ~MASK_4K;
-
- new_chunk = 1;
- cur_page = 0;
- for_each_sg(sgl, sg, data->dma_nents, i) {
- start_addr = ib_sg_dma_address(ibdev, sg);
- if (new_chunk)
- chunk_start = start_addr;
- dma_len = ib_sg_dma_len(ibdev, sg);
- end_addr = start_addr + dma_len;
- total_sz += dma_len;
-
- /* collect page fragments until aligned or end of SG list */
- if (!IS_4K_ALIGNED(end_addr) && i < last_ent) {
- new_chunk = 0;
- continue;
- }
- new_chunk = 1;
-
- /* address of the first page in the contiguous chunk;
- masking relevant for the very first SG entry,
- which might be unaligned */
- page = chunk_start & MASK_4K;
- do {
- pages[cur_page++] = page;
- page += SIZE_4K;
- } while (page < end_addr);
- }
-
- *data_size = total_sz;
-
- return (cur_page);
-}
-
-/**
* iser_data_buf_aligned_len - Tries to determine the maximal correctly aligned
* for RDMA sub-list of a scatter-gather list of memory buffers, and returns
* the number of entries which are aligned correctly. Supports the case where
@@ -214,46 +156,41 @@ iser_fast_reg_mr(struct icl_iser_pdu *iser_pdu,
{
struct ib_conn *ib_conn = &iser_pdu->iser_conn->ib_conn;
struct iser_device *device = ib_conn->device;
- struct ib_send_wr fastreg_wr, inv_wr;
+ struct ib_mr *mr = rsc->mr;
+ struct ib_reg_wr fastreg_wr;
+ struct ib_send_wr inv_wr;
struct ib_send_wr *bad_wr, *wr = NULL;
- int ret, offset, size, plen;
+ int ret, n;
/* if there a single dma entry, dma mr suffices */
if (mem->dma_nents == 1)
return iser_reg_dma(device, mem, reg);
- /* rsc is not null */
- plen = iser_sg_to_page_vec(mem, device->ib_device,
- rsc->frpl->page_list,
- &offset, &size);
- if (plen * SIZE_4K < size) {
- ISER_ERR("fast reg page_list too short to hold this SG");
- return (EINVAL);
- }
-
if (!rsc->mr_valid) {
- iser_inv_rkey(&inv_wr, rsc->mr);
+ iser_inv_rkey(&inv_wr, mr);
wr = &inv_wr;
}
+ n = ib_map_mr_sg(mr, mem->sg, mem->size, NULL, SIZE_4K);
+ if (unlikely(n != mem->size)) {
+ ISER_ERR("failed to map sg (%d/%d)\n", n, mem->size);
+ return n < 0 ? n : -EINVAL;
+ }
/* Prepare FASTREG WR */
memset(&fastreg_wr, 0, sizeof(fastreg_wr));
- fastreg_wr.wr_id = ISER_FASTREG_LI_WRID;
- fastreg_wr.opcode = IB_WR_FAST_REG_MR;
- fastreg_wr.wr.fast_reg.iova_start = rsc->frpl->page_list[0] + offset;
- fastreg_wr.wr.fast_reg.page_list = rsc->frpl;
- fastreg_wr.wr.fast_reg.page_list_len = plen;
- fastreg_wr.wr.fast_reg.page_shift = SHIFT_4K;
- fastreg_wr.wr.fast_reg.length = size;
- fastreg_wr.wr.fast_reg.rkey = rsc->mr->rkey;
- fastreg_wr.wr.fast_reg.access_flags = (IB_ACCESS_LOCAL_WRITE |
- IB_ACCESS_REMOTE_WRITE |
- IB_ACCESS_REMOTE_READ);
+ fastreg_wr.wr.opcode = IB_WR_REG_MR;
+ fastreg_wr.wr.wr_id = ISER_FASTREG_LI_WRID;
+ fastreg_wr.wr.num_sge = 0;
+ fastreg_wr.mr = mr;
+ fastreg_wr.key = mr->rkey;
+ fastreg_wr.access = IB_ACCESS_LOCAL_WRITE |
+ IB_ACCESS_REMOTE_WRITE |
+ IB_ACCESS_REMOTE_READ;
if (!wr)
- wr = &fastreg_wr;
+ wr = &fastreg_wr.wr;
else
- wr->next = &fastreg_wr;
+ wr->next = &fastreg_wr.wr;
ret = ib_post_send(ib_conn->qp, wr, &bad_wr);
if (ret) {
@@ -262,10 +199,10 @@ iser_fast_reg_mr(struct icl_iser_pdu *iser_pdu,
}
rsc->mr_valid = 0;
- reg->sge.lkey = rsc->mr->lkey;
- reg->rkey = rsc->mr->rkey;
- reg->sge.addr = rsc->frpl->page_list[0] + offset;
- reg->sge.length = size;
+ reg->sge.lkey = mr->lkey;
+ reg->rkey = mr->rkey;
+ reg->sge.addr = mr->iova;
+ reg->sge.length = mr->length;
return (ret);
}
Modified: projects/bsd_rdma_4_9/sys/dev/iser/iser_verbs.c
==============================================================================
--- projects/bsd_rdma_4_9/sys/dev/iser/iser_verbs.c Thu Nov 16 12:51:39 2017 (r325890)
+++ projects/bsd_rdma_4_9/sys/dev/iser/iser_verbs.c Thu Nov 16 13:28:00 2017 (r325891)
@@ -200,16 +200,10 @@ iser_cq_callback(struct ib_cq *cq, void *cq_context)
static int
iser_create_device_ib_res(struct iser_device *device)
{
- struct ib_device_attr *dev_attr = &device->dev_attr;
- int ret, i, max_cqe;
+ struct ib_device *ib_dev = device->ib_device;
+ int i, max_cqe;
- ret = ib_query_device(device->ib_device, dev_attr);
- if (ret) {
- ISER_ERR("Query device failed for %s", device->ib_device->name);
- return (ret);
- }
-
- if (!(dev_attr->device_cap_flags & IB_DEVICE_MEM_MGT_EXTENSIONS)) {
+ if (!(ib_dev->attrs.device_cap_flags & IB_DEVICE_MEM_MGT_EXTENSIONS)) {
ISER_ERR("device %s doesn't support Fastreg, "
"can't register memory", device->ib_device->name);
return (1);
@@ -222,25 +216,29 @@ iser_create_device_ib_res(struct iser_device *device)
if (!device->comps)
goto comps_err;
- max_cqe = min(ISER_MAX_CQ_LEN, dev_attr->max_cqe);
+ max_cqe = min(ISER_MAX_CQ_LEN, ib_dev->attrs.max_cqe);
ISER_DBG("using %d CQs, device %s supports %d vectors max_cqe %d",
device->comps_used, device->ib_device->name,
device->ib_device->num_comp_vectors, max_cqe);
- device->pd = ib_alloc_pd(device->ib_device);
+ device->pd = ib_alloc_pd(device->ib_device, IB_PD_UNSAFE_GLOBAL_RKEY);
if (IS_ERR(device->pd))
goto pd_err;
for (i = 0; i < device->comps_used; i++) {
struct iser_comp *comp = &device->comps[i];
+ struct ib_cq_init_attr cq_attr = {
+ .cqe = max_cqe,
+ .comp_vector = i,
+ };
comp->device = device;
comp->cq = ib_create_cq(device->ib_device,
iser_cq_callback,
iser_cq_event_callback,
(void *)comp,
- max_cqe, i);
+ &cq_attr);
if (IS_ERR(comp->cq)) {
comp->cq = NULL;
goto cq_err;
@@ -257,9 +255,7 @@ iser_create_device_ib_res(struct iser_device *device)
taskqueue_start_threads(&comp->tq, 1, PI_NET, "iser taskq");
}
- device->mr = ib_get_dma_mr(device->pd, IB_ACCESS_LOCAL_WRITE |
- IB_ACCESS_REMOTE_WRITE |
- IB_ACCESS_REMOTE_READ);
+ device->mr = device->pd->__internal_mr;
if (IS_ERR(device->mr))
goto tq_err;
@@ -327,35 +323,21 @@ iser_alloc_reg_res(struct ib_device *ib_device,
{
int ret;
- res->frpl = ib_alloc_fast_reg_page_list(ib_device,
- ISCSI_ISER_SG_TABLESIZE + 1);
- if (IS_ERR(res->frpl)) {
- ret = -PTR_ERR(res->frpl);
- ISER_ERR("Failed to allocate fast reg page list err=%d", ret);
- return (ret);
- }
-
- res->mr = ib_alloc_fast_reg_mr(pd, ISCSI_ISER_SG_TABLESIZE + 1);
+ res->mr = ib_alloc_mr(pd, IB_MR_TYPE_MEM_REG, ISCSI_ISER_SG_TABLESIZE + 1);
if (IS_ERR(res->mr)) {
ret = -PTR_ERR(res->mr);
ISER_ERR("Failed to allocate fast reg mr err=%d", ret);
- goto fast_reg_mr_failure;
+ return (ret);
}
res->mr_valid = 1;
return (0);
-
-fast_reg_mr_failure:
- ib_free_fast_reg_page_list(res->frpl);
-
- return (ret);
}
static void
iser_free_reg_res(struct iser_reg_resources *rsc)
{
ib_dereg_mr(rsc->mr);
- ib_free_fast_reg_page_list(rsc->frpl);
}
static struct fast_reg_descriptor *
Modified: projects/bsd_rdma_4_9/sys/modules/iser/Makefile
==============================================================================
--- projects/bsd_rdma_4_9/sys/modules/iser/Makefile Thu Nov 16 12:51:39 2017 (r325890)
+++ projects/bsd_rdma_4_9/sys/modules/iser/Makefile Thu Nov 16 13:28:00 2017 (r325891)
@@ -20,6 +20,7 @@ SRCS+= icl_conn_if.h
CFLAGS+= -I${SRCTOP}/sys/
CFLAGS+= -I${SYSDIR}/ofed/include
+CFLAGS+= -I${SYSDIR}/ofed/include/uapi
CFLAGS+= -I${SYSDIR}/compat/linuxkpi/common/include
CFLAGS+= -DCONFIG_INFINIBAND_USER_MEM
CFLAGS+= -DINET6 -DINET
More information about the svn-src-projects
mailing list