Skip to content

Commit

Permalink
Fix rdma-core 18 build (zrlio#50)
Browse files Browse the repository at this point in the history
The rdma-core 18 build depends on many more kernel headers than
rdma-core 17. Fix the CCAN includes from the rdma-core 18 headers
because the directory structure in rdma-core was modified, whereas we
keep a more vanilla layout.

Add all of the userspace ABI kernel headers to the source tree so we can
build against the newer rdma-core version.

The updated build has been tested on my local system against rdma-core
17 and 18 and appears to work correctly.

Signed-off-by: Patrick MacArthur <[email protected]>
  • Loading branch information
patrickmacarthur committed Oct 21, 2018
1 parent c57ca7c commit 8567e98
Show file tree
Hide file tree
Showing 12 changed files with 2,250 additions and 4 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ config.h*
config.log
config.status
configure
include/kernel-abi
libtool
Makefile
/Makefile.in
Expand Down
1 change: 1 addition & 0 deletions README
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ Requirements
- json-c
- uthash (included in Fedora, Ubuntu, openSUSE, and EPEL for RHEL
repositories)
- Python 2.7 (for build system)

Setup instructions
------------------
Expand Down
57 changes: 57 additions & 0 deletions config/make_abi_structs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#!/usr/bin/env python
# Copied from rdma-core 18.2
"""This script transforms the structs inside the kernel ABI headers into a define
of an anonymous struct.
eg
struct abc {int foo;};
becomes
#define _STRUCT_abc struct {int foo;};
This allows the exact same struct to be included in the provider wrapper struct:
struct abc_resp {
struct ibv_abc ibv_resp;
_STRUCT_abc;
};
Which duplicates the struct layout and naming we have historically used, but
sources the data directly from the kernel headers instead of manually copying."""
import re;
import functools;
import sys;

def in_struct(ln,FO,nesting=0):
"""Copy a top level structure over to the #define output, keeping track of
nested structures."""
if nesting == 0:
if re.match(r"(}.*);",ln):
FO.write(ln[:-1] + "\n\n");
return find_struct;

FO.write(ln + " \\\n");

if ln == "struct {" or ln == "union {":
return functools.partial(in_struct,nesting=nesting+1);

if re.match(r"}.*;",ln):
return functools.partial(in_struct,nesting=nesting-1);
return functools.partial(in_struct,nesting=nesting);

def find_struct(ln,FO):
"""Look for the start of a top level structure"""
if ln.startswith("struct ") or ln.startswith("union "):
g = re.match(r"(struct|union)\s+(\S+)\s+{",ln);
FO.write("#define _STRUCT_%s %s { \\\n"%(g.group(2),g.group(1)));
return in_struct;
return find_struct;

with open(sys.argv[1]) as FI:
with open(sys.argv[2],"w") as FO:
state = find_struct;
for ln in FI:
# Drop obvious comments
ln = ln.strip();
ln = re.sub(r"/\*.*\*/","",ln);
ln = re.sub(r"//.*$","",ln);
state = state(ln,FO);
11 changes: 9 additions & 2 deletions config/rdma_core.m4
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,13 @@ AC_DEFUN([_URDMA_FUNC_VERBS_INIT_AND_ALLOC_CONTEXT],
AC_CACHE_CHECK([number of arguments verbs_init_and_alloc_context takes],
[dpdk_cv_func_verbs_init_and_alloc_context],
[old_CPPFLAGS="${CPPFLAGS}"
CPPFLAGS="-I${srcdir} -I${srcdir}/rdma-core/${ibverbs_pabi_version} ${CPPFLAGS}"
CPPFLAGS="-I${srcdir} -I${srcdir}/rdma-core/${ibverbs_pabi_version} -Iinclude -I${srcdir}/rdma-core/${ibverbs_pabi_version}/rdma ${CPPFLAGS}"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <infiniband/driver.h>]],
[verbs_init_and_alloc_context@{:@@:}@;])],
[[# No-argument case is invalid and means we didn't find a prototype]]
[dpdk_cv_func_verbs_init_and_alloc_context=no],
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <infiniband/driver.h>]],
[[struct foo { struct verbs_context bar; } *baz; verbs_init_and_alloc_context@{:@NULL, NULL, baz, bar, 0@:}@;]])],
[[struct foo { struct verbs_context bar; } *baz; verbs_init_and_alloc_context@{:@NULL, 0, baz, bar, 0@:}@;]])],
[dpdk_cv_func_verbs_init_and_alloc_context=5],
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <infiniband/driver.h>]],
[[struct foo { struct verbs_context bar; } *baz; verbs_init_and_alloc_context@{:@NULL, NULL, baz, bar@:}@;]])],
Expand Down Expand Up @@ -94,6 +94,13 @@ AC_DEFINE_UNQUOTED([IBVERBS_PABI_VERSION], [${ibverbs_pabi_version}],
[Define to rdma-core private ABI version])
AC_SUBST([ibverbs_pabi_version])
if test $ibverbs_pabi_version -ge 18; then
mkdir -p include/kernel-abi
${srcdir}/config/make_abi_structs.py \
${srcdir}/rdma-core/${ibverbs_pabi_version}/rdma/ib_user_verbs.h \
include/kernel-abi/ib_user_verbs.h
CPPFLAGS="${CPPFLAGS} -Iinclude"
fi
if test $ibverbs_pabi_version -ge 17; then
_URDMA_FUNC_VERBS_INIT_AND_ALLOC_CONTEXT
fi
Expand Down
Loading

0 comments on commit 8567e98

Please sign in to comment.