diff mbox series

hfi1verbs: Update rvt cq headers in rdma_core hfi1 provider

Message ID 20181204221443.11392.17827.stgit@scvm10.sc.intel.com (mailing list archive)
State Superseded
Delegated to: Jason Gunthorpe
Headers show
Series hfi1verbs: Update rvt cq headers in rdma_core hfi1 provider | expand

Commit Message

Arumugam, Kamenee Dec. 4, 2018, 10:14 p.m. UTC
hfi1_wc struct is the same struct as ib_uverbs_wc and hfi1_cq_wc
is not in the uapi header. Remove hfi1_wc and hfi1_cq_wc struct
from providers. Include rvt-abi.h header that have rvt_cq_wc
struct definition into kernel-headers.

The member ib_uverbs_wc arrray in rvt_cq_wc is replaced with
one in rvt-abi. Therefore,plus one to the number of cq entries.

Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Kamenee Arumugam <kamenee.arumugam@intel.com>
---
 kernel-headers/CMakeLists.txt  |    1 +
 kernel-headers/rdma/rvt-abi.h  |   31 +++++++++++++++++++++++++++++++
 providers/hfi1verbs/hfiverbs.h |   37 +++++--------------------------------
 providers/hfi1verbs/verbs.c    |   23 +++++++++++++----------
 4 files changed, 50 insertions(+), 42 deletions(-)
 create mode 100755 kernel-headers/rdma/rvt-abi.h

Comments

Jason Gunthorpe Dec. 4, 2018, 11:58 p.m. UTC | #1
On Tue, Dec 04, 2018 at 02:14:43PM -0800, Kamenee Arumugam wrote:
> hfi1_wc struct is the same struct as ib_uverbs_wc and hfi1_cq_wc
> is not in the uapi header. Remove hfi1_wc and hfi1_cq_wc struct
> from providers. Include rvt-abi.h header that have rvt_cq_wc
> struct definition into kernel-headers.
> 
> The member ib_uverbs_wc arrray in rvt_cq_wc is replaced with
> one in rvt-abi. Therefore,plus one to the number of cq entries.
> 
> Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
> Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
> Signed-off-by: Kamenee Arumugam <kamenee.arumugam@intel.com>
> ---
>  kernel-headers/CMakeLists.txt  |    1 +
>  kernel-headers/rdma/rvt-abi.h  |   31 +++++++++++++++++++++++++++++++
>  providers/hfi1verbs/hfiverbs.h |   37 +++++--------------------------------
>  providers/hfi1verbs/verbs.c    |   23 +++++++++++++----------
>  4 files changed, 50 insertions(+), 42 deletions(-)
>  create mode 100755 kernel-headers/rdma/rvt-abi.h

Since these need a kernel patch can you remark which kernel patch this
is matched with?

Also changes to kernel-headers should be split into their own patch
created by the kernel-headers/update script as the first patch in your
series.

Jason
Arumugam, Kamenee Dec. 5, 2018, 3:30 p.m. UTC | #2
> Subject: Re: [PATCH] hfi1verbs: Update rvt cq headers in rdma_core hfi1 provider
> Since these need a kernel patch can you remark which kernel patch this is matched with?

Here is the  kernel patch: https://marc.info/?l=linux-rdma&m=154402265822649&w=2

> Also changes to kernel-headers should be split into their own patch created by the kernel-headers/update script as the first patch in your series.

It there a README or documentation on the process for keeping kernel-headers in sync?

So is this the sequence?:
- Patch the kernel
  * Does the patch need to land in an external tree?  Which tree?
- Use the update script to sync the kernel-headers

Since you want one file, it would seem we want both of the kernel patches first?
Jason Gunthorpe Dec. 7, 2018, 3:40 a.m. UTC | #3
On Wed, Dec 05, 2018 at 03:30:38PM +0000, Arumugam, Kamenee wrote:
> > Subject: Re: [PATCH] hfi1verbs: Update rvt cq headers in rdma_core hfi1 provider
> > Since these need a kernel patch can you remark which kernel patch this is matched with?
> 
> Here is the  kernel patch: https://marc.info/?l=linux-rdma&m=154402265822649&w=2
> 
> > Also changes to kernel-headers should be split into their own patch created by the kernel-headers/update script as the first patch in your series.
> 
> It there a README or documentation on the process for keeping kernel-headers in sync?

Ah I wish there was, want to write one?

> So is this the sequence?:
> - Patch the kernel
>   * Does the patch need to land in an external tree?  Which tree?
> - Use the update script to sync the kernel-headers

Not quite.

Patch *your* kernel with the required kernel patches for the series

Run 

$ kernel-headers/update --not-final ../kernel HEAD

This creates the 'Updated kernel headers' commit you need

Apply the patches in your series.

Push to github and tag your PR with 'needs-kernel-patch'. Post to the
mailing list with 'git send-email'

When the kernel patch is accepted the you or the maintainer will do
'git rebase' and exec instead of pick the first commit with:

exec kernel-headers/update ../kernel 12345566

To build the final commit and remove the 'needs-kernel-patch' tag.

That gets force pushed to the PR and the PR merged.

This keeps the headers in sync between the two projects.

Jason
Doug Ledford Dec. 12, 2018, 5:42 p.m. UTC | #4
On Thu, 2018-12-06 at 20:40 -0700, Jason Gunthorpe wrote:
> On Wed, Dec 05, 2018 at 03:30:38PM +0000, Arumugam, Kamenee wrote:
> > > Subject: Re: [PATCH] hfi1verbs: Update rvt cq headers in rdma_core hfi1 provider
> > > Since these need a kernel patch can you remark which kernel patch this is matched with?
> > 
> > Here is the  kernel patch: https://marc.info/?l=linux-rdma&m=154402265822649&w=2
> > 
> > > Also changes to kernel-headers should be split into their own patch created by the kernel-headers/update script as the first patch in your series.
> > 
> > It there a README or documentation on the process for keeping kernel-headers in sync?
> 
> Ah I wish there was, want to write one?
> 
> > So is this the sequence?:
> > - Patch the kernel
> >   * Does the patch need to land in an external tree?  Which tree?
> > - Use the update script to sync the kernel-headers
> 
> Not quite.
> 
> Patch *your* kernel with the required kernel patches for the series
> 
> Run 
> 
> $ kernel-headers/update --not-final ../kernel HEAD
> 
> This creates the 'Updated kernel headers' commit you need
> 
> Apply the patches in your series.
> 
> Push to github and tag your PR with 'needs-kernel-patch'. Post to the
> mailing list with 'git send-email'
> 
> When the kernel patch is accepted the you or the maintainer will do
> 'git rebase' and exec instead of pick the first commit with:
> 
> exec kernel-headers/update ../kernel 12345566
> 
> To build the final commit and remove the 'needs-kernel-patch' tag.
> 
> That gets force pushed to the PR and the PR merged.
> 
> This keeps the headers in sync between the two projects.
> 
> Jason

That seems entirely more complex than it should be.  When you or I setup
that level of complexity, it's not a big deal because we do this all the
time.  When you push that level of complexity onto the submitters, some
of whom are going to be occasionally submitting uapi updates at best,
then it's a recipe for botched updates.

What if we create a git hook that tracks any updates to our local for-
next branch and whenever we do an update that modifies anything in
include/uapi/rdma it triggers a message to perform a headers update in
rdma-core?  Then we just jump over to that repo, git pull to make sure
we're up to date with merges that have been done via the web interface,
run kernel-headers/update ../kernel HEAD, git push, done.  The only
downside here is that the submitter will still need to have a header
update patch in their pull request just so it will build/test prior to
the official acceptance of the upstream patch.  If I could do away with
that too, I would.  I'm just concerned that getting everyone out there
to know how to use yet another tool and yet another exact sequence of
operations is going to be a loosing battle.
Jason Gunthorpe Dec. 12, 2018, 11:19 p.m. UTC | #5
On Wed, Dec 12, 2018 at 12:42:30PM -0500, Doug Ledford wrote:

> What if we create a git hook that tracks any updates to our local for-
> next branch and whenever we do an update that modifies anything in
> include/uapi/rdma it triggers a message to perform a headers update in
> rdma-core?  

This has to be done by the submitter before kernel patches are
accepted because we require PR's for userspace compoments of kernel
features before applying the kernel features..

So, the developer has to put the right kernel headers into their
rdma-core to develop, test and push their rdma-core work..

The update script is the simplest way to do that I can see..

I guess we could let people hand roll their kernel update patches (but
why?) so long as the maintainer re-writes them.

Just getting people to put their kernel header updates into a single
patch is an education process that isn't so easy.

Jason
Dennis Dalessandro Dec. 13, 2018, 12:17 p.m. UTC | #6
On 12/12/2018 6:19 PM, Jason Gunthorpe wrote:
> On Wed, Dec 12, 2018 at 12:42:30PM -0500, Doug Ledford wrote:
> 
>> What if we create a git hook that tracks any updates to our local for-
>> next branch and whenever we do an update that modifies anything in
>> include/uapi/rdma it triggers a message to perform a headers update in
>> rdma-core?
> 
> This has to be done by the submitter before kernel patches are
> accepted because we require PR's for userspace compoments of kernel
> features before applying the kernel features..
> 
> So, the developer has to put the right kernel headers into their
> rdma-core to develop, test and push their rdma-core work..
> 
> The update script is the simplest way to do that I can see..
> 
> I guess we could let people hand roll their kernel update patches (but
> why?) so long as the maintainer re-writes them.
> 
> Just getting people to put their kernel header updates into a single
> patch is an education process that isn't so easy.

As long as there is a README that explains step by step what you guys 
want that should suffice. Yes it's a complicated process, but one that 
isn't done all that often so it's manageable.

-Denny
diff mbox series

Patch

diff --git a/kernel-headers/CMakeLists.txt b/kernel-headers/CMakeLists.txt
index 16ba165..631db9c 100644
--- a/kernel-headers/CMakeLists.txt
+++ b/kernel-headers/CMakeLists.txt
@@ -24,6 +24,7 @@  publish_internal_headers(rdma
   rdma/rdma_user_ioctl_cmds.h
   rdma/rdma_user_rxe.h
   rdma/vmw_pvrdma-abi.h
+  rdma/rvt-abi.h
   )
 
 publish_internal_headers(rdma/hfi
diff --git a/kernel-headers/rdma/rvt-abi.h b/kernel-headers/rdma/rvt-abi.h
new file mode 100755
index 0000000..c30f2fe
--- /dev/null
+++ b/kernel-headers/rdma/rvt-abi.h
@@ -0,0 +1,31 @@ 
+/* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */
+
+/*
+ * This file contains defines, structures, etc. that are used
+ * to communicate between kernel and user code.
+ */
+
+#ifndef RVT_ABI_USER_H
+#define RVT_ABI_USER_H
+
+#include <linux/types.h>
+#include <rdma/ib_user_verbs.h>
+#ifndef RDMA_ATOMIC_UAPI
+#define RDMA_ATOMIC_UAPI(_type, _name) _type _name
+#endif
+/*
+ * This structure is used to contain the head pointer, tail pointer,
+ * and completion queue entries as a single memory allocation so
+ * it can be mmap'ed into user space.
+ */
+struct rvt_cq_wc {
+	/* index of next entry to fill */
+	RDMA_ATOMIC_UAPI(__u32, head);
+	/* index of next ib_poll_cq() entry */
+	RDMA_ATOMIC_UAPI(__u32, tail);
+
+	/* these are actually size ibcq.cqe + 1 */
+	struct ib_uverbs_wc uqueue[0];
+};
+
+#endif /* RVT_ABI_USER_H */
diff --git a/providers/hfi1verbs/hfiverbs.h b/providers/hfi1verbs/hfiverbs.h
index 070a01c..7ce27c8 100644
--- a/providers/hfi1verbs/hfiverbs.h
+++ b/providers/hfi1verbs/hfiverbs.h
@@ -65,7 +65,8 @@ 
 
 #include <infiniband/driver.h>
 #include <infiniband/verbs.h>
-
+#define RDMA_ATOMIC_UAPI(_type, _name)  _Atomic(_type) _name
+#include "rdma/rvt-abi.h"
 #define PFX		"hfi1: "
 
 struct hfi1_device {
@@ -77,39 +78,11 @@  struct hfi1_context {
 	struct verbs_context	ibv_ctx;
 };
 
-/*
- * This structure needs to have the same size and offsets as
- * the kernel's ib_wc structure since it is memory mapped.
- */
-struct hfi1_wc {
-	uint64_t		wr_id;
-	enum ibv_wc_status	status;
-	enum ibv_wc_opcode	opcode;
-	uint32_t		vendor_err;
-	uint32_t		byte_len;
-	uint32_t		imm_data;	/* in network byte order */
-	uint32_t		qp_num;
-	uint32_t		src_qp;
-	enum ibv_wc_flags	wc_flags;
-	uint16_t		pkey_index;
-	uint16_t		slid;
-	uint8_t			sl;
-	uint8_t			dlid_path_bits;
-	uint8_t			port_num;
-};
-
-struct hfi1_cq_wc {
-	_Atomic(uint32_t)	head;
-	_Atomic(uint32_t)	tail;
-	struct hfi1_wc		queue[1];
-};
-
 struct hfi1_cq {
-	struct ibv_cq		ibv_cq;
-	struct hfi1_cq_wc	*queue;
-	pthread_spinlock_t	lock;
+       struct ibv_cq           ibv_cq;
+       struct rvt_cq_wc       *queue;
+       pthread_spinlock_t      lock;
 };
-
 /*
  * Receive work request queue entry.
  * The size of the sg_list is determined when the QP is created and stored
diff --git a/providers/hfi1verbs/verbs.c b/providers/hfi1verbs/verbs.c
index ff001f6..dcf6714 100644
--- a/providers/hfi1verbs/verbs.c
+++ b/providers/hfi1verbs/verbs.c
@@ -63,10 +63,15 @@ 
 #include <pthread.h>
 #include <sys/mman.h>
 #include <errno.h>
-
 #include "hfiverbs.h"
 #include "hfi-abi.h"
 
+static size_t hfi1_cq_size(int cqe)
+{
+	return sizeof(struct rvt_cq_wc) +
+	       sizeof(struct ib_uverbs_wc) * (cqe + 1);
+}
+
 int hfi1_query_device(struct ibv_context *context,
 		       struct ibv_device_attr *attr)
 {
@@ -186,7 +191,7 @@  struct ibv_cq *hfi1_create_cq(struct ibv_context *context, int cqe,
 		return NULL;
 	}
 
-	size = sizeof(struct hfi1_cq_wc) + sizeof(struct hfi1_wc) * cqe;
+	size = hfi1_cq_size(cqe);
 	cq->queue = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED,
 			 context->cmd_fd, resp.offset);
 	if ((void *) cq->queue == MAP_FAILED) {
@@ -231,8 +236,7 @@  int hfi1_resize_cq(struct ibv_cq *ibcq, int cqe)
 	memset(&resp, 0, sizeof(resp));
 	pthread_spin_lock(&cq->lock);
 	/* Save the old size so we can unmmap the queue. */
-	size = sizeof(struct hfi1_cq_wc) +
-		(sizeof(struct hfi1_wc) * cq->ibv_cq.cqe);
+	size = hfi1_cq_size(cq->ibv_cq.cqe);
 	ret = ibv_cmd_resize_cq(ibcq, cqe, &cmd, sizeof cmd,
 				&resp.ibv_resp, sizeof resp);
 	if (ret) {
@@ -240,8 +244,7 @@  int hfi1_resize_cq(struct ibv_cq *ibcq, int cqe)
 		return ret;
 	}
 	(void) munmap(cq->queue, size);
-	size = sizeof(struct hfi1_cq_wc) +
-		(sizeof(struct hfi1_wc) * cq->ibv_cq.cqe);
+	size = hfi1_cq_size(cqe);
 	cq->queue = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED,
 			 ibcq->context->cmd_fd, resp.offset);
 	ret = errno;
@@ -269,8 +272,8 @@  int hfi1_destroy_cq(struct ibv_cq *ibcq)
 	if (ret)
 		return ret;
 
-	(void) munmap(cq->queue, sizeof(struct hfi1_cq_wc) +
-				 (sizeof(struct hfi1_wc) * cq->ibv_cq.cqe));
+	(void) munmap(cq->queue, hfi1_cq_size(cq->ibv_cq.cqe));
+
 	free(cq);
 	return 0;
 }
@@ -288,7 +291,7 @@  int hfi1_destroy_cq_v1(struct ibv_cq *ibcq)
 int hfi1_poll_cq(struct ibv_cq *ibcq, int ne, struct ibv_wc *wc)
 {
 	struct hfi1_cq *cq = to_icq(ibcq);
-	struct hfi1_cq_wc *q;
+	struct rvt_cq_wc *q;
 	int npolled;
 	uint32_t tail;
 
@@ -300,7 +303,7 @@  int hfi1_poll_cq(struct ibv_cq *ibcq, int ne, struct ibv_wc *wc)
 			break;
 		/* Make sure entry is read after head index is read. */
 		atomic_thread_fence(memory_order_acquire);
-		memcpy(wc, &q->queue[tail], sizeof(*wc));
+		memcpy(wc, &q->uqueue[tail], sizeof(*wc));
 		if (tail == cq->ibv_cq.cqe)
 			tail = 0;
 		else