mbox series

[00/17,V2] Introduce new API for T10-PI offload

Message ID 1549560811-8655-1-git-send-email-maxg@mellanox.com (mailing list archive)
Headers show
Series Introduce new API for T10-PI offload | expand

Message

Max Gurtovoy Feb. 7, 2019, 5:33 p.m. UTC
Hello Sagi, Christoph, Keith, Jason, Doug, Leon and Co

This patchset adds a new verbs API for T10-PI offload and
implementation for iSER initiator (NVMe-oF/RDMA host side was completed
and will be sent on a different patchset).
This set starts with a few preparation commits to the RDMA/core layer.
It continues with introducing a new MR type IB_MR_TYPE_PI. Using this MR
all the needed mappings will be done in the low level drivers and not
be visible to the ULP. Later patches implement the needed functionality
in the mlx5 layer. As suggested by Sagi, in the new API, the mlx5 driver
will allocate a single internal memory region for the UMR operation to
register both PI and data SG lists and it will look like:

    data start  meta start
    |           |
    -------------------------
    |d1|d2|d3|d4|m1|m2|m3|m4|
    -------------------------

The sig_mr stride block would be using the same lkey but different
offsets in it (offset 0 and offset d1+d2+d3+d4). The verbs layer will
use a special mr type that will describe everything and will replace
the old API, that enforce using 3 different memory regions (data_mr,
protection_mr, sig_mr) and their local invalidations. This will ease
the code in the ULP and will improve the abstraction of the HW (see
iSER code changes). 
The patchset contains also iSER initator patches that using this new API.

For iSER, the code was tested vs. LIO iSER target using Mellanox's
ConnectX-4/ConnectX-5.

This series applies cleanly on top of kernel 5.0-rc5 tag and iser fix
("efa423925cd4 IB/iser: Pass the correct number of entries for dma mapped SGL").
We should aim to push this code during 5.1 merge window.

Next steps are:
 - use new API in iSER LIO target and remove the old API (this will
   cause changes in RDMA/core layer).
 - merge NVMe-oF/RDMA host side after merging this patchset
 - Implement metadata support for NVMe-oF/RDMA target side with new API

---------
Changes since v1:

 - Add a missing comma at patch 01/17
 - Fix coding style at patches 03/17, 05/17 and 09/17
 - Fix srp_map_finish_fr function at patch 04/17
 - Rebase the code over 5.0-rc5
---------

Israel Rukshin (8):
  RDMA/core: Introduce IB_MR_TYPE_PI and ib_alloc_mr_integrity API
  RMDA/core: Introduce ib_scatterlist structure
  IB/iser: Embed ib_scatterlist into iser_data_buf
  IB/srp: Embed ib_scatterlist into srp_map_state struct
  IB/iser: Refactor iscsi_iser_check_protection function
  IB/iser: Use IB_WR_REG_PI_MR for PI handover
  IB/iser: Remove unused sig_attrs argument
  IB/isert: Remove unused sig_attrs argument

Max Gurtovoy (9):
  RDMA/core: Introduce new header file for signature operations
  RDMA/core: Save the MR type in the ib_mr structure
  RDMA/core: Introduce ib_map_mr_sg_pi to map data/protection sgl's
  RDMA/core: Add signature attrs element for ib_mr structure
  RDMA/mlx5: Implement mlx5_ib_map_mr_sg_pi and
    mlx5_ib_alloc_mr_integrity
  RDMA/mlx5: Add attr for max number page list length for PI operation
  RDMA/mlx5: Pass UMR segment flags instead of boolean
  RDMA/mlx5: Update set_sig_data_segment attribute for new signature API
  RDMA/mlx5: Introduce and implement new IB_WR_REG_PI_MR work request

 drivers/infiniband/core/device.c                |   2 +
 drivers/infiniband/core/rw.c                    |   6 +-
 drivers/infiniband/core/uverbs_cmd.c            |   2 +
 drivers/infiniband/core/verbs.c                 | 127 ++++++++++--
 drivers/infiniband/hw/bnxt_re/ib_verbs.c        |   5 +-
 drivers/infiniband/hw/bnxt_re/ib_verbs.h        |   3 +-
 drivers/infiniband/hw/cxgb3/iwch_provider.c     |   5 +-
 drivers/infiniband/hw/cxgb4/iw_cxgb4.h          |   3 +-
 drivers/infiniband/hw/cxgb4/mem.c               |   5 +-
 drivers/infiniband/hw/hns/hns_roce_device.h     |   3 +-
 drivers/infiniband/hw/hns/hns_roce_mr.c         |   5 +-
 drivers/infiniband/hw/i40iw/i40iw_verbs.c       |   8 +-
 drivers/infiniband/hw/mlx4/mlx4_ib.h            |   3 +-
 drivers/infiniband/hw/mlx4/mr.c                 |   5 +-
 drivers/infiniband/hw/mlx5/main.c               |   4 +
 drivers/infiniband/hw/mlx5/mlx5_ib.h            |  12 +-
 drivers/infiniband/hw/mlx5/mr.c                 | 192 +++++++++++++++---
 drivers/infiniband/hw/mlx5/qp.c                 | 248 ++++++++++++++++++++----
 drivers/infiniband/hw/nes/nes_verbs.c           |   5 +-
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.c     |   5 +-
 drivers/infiniband/hw/ocrdma/ocrdma_verbs.h     |   3 +-
 drivers/infiniband/hw/qedr/verbs.c              |   5 +-
 drivers/infiniband/hw/qedr/verbs.h              |   3 +-
 drivers/infiniband/hw/vmw_pvrdma/pvrdma_mr.c    |   5 +-
 drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.h |   3 +-
 drivers/infiniband/sw/rdmavt/mr.c               |  10 +-
 drivers/infiniband/sw/rdmavt/mr.h               |   3 +-
 drivers/infiniband/sw/rxe/rxe_verbs.c           |   5 +-
 drivers/infiniband/ulp/iser/iscsi_iser.c        |   9 +-
 drivers/infiniband/ulp/iser/iscsi_iser.h        |  48 ++---
 drivers/infiniband/ulp/iser/iser_initiator.c    |  14 +-
 drivers/infiniband/ulp/iser/iser_memory.c       | 136 +++++--------
 drivers/infiniband/ulp/iser/iser_verbs.c        |  91 +++------
 drivers/infiniband/ulp/isert/ib_isert.c         |  11 +-
 drivers/infiniband/ulp/srp/ib_srp.c             |  46 +++--
 drivers/infiniband/ulp/srp/ib_srp.h             |   2 +-
 drivers/nvme/host/rdma.c                        |   6 +-
 fs/cifs/smbdirect.c                             |   7 +-
 include/linux/mlx5/qp.h                         |   3 +-
 include/rdma/ib_verbs.h                         | 163 ++++------------
 include/rdma/signature.h                        | 120 ++++++++++++
 net/rds/ib_frmr.c                               |   9 +-
 net/smc/smc_ib.c                                |   9 +-
 net/sunrpc/xprtrdma/frwr_ops.c                  |   6 +-
 44 files changed, 872 insertions(+), 493 deletions(-)
 create mode 100644 include/rdma/signature.h

Comments

Leon Romanovsky Feb. 7, 2019, 8:33 p.m. UTC | #1
On Thu, Feb 07, 2019 at 07:33:14PM +0200, Max Gurtovoy wrote:
> Hello Sagi, Christoph, Keith, Jason, Doug, Leon and Co
>

Jason, Doug,

I reviewed it internally, so on all series.
Reviewed-by: Leon Romanovsky <leonro@mellanox.com>
Christoph Hellwig Feb. 12, 2019, 3:57 p.m. UTC | #2
What tree is this against?  It fails to apply to Linus' master tree
for me with conflicts in the iser code.
Max Gurtovoy Feb. 12, 2019, 4:16 p.m. UTC | #3
On 2/12/2019 5:57 PM, Christoph Hellwig wrote:
> What tree is this against?  It fails to apply to Linus' master tree
> for me with conflicts in the iser code.


As mentioned in the cover letter it applies on kernel 5.0-rc5 + iser 
patch ("IB/iser: Pass the correct number of entries for dma mapped SGL").

Iser patch is yet not in rc5 and that's why it's not applied cleanly.

sorry for that :)
From 19fd2a28b0817f10bbeb01185d4ff58a07128dda Mon Sep 17 00:00:00 2001
From: Israel Rukshin <israelr@mellanox.com>
Date: Sun, 13 Jan 2019 12:56:57 +0000
Subject: [PATCH 1/1] IB/iser: Pass the correct number of entries for dma
 mapped SGL

ib_dma_map_sg() augments the SGL into a 'dma mapped SGL'. This process
may change the number of entries and the lengths of each entry.

Code that touches dma_address is iterating over the 'dma mapped SGL'
and must use dma_nents which returned from ib_dma_map_sg().

ib_sg_to_pages() and ib_map_mr_sg() are using dma_address so
they must use dma_nents.

Fixes: 39405885005a ("IB/iser: Port to new fast registration API")
Fixes: bfe066e256d5 ("IB/iser: Reuse ib_sg_to_pages")
Signed-off-by: Israel Rukshin <israelr@mellanox.com>
Reviewed-by: Max Gurtovoy <maxg@mellanox.com>
---
 drivers/infiniband/ulp/iser/iser_memory.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/infiniband/ulp/iser/iser_memory.c b/drivers/infiniband/ulp/iser/iser_memory.c
index e9b7efc302d0..394d1b9c2ff7 100644
--- a/drivers/infiniband/ulp/iser/iser_memory.c
+++ b/drivers/infiniband/ulp/iser/iser_memory.c
@@ -240,8 +240,8 @@ int iser_fast_reg_fmr(struct iscsi_iser_task *iser_task,
 	page_vec->npages = 0;
 	page_vec->fake_mr.page_size = SIZE_4K;
 	plen = ib_sg_to_pages(&page_vec->fake_mr, mem->sg,
-			      mem->size, NULL, iser_set_page);
-	if (unlikely(plen < mem->size)) {
+			      mem->dma_nents, NULL, iser_set_page);
+	if (unlikely(plen < mem->dma_nents)) {
 		iser_err("page vec too short to hold this SG\n");
 		iser_data_buf_dump(mem, device->ib_device);
 		iser_dump_page_vec(page_vec);
@@ -448,10 +448,10 @@ static int iser_fast_reg_mr(struct iscsi_iser_task *iser_task,
 
 	ib_update_fast_reg_key(mr, ib_inc_rkey(mr->rkey));
 
-	n = ib_map_mr_sg(mr, mem->sg, mem->size, NULL, SIZE_4K);
-	if (unlikely(n != mem->size)) {
+	n = ib_map_mr_sg(mr, mem->sg, mem->dma_nents, NULL, SIZE_4K);
+	if (unlikely(n != mem->dma_nents)) {
 		iser_err("failed to map sg (%d/%d)\n",
-			 n, mem->size);
+			 n, mem->dma_nents);
 		return n < 0 ? n : -EINVAL;
 	}