[PATCH 00/12] cxiverbs: add the HPE Cassini verbs provider
From: Doug Ledford
Date: Sat Oct 31 2026 - 15:26:58 EST
This pull request adds cxiverbs, the user space provider for the HPE
Slingshot Cassini NIC, matching the cxiverbs kernel driver. It uses the
UET reliable unconnected (RU) queue pair type from the UET rdma-core
series.
Patches 1-3 extend libibverbs:
- ibv_read_counters_ex(): read selected counters, with per-item
timestamps, using the kernel counters extension
- permit UET jobs without an address table, matching the kernel
change. This relaxes a rule in the UET series and needs agreement
from its authors; the commit message gives the hardware reasons.
- provider-owned completion channels and the Slingshot transport
The new provider ops join the private ABI that the UET series already
raised to 66; since 66.0 is unreleased, IBVERBS_PABI_VERSION is not
bumped again.
Patches 4-11 add the provider:
- the shared native hardware and verbs ABI headers
- the cxidv direct-verbs interface for native resources (services,
LNIs, communication profiles, event and command queues, counting
triggers, CSR access), with explicit ownership
- list entry encoding and VNI-isolated remote keys
- the provider, device discovery and the UET verbs
- model and hardware tests for identity isolation, polling and event
traffic
- cxi_launcher, which a workload manager such as Slurm can use to
grant a job exact VNIs, a traffic class and resource limits before
it starts the application without privileges
- build and packaging (Debian, SUSE and Red Hat), with the provider
library packaged like efa, mana and mlx5 and built only where
coherent DMA is available, and the pyverbs cxidv bindings used by
the RU tests. cxi_launcher ships with the provider library, since
client programs cannot run on CXI hardware without it.
Patch 12 ports the ibv_ru_pingpong and ibv_ru_rma examples to the
explicitly granted resources. On a Slingshot device they run
themselves again under cxi_launcher, so when the CXI provider is built
they use the cxidv API and link against libcxiverbs; that is why they
come after the provider.
Dependencies
------------
This pull request depends on:
- the Cassini NIC driver series for net-next,
net: hpe: add HPE Slingshot NIC drivers
https://lore.kernel.org/netdev/20261030-cxi-netdev-submission-v1-0-8c2c391cc283@xxxxxxx/
- the UET RDMA kernel series
RDMA/core: Ultra Ethernet transport verbs
https://lore.kernel.org/linux-rdma/20261019-uet-ib-core-v2-0-8bd654f25370@xxxxxxxxxxxx/
- the cxiverbs kernel series,
RDMA/cxi: add the HPE Cassini verbs driver
https://lore.kernel.org/linux-rdma/20261030-cxi-for-next-v1-0-bc6e49e07037@xxxxxxx/
- the UET rdma-core series
libibverbs: Ultra Ethernet reliable unconnected verbs
https://github.com/linux-rdma/rdma-core/pull/1829
kernel-headers/ carries the UAPI headers from those kernel series.
Known open issues
-----------------
No known functional issues are open in the provider. Where the
kernel's SR-IOV support is involved, the kernel series notes that V2
will include an updated SR-IOV implementation.
One question needs a UET ABI decision: the RU examples and the generic
pyverbs.ru module are still built on platforms without coherent DMA,
where the CXI provider is not. If UET, and so the RU queue pair type,
is not expected to support those platforms, they should instead be
built only where coherent DMA is available (see patch 12).
checkpatch
----------
With rdma-core's CI checkpatch settings (buildlib/azp-checkpatch),
three patches still report warnings; each patch explains its own:
- patch 4: PREFER_DEFINED_ATTRIBUTE_MACRO (27) and VOLATILE (2). The
shared headers use __attribute__((packed)) because the kernel-only
__packed is not available to user space, and the command queue
status and event fields stay volatile because the device writes
them.
- patch 10: VOLATILE (2) for the launcher's volatile sig_atomic_t
signal state.
- patch 11: one REPEATED_WORD false positive in
pyverbs/providers/cxi/cxidv.pyx ("Context context" is a Cython typed
parameter).
These exceptions are documented in providers/cxi/utils/README.md. If
reviewers prefer a different form, it needs coordination with the
internal HPE repositories these headers are synchronized from, and will
be changed in V2.
Review and testing
------------------
Before posting, the provider was reviewed with the Sashiko AI code
review tool and checkpatch.
Tool use: GitHub Copilot, an AI coding assistant, was used under our
direction to write many of the review fixes, to fold them into these
patches, to write commit messages and to run the build and hardware
tests. Every change was reviewed by the submitter, who takes
responsibility for it as for any other patch.
- every patch builds incrementally (with pyverbs enabled) without
compiler warnings, and the series also builds without warnings with
coherent DMA disabled, where the CXI provider is left out
- with exactly this provider and the two kernel series, booted on two
Cassini 2 x86_64 nodes, the full stack passed a full test matrix on
both nodes: the rdma-core Python suite (434 tests; tests that need
features this device lacks are skipped), the provider's model
tests, launcher file descriptor tests, resource and VNI isolation
tests in default and indexed addressing modes, including wrong-VNI
rejection, privileged and unprivileged CSR access tests, and 36
two-node RU ping-pong and RMA traffic cases (polling and event
modes) in each direction, 72 in total.
Co-developed by Iraimani P and Mamila Santosh, as shown by the trailers
on each patch.
Doug Ledford (12):
libibverbs: add ibv_read_counters_ex()
libibverbs: permit jobs without an address table
libibverbs: support provider completion channels and Slingshot transport
cxiverbs: add the synchronized native hardware and verbs headers
cxiverbs: define the native direct-verbs resource interface
cxiverbs: encode list entries and VNI-isolated remote keys
cxiverbs: add the provider and device discovery
cxiverbs: implement UET verbs with explicit native ownership
cxiverbs: cover identity isolation and polling and event traffic
cxiverbs: launch Slurm-style exact VNI TC and resource grants
cxiverbs: wire and package the CXI verbs provider and tests
libibverbs: port RU examples to explicitly granted resources
71 files changed, 32565 insertions(+), 182 deletions(-)
Signed-off-by: Doug Ledford <doug.ledford@xxxxxxx>
---
Doug Ledford (12):
libibverbs: add ibv_read_counters_ex()
libibverbs: permit jobs without an address table
libibverbs: support provider completion channels and Slingshot transport
cxiverbs: add the synchronized native hardware and verbs headers
cxiverbs: define the native direct-verbs resource interface
cxiverbs: encode list entries and VNI-isolated remote keys
cxiverbs: add the provider and device discovery
cxiverbs: implement UET verbs with explicit native ownership
cxiverbs: cover identity isolation and polling and event traffic
cxiverbs: launch Slurm-style exact VNI TC and resource grants
cxiverbs: wire and package the CXI verbs provider and tests
libibverbs: port RU examples to explicitly granted resources
CMakeLists.txt | 1 +
debian/control | 1 +
debian/copyright | 5 +
debian/ibverbs-providers.install | 3 +
debian/ibverbs-providers.lintian-overrides | 4 +-
debian/ibverbs-providers.symbols | 46 +
debian/ibverbs-utils.install | 1 +
debian/libibverbs-dev.install | 5 +
debian/libibverbs1.symbols | 1 +
debian/rules | 6 +-
kernel-headers/CMakeLists.txt | 8 +
kernel-headers/ethernet/cassini_user_defs.h | 15004 ++++++++++++++++++++++++++
kernel-headers/rdma/cxiverbs-abi.h | 658 ++
kernel-headers/rdma/ib_user_ioctl_cmds.h | 2 +
kernel-headers/rdma/ib_user_ioctl_verbs.h | 2 +
kernel-headers/rdma/rdma_netlink.h | 1 +
libibverbs/cmd_counters.c | 25 +
libibverbs/cmd_device.c | 7 +-
libibverbs/driver.h | 11 +
libibverbs/dummy_ops.c | 25 +
libibverbs/enum_strs.c | 3 +-
libibverbs/examples/CMakeLists.txt | 10 +
libibverbs/examples/devinfo.c | 2 +
libibverbs/examples/ru_cxi_launch.h | 138 +
libibverbs/examples/ru_pingpong.c | 126 +-
libibverbs/examples/ru_rma.c | 112 +-
libibverbs/init.c | 5 +
libibverbs/libibverbs.map.in | 2 +
libibverbs/man/ibv_alloc_job.3.md | 8 +-
libibverbs/man/ibv_query_gid_ex.3.md | 3 +-
libibverbs/verbs.c | 30 +-
libibverbs/verbs.h | 23 +
providers/cxi/CMakeLists.txt | 19 +
providers/cxi/cxi.c | 196 +
providers/cxi/cxi.h | 265 +
providers/cxi/cxi_le.h | 97 +
providers/cxi/cxi_prov_hw.h | 1838 ++++
providers/cxi/cxi_telem.c | 3948 +++++++
providers/cxi/cxi_verbs.h | 56 +
providers/cxi/cxidv.h | 418 +
providers/cxi/cxidv_telem.h | 1984 ++++
providers/cxi/cxiverbs-abi.h | 29 +
providers/cxi/libcxiverbs.map | 49 +
providers/cxi/tests/CMakeLists.txt | 4 +
providers/cxi/tests/cxi_launcher_test.c | 79 +
providers/cxi/tests/cxi_le_test.c | 2014 ++++
providers/cxi/utils/CMakeLists.txt | 5 +
providers/cxi/utils/README.md | 134 +
providers/cxi/utils/cxi_launcher.c | 967 ++
providers/cxi/utils/cxi_telem.c | 201 +
providers/cxi/verbs.c | 3718 +++++++
pyverbs/CMakeLists.txt | 3 +-
pyverbs/device.pxd | 1 +
pyverbs/device.pyx | 3 +-
pyverbs/libibverbs_enums.pxd | 1 +
pyverbs/providers/cxi/CMakeLists.txt | 6 +
pyverbs/providers/cxi/__init__.pxd | 0
pyverbs/providers/cxi/__init__.py | 0
pyverbs/providers/cxi/cxidv.pxd | 23 +
pyverbs/providers/cxi/cxidv.pyx | 64 +
pyverbs/ru.pyx | 2 +-
redhat/rdma-core.spec | 5 +
suse/rdma-core.spec | 23 +
tests/base.py | 47 +
tests/ru_base.py | 33 +-
tests/test_addr.py | 4 +-
tests/test_device.py | 12 +-
tests/test_dmah.py | 70 +-
tests/test_mr.py | 8 +-
tests/test_qp.py | 7 +-
tests/test_ru.py | 136 +-
71 files changed, 32565 insertions(+), 182 deletions(-)
---
base-commit: 8db37d9b02fac926ddd099ba7c05fac66f0e243a
change-id: 20261031-cxi-for-next-742514c31679
Best regards,
--
Doug Ledford <doug.ledford@xxxxxxx>