From: Christoph Hellwig <hch@lst.de>
To: dledford@redhat.com
Cc: bart.vanassche@sandisk.com, swise@opengridcomputing.com,
sagi@grimberg.me, linux-rdma@vger.kernel.org,
target-devel@vger.kernel.org
Subject: [PATCH 11/12] IB/core: add RW API support for signature MRs
Date: Mon, 11 Apr 2016 14:32:39 -0700 [thread overview]
Message-ID: <1460410360-13104-12-git-send-email-hch@lst.de> (raw)
In-Reply-To: <1460410360-13104-1-git-send-email-hch@lst.de>
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
drivers/infiniband/core/rw.c | 226 +++++++++++++++++++++++++++++++++++++++-
drivers/infiniband/core/verbs.c | 1 +
include/rdma/ib_verbs.h | 1 +
include/rdma/rw.h | 20 ++++
4 files changed, 243 insertions(+), 5 deletions(-)
diff --git a/drivers/infiniband/core/rw.c b/drivers/infiniband/core/rw.c
index a5a094b..7a999a5 100644
--- a/drivers/infiniband/core/rw.c
+++ b/drivers/infiniband/core/rw.c
@@ -319,6 +319,146 @@ out_unmap_sg:
}
EXPORT_SYMBOL(rdma_rw_ctx_init);
+/**
+ * rdma_rw_ctx_signature init - initialize a RW context with signature offload
+ * @ctx: context to initialize
+ * @qp: queue pair to operate on
+ * @port_num: port num to which the connection is bound
+ * @sg: scatterlist to READ/WRITE from/to
+ * @sg_cnt: number of entries in @sg
+ * @prot_sg: scatterlist to READ/WRITE protection information from/to
+ * @prot_sg_cnt: number of entries in @prot_sg
+ * @sig_attrs: signature offloading algorithms
+ * @remote_addr:remote address to read/write (relative to @rkey)
+ * @rkey: remote key to operate on
+ * @dir: %DMA_TO_DEVICE for RDMA WRITE, %DMA_FROM_DEVICE for RDMA READ
+ *
+ * Returns the number of WQEs that will be needed on the workqueue if
+ * successful, or a negative error code.
+ */
+int rdma_rw_ctx_signature_init(struct rdma_rw_ctx *ctx, struct ib_qp *qp,
+ u8 port_num, struct scatterlist *sg, u32 sg_cnt,
+ struct scatterlist *prot_sg, u32 prot_sg_cnt,
+ struct ib_sig_attrs *sig_attrs,
+ u64 remote_addr, u32 rkey, enum dma_data_direction dir)
+{
+ struct ib_device *dev = qp->pd->device;
+ u32 pages_per_mr = rdma_rw_fr_page_list_len(qp->pd->device);
+ struct ib_rdma_wr *rdma_wr;
+ struct ib_send_wr *prev_wr = NULL;
+ int count = 0, ret;
+
+ if (sg_cnt > pages_per_mr || prot_sg_cnt > pages_per_mr) {
+ pr_err("SG count too large\n");
+ return -EINVAL;
+ }
+
+ ret = ib_dma_map_sg(dev, sg, sg_cnt, dir);
+ if (!ret)
+ return -ENOMEM;
+ sg_cnt = ret;
+
+ ret = ib_dma_map_sg(dev, prot_sg, prot_sg_cnt, dir);
+ if (!ret) {
+ ret = -ENOMEM;
+ goto out_unmap_sg;
+ }
+ prot_sg_cnt = ret;
+
+ ctx->type = RDMA_RW_SIG_MR;
+ ctx->nr_ops = 1;
+ ctx->sig = kcalloc(1, sizeof(*ctx->sig), GFP_KERNEL);
+ if (!ctx->reg) {
+ ret = -ENOMEM;
+ goto out_unmap_prot_sg;
+ }
+
+ ret = rdma_rw_init_one_mr(qp, port_num, &ctx->sig->data, sg, sg_cnt, 0);
+ if (ret < 0)
+ goto out_free_ctx;
+ count += ret;
+ prev_wr = &ctx->sig->data.reg_wr.wr;
+
+ if (prot_sg_cnt) {
+ ret = rdma_rw_init_one_mr(qp, port_num, &ctx->sig->prot,
+ prot_sg, prot_sg_cnt, 0);
+ if (ret < 0)
+ goto out_destroy_data_mr;
+ count += ret;
+
+ if (ctx->sig->prot.inv_wr.next)
+ prev_wr->next = &ctx->sig->prot.inv_wr;
+ else
+ prev_wr->next = &ctx->sig->prot.reg_wr.wr;
+ prev_wr = &ctx->sig->prot.reg_wr.wr;
+ } else {
+ ctx->sig->prot.mr = NULL;
+ }
+
+ ctx->sig->sig_mr = ib_mr_pool_get(qp, &qp->sig_mrs);
+ if (!ctx->sig->sig_mr) {
+ ret = -EAGAIN;
+ goto out_destroy_prot_mr;
+ }
+
+ if (ctx->sig->sig_mr->need_inval) {
+ memset(&ctx->sig->sig_inv_wr, 0, sizeof(ctx->sig->sig_inv_wr));
+
+ ctx->sig->sig_inv_wr.opcode = IB_WR_LOCAL_INV;
+ ctx->sig->sig_inv_wr.ex.invalidate_rkey = ctx->sig->sig_mr->rkey;
+
+ prev_wr->next = &ctx->sig->sig_inv_wr;
+ prev_wr = &ctx->sig->sig_inv_wr;
+ }
+
+ ctx->sig->sig_wr.wr.opcode = IB_WR_REG_SIG_MR;
+ ctx->sig->sig_wr.wr.wr_cqe = NULL;
+ ctx->sig->sig_wr.wr.sg_list = &ctx->sig->data.sge;
+ ctx->sig->sig_wr.wr.num_sge = 1;
+ ctx->sig->sig_wr.access_flags = IB_ACCESS_LOCAL_WRITE;
+ ctx->sig->sig_wr.sig_attrs = sig_attrs;
+ ctx->sig->sig_wr.sig_mr = ctx->sig->sig_mr;
+ if (prot_sg_cnt)
+ ctx->sig->sig_wr.prot = &ctx->sig->prot.sge;
+ prev_wr->next = &ctx->sig->sig_wr.wr;
+ prev_wr = &ctx->sig->sig_wr.wr;
+ count++;
+
+ ctx->sig->sig_sge.addr = 0;
+ ctx->sig->sig_sge.length = ctx->sig->data.sge.length;
+ if (sig_attrs->wire.sig_type != IB_SIG_TYPE_NONE)
+ ctx->sig->sig_sge.length += ctx->sig->prot.sge.length;
+
+ rdma_wr = &ctx->sig->data.wr;
+ rdma_wr->wr.sg_list = &ctx->sig->sig_sge;
+ rdma_wr->wr.num_sge = 1;
+ rdma_wr->remote_addr = remote_addr;
+ rdma_wr->rkey = rkey;
+ if (dir == DMA_TO_DEVICE)
+ rdma_wr->wr.opcode = IB_WR_RDMA_WRITE;
+ else
+ rdma_wr->wr.opcode = IB_WR_RDMA_READ;
+ prev_wr->next = &rdma_wr->wr;
+ prev_wr = &rdma_wr->wr;
+ count++;
+
+ return count;
+
+out_destroy_prot_mr:
+ if (prot_sg_cnt)
+ ib_mr_pool_put(qp, &qp->rdma_mrs, ctx->sig->prot.mr);
+out_destroy_data_mr:
+ ib_mr_pool_put(qp, &qp->rdma_mrs, ctx->sig->data.mr);
+out_free_ctx:
+ kfree(ctx->sig);
+out_unmap_prot_sg:
+ ib_dma_unmap_sg(dev, prot_sg, prot_sg_cnt, dir);
+out_unmap_sg:
+ ib_dma_unmap_sg(dev, sg, sg_cnt, dir);
+ return ret;
+}
+EXPORT_SYMBOL(rdma_rw_ctx_signature_init);
+
/*
* Now that we are going to post the WRs we can update the lkey and need_inval
* state on the MRs. If we were doing this at init time, we would get double
@@ -354,6 +494,22 @@ struct ib_send_wr *rdma_rw_ctx_wrs(struct rdma_rw_ctx *ctx, struct ib_qp *qp,
int i;
switch (ctx->type) {
+ case RDMA_RW_SIG_MR:
+ rdma_rw_update_lkey(&ctx->sig->data, true);
+ if (ctx->sig->prot.mr)
+ rdma_rw_update_lkey(&ctx->sig->prot, true);
+
+ ctx->sig->sig_mr->need_inval = true;
+ ib_update_fast_reg_key(ctx->sig->sig_mr,
+ ib_inc_rkey(ctx->sig->sig_mr->lkey));
+ ctx->sig->sig_sge.lkey = ctx->sig->sig_mr->lkey;
+
+ if (ctx->sig->data.inv_wr.next)
+ first_wr = &ctx->sig->data.inv_wr;
+ else
+ first_wr = &ctx->sig->data.reg_wr.wr;
+ last_wr = &ctx->sig->data.wr.wr;
+ break;
case RDMA_RW_MR:
for (i = 0; i < ctx->nr_ops; i++) {
rdma_rw_update_lkey(&ctx->reg[i],
@@ -449,6 +605,38 @@ void rdma_rw_ctx_destroy(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u8 port_num,
}
EXPORT_SYMBOL(rdma_rw_ctx_destroy);
+/**
+ * rdma_rw_ctx_destroy_signature - release all resources allocated by
+ * rdma_rw_ctx_init_signature
+ * @ctx: context to release
+ * @qp: queue pair to operate on
+ * @port_num: port num to which the connection is bound
+ * @sg: scatterlist that was used for the READ/WRITE
+ * @sg_cnt: number of entries in @sg
+ * @prot_sg: scatterlist that was used for the READ/WRITE of the PI
+ * @prot_sg_cnt: number of entries in @prot_sg
+ * @dir: %DMA_TO_DEVICE for RDMA WRITE, %DMA_FROM_DEVICE for RDMA READ
+ */
+void rdma_rw_ctx_destroy_signature(struct rdma_rw_ctx *ctx, struct ib_qp *qp,
+ u8 port_num, struct scatterlist *sg, u32 sg_cnt,
+ struct scatterlist *prot_sg, u32 prot_sg_cnt,
+ enum dma_data_direction dir)
+{
+ if (WARN_ON_ONCE(ctx->type != RDMA_RW_SIG_MR))
+ return;
+
+ ib_mr_pool_put(qp, &qp->rdma_mrs, ctx->sig->data.mr);
+ if (ctx->sig->prot.mr)
+ ib_mr_pool_put(qp, &qp->rdma_mrs, ctx->sig->prot.mr);
+ ib_mr_pool_put(qp, &qp->sig_mrs, ctx->sig->sig_mr);
+ kfree(ctx->sig);
+
+ if (ctx->sig->prot.mr)
+ ib_dma_unmap_sg(qp->pd->device, prot_sg, prot_sg_cnt, dir);
+ ib_dma_unmap_sg(qp->pd->device, sg, sg_cnt, dir);
+}
+EXPORT_SYMBOL(rdma_rw_ctx_destroy_signature);
+
void rdma_rw_init_qp(struct ib_device *dev, struct ib_qp_init_attr *attr)
{
u32 factor;
@@ -468,7 +656,9 @@ void rdma_rw_init_qp(struct ib_device *dev, struct ib_qp_init_attr *attr)
* we'll need two additional MRs for the registrations and the
* invalidation.
*/
- if (rdma_rw_can_use_mr(dev, attr->port_num))
+ if (attr->create_flags & IB_QP_CREATE_SIGNATURE_EN)
+ factor += 6; /* (inv + reg) * (data + prot + sig) */
+ else if (rdma_rw_can_use_mr(dev, attr->port_num))
factor += 2; /* inv + reg */
attr->cap.max_send_wr += factor * attr->cap.max_rdma_ctxs;
@@ -484,20 +674,46 @@ void rdma_rw_init_qp(struct ib_device *dev, struct ib_qp_init_attr *attr)
int rdma_rw_init_mrs(struct ib_qp *qp, struct ib_qp_init_attr *attr)
{
struct ib_device *dev = qp->pd->device;
+ u32 nr_mrs = 0, nr_sig_mrs = 0;
int ret = 0;
- if (rdma_rw_can_use_mr(dev, attr->port_num)) {
- ret = ib_mr_pool_init(qp, &qp->rdma_mrs,
- attr->cap.max_rdma_ctxs, IB_MR_TYPE_MEM_REG,
+ if (attr->create_flags & IB_QP_CREATE_SIGNATURE_EN) {
+ nr_sig_mrs = attr->cap.max_rdma_ctxs;
+ nr_mrs = attr->cap.max_rdma_ctxs * 2;
+ } else if (rdma_rw_can_use_mr(dev, attr->port_num)) {
+ nr_mrs = attr->cap.max_rdma_ctxs;
+ }
+
+ if (nr_mrs) {
+ ret = ib_mr_pool_init(qp, &qp->rdma_mrs, nr_mrs,
+ IB_MR_TYPE_MEM_REG,
rdma_rw_fr_page_list_len(dev));
- if (ret)
+ if (ret) {
+ pr_err("%s: failed to allocated %d MRs\n",
+ __func__, nr_mrs);
return ret;
+ }
}
+ if (nr_sig_mrs) {
+ ret = ib_mr_pool_init(qp, &qp->sig_mrs, nr_sig_mrs,
+ IB_MR_TYPE_SIGNATURE, 2);
+ if (ret) {
+ pr_err("%s: failed to allocated %d SIG MRs\n",
+ __func__, nr_mrs);
+ goto out_free_rdma_mrs;
+ }
+ }
+
+ return 0;
+
+out_free_rdma_mrs:
+ ib_mr_pool_destroy(qp, &qp->rdma_mrs);
return ret;
}
void rdma_rw_cleanup_mrs(struct ib_qp *qp)
{
+ ib_mr_pool_destroy(qp, &qp->sig_mrs);
ib_mr_pool_destroy(qp, &qp->rdma_mrs);
}
diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c
index 769b000..e2b6634 100644
--- a/drivers/infiniband/core/verbs.c
+++ b/drivers/infiniband/core/verbs.c
@@ -776,6 +776,7 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd,
qp->mrs_used = 0;
spin_lock_init(&qp->mr_lock);
INIT_LIST_HEAD(&qp->rdma_mrs);
+ INIT_LIST_HEAD(&qp->sig_mrs);
if (qp_init_attr->qp_type == IB_QPT_XRC_TGT)
return ib_create_xrc_qp(qp, qp_init_attr);
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
index dd8e15d..544c55b 100644
--- a/include/rdma/ib_verbs.h
+++ b/include/rdma/ib_verbs.h
@@ -1435,6 +1435,7 @@ struct ib_qp {
spinlock_t mr_lock;
int mrs_used;
struct list_head rdma_mrs;
+ struct list_head sig_mrs;
struct ib_srq *srq;
struct ib_xrcd *xrcd; /* XRC TGT QPs only */
struct list_head xrcd_list;
diff --git a/include/rdma/rw.h b/include/rdma/rw.h
index 5e93146..3d75420 100644
--- a/include/rdma/rw.h
+++ b/include/rdma/rw.h
@@ -22,6 +22,7 @@
#define RDMA_RW_SINGLE_WR 0
#define RDMA_RW_MULTI_WR 1
#define RDMA_RW_MR 2
+#define RDMA_RW_SIG_MR 3
struct rdma_rw_ctx {
/* number of RDMA READ/WRITE WRs (not counting MR WRs) */
@@ -51,6 +52,15 @@ struct rdma_rw_ctx {
struct ib_send_wr inv_wr;
struct ib_mr *mr;
} *reg;
+
+ struct {
+ struct rdma_rw_reg_ctx data;
+ struct rdma_rw_reg_ctx prot;
+ struct ib_send_wr sig_inv_wr;
+ struct ib_mr *sig_mr;
+ struct ib_sge sig_sge;
+ struct ib_sig_handover_wr sig_wr;
+ } *sig;
};
};
@@ -61,6 +71,16 @@ void rdma_rw_ctx_destroy(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u8 port_num,
struct scatterlist *sg, u32 sg_cnt,
enum dma_data_direction dir);
+int rdma_rw_ctx_signature_init(struct rdma_rw_ctx *ctx, struct ib_qp *qp,
+ u8 port_num, struct scatterlist *sg, u32 sg_cnt,
+ struct scatterlist *prot_sg, u32 prot_sg_cnt,
+ struct ib_sig_attrs *sig_attrs, u64 remote_addr, u32 rkey,
+ enum dma_data_direction dir);
+void rdma_rw_ctx_destroy_signature(struct rdma_rw_ctx *ctx, struct ib_qp *qp,
+ u8 port_num, struct scatterlist *sg, u32 sg_cnt,
+ struct scatterlist *prot_sg, u32 prot_sg_cnt,
+ enum dma_data_direction dir);
+
struct ib_send_wr *rdma_rw_ctx_wrs(struct rdma_rw_ctx *ctx, struct ib_qp *qp,
u8 port_num, struct ib_cqe *cqe, struct ib_send_wr *chain_wr);
int rdma_rw_ctx_post(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u8 port_num,
--
2.1.4
next prev parent reply other threads:[~2016-04-11 21:32 UTC|newest]
Thread overview: 71+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-11 21:32 generic RDMA READ/WRITE API V6 Christoph Hellwig
[not found] ` <1460410360-13104-1-git-send-email-hch-jcswGhMUV9g@public.gmane.org>
2016-04-11 21:32 ` [PATCH 01/12] IB/mlx5: Expose correct max_sge_rd limit Christoph Hellwig
[not found] ` <1460410360-13104-2-git-send-email-hch-jcswGhMUV9g@public.gmane.org>
2016-04-17 13:53 ` Leon Romanovsky
[not found] ` <20160417135341.GC6349-2ukJVAZIZ/Y@public.gmane.org>
2016-04-17 18:06 ` Christoph Hellwig
2016-04-11 21:32 ` [PATCH 06/12] IB/core: add a simple MR pool Christoph Hellwig
2016-04-17 20:01 ` Sagi Grimberg
2016-04-19 3:19 ` Ira Weiny
2016-04-11 21:32 ` [PATCH 09/12] target: enhance and export target_alloc_sgl/target_free_sgl Christoph Hellwig
2016-04-11 21:32 ` [PATCH 02/12] IB/cma: pass the port number to ib_create_qp Christoph Hellwig
[not found] ` <1460410360-13104-3-git-send-email-hch-jcswGhMUV9g@public.gmane.org>
2016-04-15 17:55 ` Sagi Grimberg
2016-04-19 3:14 ` Ira Weiny
2016-04-19 17:30 ` Jason Gunthorpe
2016-04-19 18:38 ` Christoph Hellwig
[not found] ` <20160419183830.GB1211-jcswGhMUV9g@public.gmane.org>
2016-04-28 21:05 ` Doug Ledford
[not found] ` <20160419173032.GD20844-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org>
2016-04-19 18:49 ` Sagi Grimberg
2016-04-19 19:24 ` Jason Gunthorpe
[not found] ` <20160419192430.GB27028-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org>
2016-04-19 19:41 ` Steve Wise
2016-04-19 20:05 ` 'Christoph Hellwig'
2016-04-19 20:21 ` Jason Gunthorpe
[not found] ` <20160419200555.GA2561-jcswGhMUV9g@public.gmane.org>
2016-04-19 20:26 ` Steve Wise
2016-04-21 3:11 ` ira.weiny
2016-04-28 19:43 ` Hefty, Sean
2016-04-28 20:07 ` Jason Gunthorpe
2016-04-28 21:53 ` Hefty, Sean
2016-04-28 22:09 ` Jason Gunthorpe
2016-04-28 23:23 ` Hefty, Sean
2016-04-28 23:49 ` Jason Gunthorpe
2016-04-28 23:25 ` Weiny, Ira
[not found] ` <2807E5FD2F6FDA4886F6618EAC48510E22EC858F-8k97q/ur5Z2krb+BlOpmy7fspsVTdybXVpNB7YpNyf8@public.gmane.org>
2016-04-29 0:01 ` Jason Gunthorpe
2016-04-11 21:32 ` [PATCH 03/12] IB/core: allow passing mapping an offset into the SG in ib_map_mr_sg Christoph Hellwig
[not found] ` <1460410360-13104-4-git-send-email-hch-jcswGhMUV9g@public.gmane.org>
2016-04-15 17:56 ` Sagi Grimberg
2016-04-11 21:32 ` [PATCH 04/12] IB/core: add a helper to check for READ WITH INVALIDATE support Christoph Hellwig
[not found] ` <1460410360-13104-5-git-send-email-hch-jcswGhMUV9g@public.gmane.org>
2016-04-15 17:56 ` Sagi Grimberg
2016-04-19 3:15 ` Ira Weiny
2016-04-11 21:32 ` [PATCH 05/12] IB/core: refactor ib_create_qp Christoph Hellwig
2016-04-17 20:00 ` Sagi Grimberg
[not found] ` <1460410360-13104-6-git-send-email-hch-jcswGhMUV9g@public.gmane.org>
2016-04-19 3:08 ` Ira Weiny
2016-04-11 21:32 ` [PATCH 07/12] IB/core: add a need_inval flag to struct ib_mr Christoph Hellwig
[not found] ` <1460410360-13104-8-git-send-email-hch-jcswGhMUV9g@public.gmane.org>
2016-04-17 20:01 ` Sagi Grimberg
2016-04-19 3:20 ` Ira Weiny
2016-04-11 21:32 ` [PATCH 08/12] IB/core: generic RDMA READ/WRITE API Christoph Hellwig
[not found] ` <1460410360-13104-9-git-send-email-hch-jcswGhMUV9g@public.gmane.org>
2016-04-12 23:52 ` Bart Van Assche
[not found] ` <570D8A42.9040107-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-04-13 13:50 ` Christoph Hellwig
2016-04-11 21:32 ` [PATCH 10/12] IB/srpt: convert to the " Christoph Hellwig
2016-04-13 18:57 ` Bart Van Assche
2016-04-14 13:32 ` Christoph Hellwig
2016-04-28 21:02 ` Doug Ledford
[not found] ` <57227A6D.4000802-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2016-04-29 6:34 ` Christoph Hellwig
[not found] ` <20160429063443.GA18893-jcswGhMUV9g@public.gmane.org>
2016-04-29 14:44 ` Doug Ledford
2016-04-11 21:32 ` Christoph Hellwig [this message]
[not found] ` <1460410360-13104-12-git-send-email-hch-jcswGhMUV9g@public.gmane.org>
2016-04-22 21:53 ` [PATCH 11/12] IB/core: add RW API support for signature MRs Bart Van Assche
2016-04-11 21:32 ` [PATCH 12/12] IB/isert: convert to the generic RDMA READ/WRITE API Christoph Hellwig
[not found] ` <1460410360-13104-13-git-send-email-hch-jcswGhMUV9g@public.gmane.org>
2016-04-28 21:04 ` Doug Ledford
2016-04-29 11:46 ` Sagi Grimberg
[not found] ` <572349AA.2070407-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
2016-04-29 14:45 ` Doug Ledford
[not found] ` <e7959da7-79ca-0422-fbc9-9b3814516e1b-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2016-04-29 16:42 ` Leon Romanovsky
2016-04-12 18:31 ` generic RDMA READ/WRITE API V6 Steve Wise
2016-04-22 22:29 ` Bart Van Assche
[not found] ` <571AA5C8.4080502-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-05-02 15:15 ` Christoph Hellwig
[not found] ` <20160502151535.GA520-jcswGhMUV9g@public.gmane.org>
2016-05-02 19:08 ` Bart Van Assche
2016-05-02 22:14 ` Bart Van Assche
2016-05-03 8:40 ` Christoph Hellwig
2016-05-03 16:10 ` Bart Van Assche
[not found] ` <5727A5C7.1090009-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-05-03 14:31 ` Christoph Hellwig
[not found] ` <20160503143104.GA30342-jcswGhMUV9g@public.gmane.org>
2016-05-03 21:23 ` Bart Van Assche
-- strict thread matches above, loose matches on Subject: below --
2016-04-18 20:14 generic RDMA READ/WRITE API V7 Christoph Hellwig
2016-04-18 20:14 ` [PATCH 11/12] IB/core: add RW API support for signature MRs Christoph Hellwig
[not found] ` <1461010463-6603-12-git-send-email-hch-jcswGhMUV9g@public.gmane.org>
2016-04-19 14:20 ` Sagi Grimberg
2016-04-19 17:26 ` Jason Gunthorpe
[not found] ` <20160419172627.GC20844-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org>
2016-04-19 18:29 ` Christoph Hellwig
[not found] ` <20160419182950.GC989-jcswGhMUV9g@public.gmane.org>
2016-04-19 18:46 ` Sagi Grimberg
[not found] ` <57163E99.8090301-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
2016-04-19 18:27 ` Christoph Hellwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1460410360-13104-12-git-send-email-hch@lst.de \
--to=hch@lst.de \
--cc=bart.vanassche@sandisk.com \
--cc=dledford@redhat.com \
--cc=linux-rdma@vger.kernel.org \
--cc=sagi@grimberg.me \
--cc=swise@opengridcomputing.com \
--cc=target-devel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).