All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sagi Grimberg <sagi-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
To: linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Cc: linux-nvme-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
	Christoph Hellwig <hch-jcswGhMUV9g@public.gmane.org>,
	Max Gurtuvoy <maxg-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
Subject: [PATCH v3 3/9] IB/iser: use implicit CQ allocation
Date: Wed,  8 Nov 2017 11:57:36 +0200	[thread overview]
Message-ID: <20171108095742.25365-4-sagi@grimberg.me> (raw)
In-Reply-To: <20171108095742.25365-1-sagi-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>

Signed-off-by: Sagi Grimberg <sagi-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
[hch: ported to the new API]
Signed-off-by: Christoph Hellwig <hch-jcswGhMUV9g@public.gmane.org>
---
 drivers/infiniband/ulp/iser/iscsi_iser.h | 19 --------
 drivers/infiniband/ulp/iser/iser_verbs.c | 82 ++++----------------------------
 2 files changed, 8 insertions(+), 93 deletions(-)

diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.h b/drivers/infiniband/ulp/iser/iscsi_iser.h
index c1ae4aeae2f9..cc4134acebdf 100644
--- a/drivers/infiniband/ulp/iser/iscsi_iser.h
+++ b/drivers/infiniband/ulp/iser/iscsi_iser.h
@@ -317,18 +317,6 @@ struct iser_conn;
 struct ib_conn;
 struct iscsi_iser_task;
 
-/**
- * struct iser_comp - iSER completion context
- *
- * @cq:         completion queue
- * @active_qps: Number of active QPs attached
- *              to completion context
- */
-struct iser_comp {
-	struct ib_cq		*cq;
-	int                      active_qps;
-};
-
 /**
  * struct iser_device - Memory registration operations
  *     per-device registration schemes
@@ -365,9 +353,6 @@ struct iser_reg_ops {
  * @event_handler: IB events handle routine
  * @ig_list:	   entry in devices list
  * @refcount:      Reference counter, dominated by open iser connections
- * @comps_used:    Number of completion contexts used, Min between online
- *                 cpus and device max completion vectors
- * @comps:         Dinamically allocated array of completion handlers
  * @reg_ops:       Registration ops
  * @remote_inv_sup: Remote invalidate is supported on this device
  */
@@ -377,8 +362,6 @@ struct iser_device {
 	struct ib_event_handler      event_handler;
 	struct list_head             ig_list;
 	int                          refcount;
-	int			     comps_used;
-	struct iser_comp	     *comps;
 	const struct iser_reg_ops    *reg_ops;
 	bool                         remote_inv_sup;
 };
@@ -456,7 +439,6 @@ struct iser_fr_pool {
  * @sig_count:           send work request signal count
  * @rx_wr:               receive work request for batch posts
  * @device:              reference to iser device
- * @comp:                iser completion context
  * @fr_pool:             connection fast registration poool
  * @pi_support:          Indicate device T10-PI support
  */
@@ -467,7 +449,6 @@ struct ib_conn {
 	u8                           sig_count;
 	struct ib_recv_wr	     rx_wr[ISER_MIN_POSTED_RX];
 	struct iser_device          *device;
-	struct iser_comp	    *comp;
 	struct iser_fr_pool          fr_pool;
 	bool			     pi_support;
 	struct ib_cqe		     reg_cqe;
diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c b/drivers/infiniband/ulp/iser/iser_verbs.c
index 55a73b0ed4c6..8f8d853b1dc9 100644
--- a/drivers/infiniband/ulp/iser/iser_verbs.c
+++ b/drivers/infiniband/ulp/iser/iser_verbs.c
@@ -68,40 +68,17 @@ static void iser_event_handler(struct ib_event_handler *handler,
 static int iser_create_device_ib_res(struct iser_device *device)
 {
 	struct ib_device *ib_dev = device->ib_device;
-	int ret, i, max_cqe;
+	int ret;
 
 	ret = iser_assign_reg_ops(device);
 	if (ret)
 		return ret;
 
-	device->comps_used = min_t(int, num_online_cpus(),
-				 ib_dev->num_comp_vectors);
-
-	device->comps = kcalloc(device->comps_used, sizeof(*device->comps),
-				GFP_KERNEL);
-	if (!device->comps)
-		goto comps_err;
-
-	max_cqe = min(ISER_MAX_CQ_LEN, ib_dev->attrs.max_cqe);
-
-	iser_info("using %d CQs, device %s supports %d vectors max_cqe %d\n",
-		  device->comps_used, ib_dev->name,
-		  ib_dev->num_comp_vectors, max_cqe);
-
 	device->pd = ib_alloc_pd(ib_dev,
 		iser_always_reg ? 0 : 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];
-
-		comp->cq = ib_alloc_cq(ib_dev, comp, max_cqe, i,
-				       IB_POLL_SOFTIRQ);
-		if (IS_ERR(comp->cq)) {
-			comp->cq = NULL;
-			goto cq_err;
-		}
+	if (IS_ERR(device->pd)) {
+		ret = PTR_ERR(device->pd);
+		goto out;
 	}
 
 	INIT_IB_EVENT_HANDLER(&device->event_handler, ib_dev,
@@ -109,19 +86,9 @@ static int iser_create_device_ib_res(struct iser_device *device)
 	ib_register_event_handler(&device->event_handler);
 	return 0;
 
-cq_err:
-	for (i = 0; i < device->comps_used; i++) {
-		struct iser_comp *comp = &device->comps[i];
-
-		if (comp->cq)
-			ib_free_cq(comp->cq);
-	}
-	ib_dealloc_pd(device->pd);
-pd_err:
-	kfree(device->comps);
-comps_err:
+out:
 	iser_err("failed to allocate an IB resource\n");
-	return -1;
+	return ret;
 }
 
 /**
@@ -130,20 +97,8 @@ static int iser_create_device_ib_res(struct iser_device *device)
  */
 static void iser_free_device_ib_res(struct iser_device *device)
 {
-	int i;
-
-	for (i = 0; i < device->comps_used; i++) {
-		struct iser_comp *comp = &device->comps[i];
-
-		ib_free_cq(comp->cq);
-		comp->cq = NULL;
-	}
-
 	ib_unregister_event_handler(&device->event_handler);
 	ib_dealloc_pd(device->pd);
-
-	kfree(device->comps);
-	device->comps = NULL;
 	device->pd = NULL;
 }
 
@@ -423,7 +378,6 @@ static int iser_create_ib_conn_res(struct ib_conn *ib_conn)
 	struct ib_device	*ib_dev;
 	struct ib_qp_init_attr	init_attr;
 	int			ret = -ENOMEM;
-	int index, min_index = 0;
 
 	BUG_ON(ib_conn->device == NULL);
 
@@ -431,23 +385,10 @@ static int iser_create_ib_conn_res(struct ib_conn *ib_conn)
 	ib_dev = device->ib_device;
 
 	memset(&init_attr, 0, sizeof init_attr);
-
-	mutex_lock(&ig.connlist_mutex);
-	/* select the CQ with the minimal number of usages */
-	for (index = 0; index < device->comps_used; index++) {
-		if (device->comps[index].active_qps <
-		    device->comps[min_index].active_qps)
-			min_index = index;
-	}
-	ib_conn->comp = &device->comps[min_index];
-	ib_conn->comp->active_qps++;
-	mutex_unlock(&ig.connlist_mutex);
-	iser_info("cq index %d used for ib_conn %p\n", min_index, ib_conn);
-
+	init_attr.create_flags = IB_QP_CREATE_ASSIGN_CQS;
 	init_attr.event_handler = iser_qp_event_callback;
 	init_attr.qp_context	= (void *)ib_conn;
-	init_attr.send_cq	= ib_conn->comp->cq;
-	init_attr.recv_cq	= ib_conn->comp->cq;
+	init_attr.poll_ctx = IB_POLL_SOFTIRQ;
 	init_attr.cap.max_recv_wr  = ISER_QP_MAX_RECV_DTOS;
 	init_attr.cap.max_send_sge = 2;
 	init_attr.cap.max_recv_sge = 1;
@@ -483,11 +424,7 @@ static int iser_create_ib_conn_res(struct ib_conn *ib_conn)
 	return ret;
 
 out_err:
-	mutex_lock(&ig.connlist_mutex);
-	ib_conn->comp->active_qps--;
-	mutex_unlock(&ig.connlist_mutex);
 	iser_err("unable to alloc mem or create resource, err %d\n", ret);
-
 	return ret;
 }
 
@@ -597,9 +534,6 @@ static void iser_free_ib_conn_res(struct iser_conn *iser_conn,
 		  iser_conn, ib_conn->cma_id, ib_conn->qp);
 
 	if (ib_conn->qp != NULL) {
-		mutex_lock(&ig.connlist_mutex);
-		ib_conn->comp->active_qps--;
-		mutex_unlock(&ig.connlist_mutex);
 		rdma_destroy_qp(ib_conn->cma_id);
 		ib_conn->qp = NULL;
 	}
-- 
2.14.1

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

WARNING: multiple messages have this Message-ID (diff)
From: sagi@grimberg.me (Sagi Grimberg)
Subject: [PATCH v3 3/9] IB/iser: use implicit CQ allocation
Date: Wed,  8 Nov 2017 11:57:36 +0200	[thread overview]
Message-ID: <20171108095742.25365-4-sagi@grimberg.me> (raw)
In-Reply-To: <20171108095742.25365-1-sagi@grimberg.me>

Signed-off-by: Sagi Grimberg <sagi at grimberg.me>
[hch: ported to the new API]
Signed-off-by: Christoph Hellwig <hch at lst.de>
---
 drivers/infiniband/ulp/iser/iscsi_iser.h | 19 --------
 drivers/infiniband/ulp/iser/iser_verbs.c | 82 ++++----------------------------
 2 files changed, 8 insertions(+), 93 deletions(-)

diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.h b/drivers/infiniband/ulp/iser/iscsi_iser.h
index c1ae4aeae2f9..cc4134acebdf 100644
--- a/drivers/infiniband/ulp/iser/iscsi_iser.h
+++ b/drivers/infiniband/ulp/iser/iscsi_iser.h
@@ -317,18 +317,6 @@ struct iser_conn;
 struct ib_conn;
 struct iscsi_iser_task;
 
-/**
- * struct iser_comp - iSER completion context
- *
- * @cq:         completion queue
- * @active_qps: Number of active QPs attached
- *              to completion context
- */
-struct iser_comp {
-	struct ib_cq		*cq;
-	int                      active_qps;
-};
-
 /**
  * struct iser_device - Memory registration operations
  *     per-device registration schemes
@@ -365,9 +353,6 @@ struct iser_reg_ops {
  * @event_handler: IB events handle routine
  * @ig_list:	   entry in devices list
  * @refcount:      Reference counter, dominated by open iser connections
- * @comps_used:    Number of completion contexts used, Min between online
- *                 cpus and device max completion vectors
- * @comps:         Dinamically allocated array of completion handlers
  * @reg_ops:       Registration ops
  * @remote_inv_sup: Remote invalidate is supported on this device
  */
@@ -377,8 +362,6 @@ struct iser_device {
 	struct ib_event_handler      event_handler;
 	struct list_head             ig_list;
 	int                          refcount;
-	int			     comps_used;
-	struct iser_comp	     *comps;
 	const struct iser_reg_ops    *reg_ops;
 	bool                         remote_inv_sup;
 };
@@ -456,7 +439,6 @@ struct iser_fr_pool {
  * @sig_count:           send work request signal count
  * @rx_wr:               receive work request for batch posts
  * @device:              reference to iser device
- * @comp:                iser completion context
  * @fr_pool:             connection fast registration poool
  * @pi_support:          Indicate device T10-PI support
  */
@@ -467,7 +449,6 @@ struct ib_conn {
 	u8                           sig_count;
 	struct ib_recv_wr	     rx_wr[ISER_MIN_POSTED_RX];
 	struct iser_device          *device;
-	struct iser_comp	    *comp;
 	struct iser_fr_pool          fr_pool;
 	bool			     pi_support;
 	struct ib_cqe		     reg_cqe;
diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c b/drivers/infiniband/ulp/iser/iser_verbs.c
index 55a73b0ed4c6..8f8d853b1dc9 100644
--- a/drivers/infiniband/ulp/iser/iser_verbs.c
+++ b/drivers/infiniband/ulp/iser/iser_verbs.c
@@ -68,40 +68,17 @@ static void iser_event_handler(struct ib_event_handler *handler,
 static int iser_create_device_ib_res(struct iser_device *device)
 {
 	struct ib_device *ib_dev = device->ib_device;
-	int ret, i, max_cqe;
+	int ret;
 
 	ret = iser_assign_reg_ops(device);
 	if (ret)
 		return ret;
 
-	device->comps_used = min_t(int, num_online_cpus(),
-				 ib_dev->num_comp_vectors);
-
-	device->comps = kcalloc(device->comps_used, sizeof(*device->comps),
-				GFP_KERNEL);
-	if (!device->comps)
-		goto comps_err;
-
-	max_cqe = min(ISER_MAX_CQ_LEN, ib_dev->attrs.max_cqe);
-
-	iser_info("using %d CQs, device %s supports %d vectors max_cqe %d\n",
-		  device->comps_used, ib_dev->name,
-		  ib_dev->num_comp_vectors, max_cqe);
-
 	device->pd = ib_alloc_pd(ib_dev,
 		iser_always_reg ? 0 : 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];
-
-		comp->cq = ib_alloc_cq(ib_dev, comp, max_cqe, i,
-				       IB_POLL_SOFTIRQ);
-		if (IS_ERR(comp->cq)) {
-			comp->cq = NULL;
-			goto cq_err;
-		}
+	if (IS_ERR(device->pd)) {
+		ret = PTR_ERR(device->pd);
+		goto out;
 	}
 
 	INIT_IB_EVENT_HANDLER(&device->event_handler, ib_dev,
@@ -109,19 +86,9 @@ static int iser_create_device_ib_res(struct iser_device *device)
 	ib_register_event_handler(&device->event_handler);
 	return 0;
 
-cq_err:
-	for (i = 0; i < device->comps_used; i++) {
-		struct iser_comp *comp = &device->comps[i];
-
-		if (comp->cq)
-			ib_free_cq(comp->cq);
-	}
-	ib_dealloc_pd(device->pd);
-pd_err:
-	kfree(device->comps);
-comps_err:
+out:
 	iser_err("failed to allocate an IB resource\n");
-	return -1;
+	return ret;
 }
 
 /**
@@ -130,20 +97,8 @@ static int iser_create_device_ib_res(struct iser_device *device)
  */
 static void iser_free_device_ib_res(struct iser_device *device)
 {
-	int i;
-
-	for (i = 0; i < device->comps_used; i++) {
-		struct iser_comp *comp = &device->comps[i];
-
-		ib_free_cq(comp->cq);
-		comp->cq = NULL;
-	}
-
 	ib_unregister_event_handler(&device->event_handler);
 	ib_dealloc_pd(device->pd);
-
-	kfree(device->comps);
-	device->comps = NULL;
 	device->pd = NULL;
 }
 
@@ -423,7 +378,6 @@ static int iser_create_ib_conn_res(struct ib_conn *ib_conn)
 	struct ib_device	*ib_dev;
 	struct ib_qp_init_attr	init_attr;
 	int			ret = -ENOMEM;
-	int index, min_index = 0;
 
 	BUG_ON(ib_conn->device == NULL);
 
@@ -431,23 +385,10 @@ static int iser_create_ib_conn_res(struct ib_conn *ib_conn)
 	ib_dev = device->ib_device;
 
 	memset(&init_attr, 0, sizeof init_attr);
-
-	mutex_lock(&ig.connlist_mutex);
-	/* select the CQ with the minimal number of usages */
-	for (index = 0; index < device->comps_used; index++) {
-		if (device->comps[index].active_qps <
-		    device->comps[min_index].active_qps)
-			min_index = index;
-	}
-	ib_conn->comp = &device->comps[min_index];
-	ib_conn->comp->active_qps++;
-	mutex_unlock(&ig.connlist_mutex);
-	iser_info("cq index %d used for ib_conn %p\n", min_index, ib_conn);
-
+	init_attr.create_flags = IB_QP_CREATE_ASSIGN_CQS;
 	init_attr.event_handler = iser_qp_event_callback;
 	init_attr.qp_context	= (void *)ib_conn;
-	init_attr.send_cq	= ib_conn->comp->cq;
-	init_attr.recv_cq	= ib_conn->comp->cq;
+	init_attr.poll_ctx = IB_POLL_SOFTIRQ;
 	init_attr.cap.max_recv_wr  = ISER_QP_MAX_RECV_DTOS;
 	init_attr.cap.max_send_sge = 2;
 	init_attr.cap.max_recv_sge = 1;
@@ -483,11 +424,7 @@ static int iser_create_ib_conn_res(struct ib_conn *ib_conn)
 	return ret;
 
 out_err:
-	mutex_lock(&ig.connlist_mutex);
-	ib_conn->comp->active_qps--;
-	mutex_unlock(&ig.connlist_mutex);
 	iser_err("unable to alloc mem or create resource, err %d\n", ret);
-
 	return ret;
 }
 
@@ -597,9 +534,6 @@ static void iser_free_ib_conn_res(struct iser_conn *iser_conn,
 		  iser_conn, ib_conn->cma_id, ib_conn->qp);
 
 	if (ib_conn->qp != NULL) {
-		mutex_lock(&ig.connlist_mutex);
-		ib_conn->comp->active_qps--;
-		mutex_unlock(&ig.connlist_mutex);
 		rdma_destroy_qp(ib_conn->cma_id);
 		ib_conn->qp = NULL;
 	}
-- 
2.14.1

  parent reply	other threads:[~2017-11-08  9:57 UTC|newest]

Thread overview: 92+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-11-08  9:57 [PATCH v3 0/9] Introduce per-device completion queue pools Sagi Grimberg
2017-11-08  9:57 ` Sagi Grimberg
     [not found] ` <20171108095742.25365-1-sagi-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
2017-11-08  9:57   ` [PATCH v3 1/9] RDMA/core: Add implicit " Sagi Grimberg
2017-11-08  9:57     ` Sagi Grimberg
     [not found]     ` <20171108095742.25365-2-sagi-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
2017-11-09 10:45       ` Max Gurtovoy
2017-11-09 10:45         ` Max Gurtovoy
     [not found]         ` <fe2c23b7-2923-2693-28c3-6a6f399bda26-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2017-11-09 17:31           ` Sagi Grimberg
2017-11-09 17:31             ` Sagi Grimberg
     [not found]             ` <23b598f2-6982-0d15-69e4-c526c627ec33-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
2017-11-09 17:33               ` Bart Van Assche
2017-11-09 17:33                 ` Bart Van Assche
     [not found]                 ` <1510248814.2608.19.camel-Sjgp3cTcYWE@public.gmane.org>
2017-11-13 20:28                   ` Sagi Grimberg
2017-11-13 20:28                     ` Sagi Grimberg
2017-11-14 16:28       ` Bart Van Assche
2017-11-14 16:28         ` Bart Van Assche
     [not found]         ` <1510676885.2280.9.camel-Sjgp3cTcYWE@public.gmane.org>
2017-11-20 12:31           ` Sagi Grimberg
2017-11-20 12:31             ` Sagi Grimberg
2017-12-11 23:50       ` [v3,1/9] " Jason Gunthorpe
2017-12-11 23:50         ` Jason Gunthorpe
     [not found]         ` <20171211235044.GA32331-uk2M96/98Pc@public.gmane.org>
2018-01-03 17:47           ` Jason Gunthorpe
2018-01-03 17:47             ` Jason Gunthorpe
2017-11-08  9:57   ` [PATCH v3 2/9] IB/isert: use implicit CQ allocation Sagi Grimberg
2017-11-08  9:57     ` Sagi Grimberg
2017-11-08 10:27     ` Nicholas A. Bellinger
2017-11-08 10:27       ` Nicholas A. Bellinger
2017-11-08 10:27       ` Nicholas A. Bellinger
     [not found]     ` <20171108095742.25365-3-sagi-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
2017-11-14  9:14       ` Max Gurtovoy
2017-11-14  9:14         ` Max Gurtovoy
2017-11-08  9:57   ` Sagi Grimberg [this message]
2017-11-08  9:57     ` [PATCH v3 3/9] IB/iser: " Sagi Grimberg
2017-11-08 10:25     ` Nicholas A. Bellinger
2017-11-08 10:25       ` Nicholas A. Bellinger
2017-11-08 10:25       ` Nicholas A. Bellinger
2017-11-08  9:57   ` [PATCH v3 4/9] IB/srpt: " Sagi Grimberg
2017-11-08  9:57     ` Sagi Grimberg
2017-11-08  9:57   ` [PATCH v3 5/9] svcrdma: Use RDMA core " Sagi Grimberg
2017-11-08  9:57     ` Sagi Grimberg
2017-11-08  9:57   ` [PATCH v3 6/9] nvme-rdma: use " Sagi Grimberg
2017-11-08  9:57     ` Sagi Grimberg
2017-11-08  9:57   ` [PATCH v3 7/9] nvmet-rdma: " Sagi Grimberg
2017-11-08  9:57     ` Sagi Grimberg
2017-11-08  9:57   ` [PATCH v3 8/9] nvmet: allow assignment of a cpulist for each nvmet port Sagi Grimberg
2017-11-08  9:57     ` Sagi Grimberg
2017-11-08  9:57   ` [PATCH v3 9/9] nvmet-rdma: assign cq completion vector based on the port allowed cpus Sagi Grimberg
2017-11-08  9:57     ` Sagi Grimberg
2017-11-08 16:42   ` [PATCH v3 0/9] Introduce per-device completion queue pools Chuck Lever
2017-11-08 16:42     ` Chuck Lever
     [not found]     ` <F7FAF7FD-AE2C-4428-A779-06C9768E0C73-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org>
2017-11-09 17:06       ` Sagi Grimberg
2017-11-09 17:06         ` Sagi Grimberg
     [not found]         ` <b502f211-c477-3acd-be01-eaf645edc117-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
2017-11-10 19:27           ` Chuck Lever
2017-11-10 19:27             ` Chuck Lever
     [not found]             ` <4B49C591-8671-4683-A437-215BAA6B56CD-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org>
2017-11-13 20:47               ` Sagi Grimberg
2017-11-13 20:47                 ` Sagi Grimberg
     [not found]                 ` <a79c3899-5599-aa7e-5c5b-75ec98cdc490-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
2017-11-13 22:15                   ` Chuck Lever
2017-11-13 22:15                     ` Chuck Lever
     [not found]                     ` <A6E320D9-63F4-4FFE-A5E2-EB3ED19D0CB3-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org>
2017-11-20 12:08                       ` Sagi Grimberg
2017-11-20 12:08                         ` Sagi Grimberg
     [not found]                         ` <b4493cd9-62d6-c855-2b55-9749df7fa90d-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
2017-11-20 15:54                           ` Chuck Lever
2017-11-20 15:54                             ` Chuck Lever
2017-11-09 16:42   ` Bart Van Assche
2017-11-09 16:42     ` Bart Van Assche
     [not found]     ` <1510245771.2608.6.camel-Sjgp3cTcYWE@public.gmane.org>
2017-11-09 17:22       ` Sagi Grimberg
2017-11-09 17:22         ` Sagi Grimberg
     [not found]         ` <d5820b65-b428-7cd1-f7f1-7d8d89d21cf5-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
2017-11-09 17:31           ` Bart Van Assche
2017-11-09 17:31             ` Bart Van Assche
     [not found]             ` <1510248716.2608.17.camel-Sjgp3cTcYWE@public.gmane.org>
2017-11-13 20:31               ` Sagi Grimberg
2017-11-13 20:31                 ` Sagi Grimberg
     [not found]                 ` <6af627c8-2814-d562-21a2-f10788e44458-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
2017-11-13 20:34                   ` Jason Gunthorpe
2017-11-13 20:34                     ` Jason Gunthorpe
     [not found]                     ` <20171113203444.GJ22610-uk2M96/98Pc@public.gmane.org>
2017-11-13 20:48                       ` Sagi Grimberg
2017-11-13 20:48                         ` Sagi Grimberg
     [not found]                         ` <75a7cfe3-58e0-b416-0b5b-beba1e8207fd-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
2017-11-14  2:48                           ` Jason Gunthorpe
2017-11-14  2:48                             ` Jason Gunthorpe
     [not found]                             ` <20171114024822.GN22610-uk2M96/98Pc@public.gmane.org>
2017-11-20 12:10                               ` Sagi Grimberg
2017-11-20 12:10                                 ` Sagi Grimberg
     [not found]                                 ` <fd911816-576f-5a8e-eb41-b9081c960685-NQWnxTmZq1alnMjI0IkVqw@public.gmane.org>
2017-11-20 19:24                                   ` Jason Gunthorpe
2017-11-20 19:24                                     ` Jason Gunthorpe
     [not found]                                     ` <20171120192402.GK29075-uk2M96/98Pc@public.gmane.org>
2017-11-20 21:29                                       ` Bart Van Assche
2017-11-20 21:29                                         ` Bart Van Assche
2017-11-14 16:21                   ` Bart Van Assche
2017-11-14 16:21                     ` Bart Van Assche
     [not found]                     ` <1510676487.2280.4.camel-Sjgp3cTcYWE@public.gmane.org>
2017-11-20 12:26                       ` Sagi Grimberg
2017-11-20 12:26                         ` Sagi Grimberg
2017-11-14 10:06               ` Max Gurtovoy
2017-11-14 10:06                 ` Max Gurtovoy
     [not found]                 ` <1abee653-425d-940a-a51c-7fcd43af7203-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2017-11-20 12:20                   ` Sagi Grimberg
2017-11-20 12:20                     ` Sagi Grimberg
2017-11-09 18:52           ` Leon Romanovsky
2017-11-09 18:52             ` Leon Romanovsky
     [not found]             ` <20171109185239.GL18825-U/DQcQFIOTAAJjI8aNfphQ@public.gmane.org>
2017-11-13 20:32               ` Sagi Grimberg
2017-11-13 20:32                 ` Sagi Grimberg
2017-11-13 22:11   ` Doug Ledford
2017-11-13 22:11     ` Doug Ledford

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=20171108095742.25365-4-sagi@grimberg.me \
    --to=sagi-nqwnxtmzq1alnmji0ikvqw@public.gmane.org \
    --cc=hch-jcswGhMUV9g@public.gmane.org \
    --cc=linux-nvme-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
    --cc=linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=maxg-VPRAkNaXOzVWk0Htik3J/w@public.gmane.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.