Date: Thu, 16 Nov 2017 13:28:00 +0000 (UTC) From: Hans Petter Selasky <hselasky@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r325891 - in projects/bsd_rdma_4_9/sys: dev/iser modules/iser Message-ID: <201711161328.vAGDS0sC014032@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201711161328.vAGDS0sC014032>