Skip to content

Commit 9e3aae8

Browse files
authored
Merge pull request #1713 from ShacharKagan/pyverbs_dmabuf_port_speed
tests: Add query port speed and export dmabuf FD support
2 parents de593a0 + 0fd914e commit 9e3aae8

8 files changed

Lines changed: 81 additions & 1 deletion

File tree

pyverbs/device.pyx

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,18 @@ cdef class Context(PyverbsCM):
266266
format(p=port_num), rc)
267267
return port_attrs
268268

269+
def query_port_speed(self, unsigned int port_num):
270+
"""
271+
Query port <port_num> speed in 100 Mb/s granularity.
272+
:param port_num: Port number to query
273+
:return: Port speed
274+
"""
275+
cdef uint64_t port_speed
276+
rc = v.ibv_query_port_speed(self.context, port_num, &port_speed)
277+
if rc != 0:
278+
raise PyverbsRDMAError(f'Failed to query port speed for port {port_num}', rc)
279+
return port_speed
280+
269281
def query_gid_table(self, size_t max_entries, uint32_t flags=0):
270282
"""
271283
Queries the GID tables of the device for at most <max_entries> entries
@@ -854,6 +866,16 @@ cdef class DM(PyverbsCM):
854866
free(data)
855867
return res
856868

869+
def export_dmabuf_fd(self):
870+
"""
871+
Export a dmabuf FD for this DM object.
872+
:return: A file descriptor (int) for the dmabuf FD
873+
"""
874+
fd = v.ibv_dm_export_dmabuf_fd(self.dm)
875+
if fd < 0:
876+
raise PyverbsRDMAErrno('Failed to export dmabuf FD for DM')
877+
return fd
878+
857879
@property
858880
def handle(self):
859881
return self.dm.handle
@@ -1266,7 +1288,8 @@ def translate_event_type(event_type):
12661288
e.IBV_EVENT_QP_LAST_WQE_REACHED: '.IBV_EVENT_QP_LAST_WQE_REACHED',
12671289
e.IBV_EVENT_CLIENT_REREGISTER: 'IBV_EVENT_CLIENT_REREGISTER',
12681290
e.IBV_EVENT_GID_CHANGE: 'IBV_EVENT_GID_CHANGE',
1269-
e.IBV_EVENT_WQ_FATAL: 'IBV_EVENT_WQ_FATAL'
1291+
e.IBV_EVENT_WQ_FATAL: 'IBV_EVENT_WQ_FATAL',
1292+
e.IBV_EVENT_DEVICE_SPEED_CHANGE: 'IBV_EVENT_DEVICE_SPEED_CHANGE'
12701293
}
12711294
try:
12721295
return types[event_type]

pyverbs/libibverbs.pxd

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -703,8 +703,11 @@ cdef extern from 'infiniband/verbs.h':
703703
size_t length)
704704
int ibv_memcpy_from_dm(void *host_addr, ibv_dm *dm, unsigned long dm_offset,
705705
size_t length)
706+
int ibv_dm_export_dmabuf_fd(ibv_dm *dm)
706707
int ibv_query_port(ibv_context *context, uint8_t port_num,
707708
ibv_port_attr *port_attr)
709+
int ibv_query_port_speed(ibv_context *context, uint8_t port_num,
710+
uint64_t *port_speed)
708711
ibv_comp_channel *ibv_create_comp_channel(ibv_context *context)
709712
int ibv_destroy_comp_channel(ibv_comp_channel *channel)
710713
int ibv_get_cq_event(ibv_comp_channel *channel, ibv_cq **cq,

pyverbs/libibverbs_enums.pxd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ cdef extern from '<infiniband/verbs.h>':
104104
IBV_EVENT_CLIENT_REREGISTER
105105
IBV_EVENT_GID_CHANGE
106106
IBV_EVENT_WQ_FATAL
107+
IBV_EVENT_DEVICE_SPEED_CHANGE
107108

108109
cpdef enum ibv_access_flags:
109110
IBV_ACCESS_LOCAL_WRITE

pyverbs/providers/mlx5/libmlx5.pxd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,7 @@ cdef extern from 'infiniband/mlx5dv.h':
568568
# DevX APIs
569569
mlx5dv_devx_uar *mlx5dv_devx_alloc_uar(v.ibv_context *context, uint32_t flags)
570570
void mlx5dv_devx_free_uar(mlx5dv_devx_uar *devx_uar)
571+
int mlx5dv_devx_uar_export_dmabuf_fd(mlx5dv_devx_uar *devx_uar)
571572
int mlx5dv_devx_general_cmd(v.ibv_context *context, const void *in_,
572573
size_t inlen, void *out, size_t outlen)
573574
mlx5dv_devx_umem *mlx5dv_devx_umem_reg(v.ibv_context *ctx, void *addr,

pyverbs/providers/mlx5/mlx5dv.pyx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1455,6 +1455,16 @@ cdef class Mlx5UAR(PyverbsObject):
14551455
def uar(self):
14561456
return <uintptr_t>self.uar
14571457

1458+
def export_dmabuf_fd(self):
1459+
"""
1460+
Export a dmabuf FD for this UAR object.
1461+
:return: A file descriptor (int) for the dmabuf FD
1462+
"""
1463+
fd = dv.mlx5dv_devx_uar_export_dmabuf_fd(self.uar)
1464+
if fd < 0:
1465+
raise PyverbsRDMAErrno('Failed to export dmabuf FD for UAR')
1466+
return fd
1467+
14581468

14591469
cdef class Mlx5DmOpAddr(PyverbsCM):
14601470
def __init__(self, DM dm not None, op=0):

tests/test_device.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,22 @@ def test_query_port_bad_flow(self):
284284
'Successfully queried non-existing port {p}'. \
285285
format(p=port))
286286

287+
def test_query_port_speed(self):
288+
"""
289+
Test ibv_query_port_speed
290+
"""
291+
for dev in self.get_device_list():
292+
with d.Context(name=dev.name.decode()) as ctx:
293+
try:
294+
port_speed = ctx.query_port_speed(self.ib_port)
295+
except PyverbsRDMAError as ex:
296+
if ex.error_code in [errno.EOPNOTSUPP, errno.EPROTONOSUPPORT]:
297+
raise unittest.SkipTest('ibv_query_port_speed is not'
298+
' supported on this device')
299+
raise ex
300+
self.assertGreaterEqual(port_speed, 0, 'Port speed should be positive, got'
301+
f' {port_speed} Mbps')
302+
287303

288304
class DMTest(PyverbsAPITestCase):
289305
"""

tests/test_mlx5_uar.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,17 @@ def test_alloc_uar(self):
3636
finally:
3737
for uar in self.uar_res.uars:
3838
uar.close()
39+
40+
def test_uar_export_dmabuf_fd(self):
41+
"""Test exporting a UAR as a dmabuf FD"""
42+
try:
43+
self.uar_res.uars.append(Mlx5UAR(self.uar_res.ctx, _MLX5DV_UAR_ALLOC_TYPE_NC))
44+
dmabuf_fd = self.uar_res.uars[-1].export_dmabuf_fd()
45+
self.assertGreater(dmabuf_fd, 0, 'Expected a valid dmabuf FD greater than 0')
46+
except PyverbsRDMAError as ex:
47+
if ex.error_code in [errno.EPROTONOSUPPORT, errno.EOPNOTSUPP]:
48+
raise unittest.SkipTest('UAR dmabuf export is not supported')
49+
raise ex
50+
finally:
51+
for uar in self.uar_res.uars:
52+
uar.close()

tests/test_mr.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,18 @@ def test_dm_bad_registration(self):
484484
with self.assertRaisesRegex(PyverbsRDMAError, 'Failed to register a device MR'):
485485
DMMR(PD(self.ctx), dm_size + 4, dm_access, dm, 0)
486486

487+
def test_dm_export_dmabuf_fd(self):
488+
"""Test exporting a DM as a dmabuf FD"""
489+
dm_size = 100
490+
try:
491+
with d.DM(self.ctx, d.AllocDmAttr(length=dm_size)) as dm:
492+
dmabuf_fd = dm.export_dmabuf_fd()
493+
self.assertGreater(dmabuf_fd, 0, 'Expected a valid dmabuf FD greater than 0')
494+
except PyverbsRDMAError as ex:
495+
if ex.error_code in [errno.EOPNOTSUPP, errno.EPROTONOSUPPORT]:
496+
raise unittest.SkipTest('DM dmabuf export is not supported')
497+
raise ex
498+
487499

488500
def check_dmabuf_support(gpu=0):
489501
"""

0 commit comments

Comments
 (0)