Skip to content

Commit 968e842

Browse files
committed
tests: RDMA FLUSH test with ODP
Add a test of RDMA FLUSH sequences with ODP. MR is invalidated at the beginning of this workload so that page fault is triggered at least once. The test was implemented in reference to test_qp_ex_rc_flush() in test_qpex.py Signed-off-by: Daisuke Matsuda <[email protected]>
1 parent 38a88d0 commit 968e842

File tree

1 file changed

+43
-10
lines changed

1 file changed

+43
-10
lines changed

tests/test_odp.py

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from pyverbs.mr import MR
88
import pyverbs.enums as e
99
import tests.utils as u
10+
import unittest
1011

1112
HUGE_PAGE_SIZE = 0x200000
1213

@@ -131,19 +132,37 @@ def __init__(self, dev_name, ib_port, gid_index, is_huge=False,
131132
gid_index=gid_index)
132133
self.msg_size = msg_size
133134

135+
if self.odp_caps & e.IBV_ODP_SUPPORT_FLUSH:
136+
self.ptype = e.IBV_FLUSH_GLOBAL
137+
self.level = e.IBV_FLUSH_RANGE
138+
134139
def create_qps(self):
135-
u.create_qp_ex(self, e.IBV_QPT_RC, e.IBV_QP_EX_WITH_ATOMIC_WRITE)
140+
if self.odp_caps & e.IBV_ODP_SUPPORT_ATOMIC_WRITE:
141+
u.create_qp_ex(self, e.IBV_QPT_RC, e.IBV_QP_EX_WITH_ATOMIC_WRITE)
142+
elif self.odp_caps & e.IBV_ODP_SUPPORT_FLUSH:
143+
u.create_qp_ex(self, e.IBV_QPT_RC, e.IBV_QP_EX_WITH_FLUSH | e.IBV_QP_EX_WITH_RDMA_WRITE)
144+
else:
145+
raise unittest.SkipTest('There is no qpex test for the specified ODP caps.')
136146

137-
@u.requires_odp('rc', e.IBV_ODP_SUPPORT_SEND | e.IBV_ODP_SUPPORT_RECV |
138-
e.IBV_ODP_SUPPORT_ATOMIC_WRITE)
139147
def create_mr(self):
140-
access = self.access
141-
if self.request_user_addr:
142-
mmap_flags = MAP_ANONYMOUS_| MAP_PRIVATE_
143-
length = self.msg_size
144-
self.user_addr = mmap(length=length, flags=mmap_flags)
145-
self.mr = MR(self.pd, self.msg_size, access, address=self.user_addr,
146-
implicit=self.is_implicit)
148+
u.odp_supported(self.ctx, 'rc', self.odp_caps)
149+
if self.odp_caps & e.IBV_ODP_SUPPORT_ATOMIC_WRITE:
150+
access = self.access
151+
if self.request_user_addr:
152+
mmap_flags = MAP_ANONYMOUS_| MAP_PRIVATE_
153+
length = self.msg_size
154+
self.user_addr = mmap(length=length, flags=mmap_flags)
155+
self.mr = MR(self.pd, self.msg_size, access, address=self.user_addr,
156+
implicit=self.is_implicit)
157+
elif self.odp_caps & e.IBV_ODP_SUPPORT_FLUSH:
158+
try:
159+
self.mr = u.create_custom_mr(self, e.IBV_ACCESS_FLUSH_GLOBAL | e.IBV_ACCESS_REMOTE_WRITE | e.IBV_ACCESS_ON_DEMAND)
160+
except PyverbsRDMAError as ex:
161+
if ex.error_code == errno.EINVAL:
162+
raise unittest.SkipTest('Create mr with IBV_ACCESS_FLUSH_GLOBAL access flag is not supported in kernel')
163+
raise ex
164+
else:
165+
raise unittest.SkipTest('There is no qpex test for the specified ODP caps.')
147166

148167
class OdpTestCase(RDMATestCase):
149168
def setUp(self):
@@ -190,6 +209,20 @@ def test_odp_qp_ex_rc_atomic_write(self):
190209
u.rdma_traffic(**self.traffic_args,
191210
new_send=True, send_op=e.IBV_WR_ATOMIC_WRITE)
192211

212+
def test_odp_qp_ex_rc_flush(self):
213+
super().create_players(OdpQpExRC, request_user_addr=self.force_page_faults,
214+
odp_caps=e.IBV_ODP_SUPPORT_FLUSH)
215+
wcs = u.flush_traffic(**self.traffic_args, new_send=True,
216+
send_op=e.IBV_WR_FLUSH)
217+
if wcs[0].status != e.IBV_WC_SUCCESS:
218+
raise PyverbsError(f'Unexpected {wc_status_to_str(wcs[0].status)}')
219+
220+
self.client.level = e.IBV_FLUSH_MR
221+
wcs = u.flush_traffic(**self.traffic_args, new_send=True,
222+
send_op=e.IBV_WR_FLUSH)
223+
if wcs[0].status != e.IBV_WC_SUCCESS:
224+
raise PyverbsError(f'Unexpected {wc_status_to_str(wcs[0].status)}')
225+
193226
def test_odp_rc_atomic_cmp_and_swp(self):
194227
self.create_players(OdpRC, request_user_addr=self.force_page_faults,
195228
msg_size=8, odp_caps=e.IBV_ODP_SUPPORT_ATOMIC)

0 commit comments

Comments
 (0)