|
7 | 7 | from pyverbs.mr import MR |
8 | 8 | import pyverbs.enums as e |
9 | 9 | import tests.utils as u |
| 10 | +import unittest |
10 | 11 |
|
11 | 12 | HUGE_PAGE_SIZE = 0x200000 |
12 | 13 |
|
@@ -131,19 +132,37 @@ def __init__(self, dev_name, ib_port, gid_index, is_huge=False, |
131 | 132 | gid_index=gid_index) |
132 | 133 | self.msg_size = msg_size |
133 | 134 |
|
| 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 | + |
134 | 139 | 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.') |
136 | 146 |
|
137 | | - @u.requires_odp('rc', e.IBV_ODP_SUPPORT_SEND | e.IBV_ODP_SUPPORT_RECV | |
138 | | - e.IBV_ODP_SUPPORT_ATOMIC_WRITE) |
139 | 147 | 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.') |
147 | 166 |
|
148 | 167 | class OdpTestCase(RDMATestCase): |
149 | 168 | def setUp(self): |
@@ -190,6 +209,20 @@ def test_odp_qp_ex_rc_atomic_write(self): |
190 | 209 | u.rdma_traffic(**self.traffic_args, |
191 | 210 | new_send=True, send_op=e.IBV_WR_ATOMIC_WRITE) |
192 | 211 |
|
| 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 | + |
193 | 226 | def test_odp_rc_atomic_cmp_and_swp(self): |
194 | 227 | self.create_players(OdpRC, request_user_addr=self.force_page_faults, |
195 | 228 | msg_size=8, odp_caps=e.IBV_ODP_SUPPORT_ATOMIC) |
|
0 commit comments