| from tests.base import RCResources, UDResources, XRCResources, RDMATestCase, \ |
| PyverbsAPITestCase |
| from pyverbs.pyverbs_error import PyverbsRDMAError |
| from pyverbs.cq import CqInitAttrEx, CQEX |
| import pyverbs.enums as e |
| from pyverbs.mr import MR |
| import tests.utils as u |
| import unittest |
| import errno |
| |
| |
| def create_ex_cq(res): |
| """ |
| Create an Extended CQ using res's context and assign it to res's cq member. |
| IBV_WC_STANDARD_FLAGS is used for WC flags to avoid support differences |
| between devices. |
| :param res: An instance of TrafficResources |
| """ |
| wc_flags = e.IBV_WC_STANDARD_FLAGS |
| cia = CqInitAttrEx(cqe=2000, wc_flags=wc_flags) |
| try: |
| res.cq = CQEX(res.ctx, cia) |
| except PyverbsRDMAError as ex: |
| if ex.error_code == errno.EOPNOTSUPP: |
| raise unittest.SkipTest('Create Extended CQ is not supported') |
| raise ex |
| |
| class CqExUD(UDResources): |
| def create_cq(self): |
| create_ex_cq(self) |
| |
| def create_mr(self): |
| self.mr = MR(self.pd, self.msg_size + self.GRH_SIZE, |
| e.IBV_ACCESS_LOCAL_WRITE) |
| |
| |
| class CqExRC(RCResources): |
| def create_cq(self): |
| create_ex_cq(self) |
| |
| |
| class CqExXRC(XRCResources): |
| def create_cq(self): |
| create_ex_cq(self) |
| |
| |
| class CqExTestCase(RDMATestCase): |
| """ |
| Run traffic over the existing UD, RC and XRC infrastructure, but use |
| ibv_cq_ex instead of legacy ibv_cq |
| """ |
| def setUp(self): |
| super().setUp() |
| self.iters = 100 |
| |
| def test_ud_traffic_cq_ex(self): |
| self.create_players(CqExUD) |
| u.traffic(**self.traffic_args, is_cq_ex=True) |
| |
| def test_rc_traffic_cq_ex(self): |
| self.create_players(CqExRC) |
| u.traffic(**self.traffic_args, is_cq_ex=True) |
| |
| def test_xrc_traffic_cq_ex(self): |
| self.create_players(CqExXRC) |
| u.xrc_traffic(self.client, self.server, is_cq_ex=True) |
| |
| |
| class CQEXAPITest(PyverbsAPITestCase): |
| """ |
| Test the API of the CQEX class. |
| """ |
| def setUp(self): |
| super().setUp() |
| self.max_cqe = self.attr.max_cqe |
| |
| def test_create_cq_ex(self): |
| """ |
| Test ibv_create_cq_ex() |
| """ |
| cq_init_attrs_ex = CqInitAttrEx(cqe=10, wc_flags=0, comp_mask=0, flags=0) |
| if self.attr_ex.raw_packet_caps & e.IBV_RAW_PACKET_CAP_CVLAN_STRIPPING: |
| cq_init_attrs_ex.wc_flags = e.IBV_WC_EX_WITH_CVLAN |
| CQEX(self.ctx, cq_init_attrs_ex) |
| |
| for flag in list(e.ibv_create_cq_wc_flags): |
| cq_init_attrs_ex.wc_flags = flag |
| try: |
| cq_ex = CQEX(self.ctx, cq_init_attrs_ex) |
| cq_ex.close() |
| except PyverbsRDMAError as ex: |
| if ex.error_code != errno.EOPNOTSUPP: |
| raise ex |
| |
| cq_init_attrs_ex.wc_flags = 0 |
| cq_init_attrs_ex.comp_mask = e.IBV_CQ_INIT_ATTR_MASK_FLAGS |
| attr_flags = list(e.ibv_create_cq_attr_flags) |
| for flag in attr_flags: |
| cq_init_attrs_ex.flags = flag |
| try: |
| cq_ex = CQEX(self.ctx, cq_init_attrs_ex) |
| cq_ex.close() |
| except PyverbsRDMAError as ex: |
| if ex.error_code != errno.EOPNOTSUPP: |
| raise ex |
| |
| def test_create_cq_ex_bad_flow(self): |
| """ |
| Test ibv_create_cq_ex() with wrong comp_vector / number of cqes |
| """ |
| cq_attrs_ex = CqInitAttrEx(cqe=self.max_cqe + 1, wc_flags=0, comp_mask=0, flags=0) |
| with self.assertRaises(PyverbsRDMAError) as ex: |
| CQEX(self.ctx, cq_attrs_ex) |
| if ex.exception.error_code == errno.EOPNOTSUPP: |
| raise unittest.SkipTest('Create Extended CQ is not supported') |
| self.assertEqual(ex.exception.error_code, errno.EINVAL) |
| |
| cq_attrs_ex = CqInitAttrEx(10, wc_flags=0, comp_mask=0, flags=0) |
| cq_attrs_ex.comp_vector = self.ctx.num_comp_vectors + 1 |
| with self.assertRaises(PyverbsRDMAError) as ex: |
| CQEX(self.ctx, cq_attrs_ex) |
| self.assertEqual(ex.exception.error_code, errno.EINVAL) |