| import unittest | |
| from tests.base import RCResources, RDMATestCase | |
| from pyverbs.srq import SrqAttr | |
| from pyverbs.libibverbs_enums import ibv_device_cap_flags, ibv_srq_attr_mask, ibv_event_type | |
| import tests.utils as u | |
| class SrqTestCase(RDMATestCase): | |
| def setUp(self): | |
| super().setUp() | |
| self.iters = 100 | |
| self.create_players(RCResources, qp_count=2, with_srq=True) | |
| def test_rc_srq_traffic(self): | |
| """ | |
| Test RC traffic with SRQ. | |
| """ | |
| u.traffic(**self.traffic_args) | |
| def test_resize_srq(self): | |
| """ | |
| Test modify_srq with IBV_SRQ_MAX_WR which allows modifying max_wr. | |
| Once modified, query the SRQ and verify that the new value is greater | |
| or equal than the requested max_wr. | |
| """ | |
| device_attr = self.server.ctx.query_device() | |
| if not device_attr.device_cap_flags & ibv_device_cap_flags.IBV_DEVICE_SRQ_RESIZE: | |
| raise unittest.SkipTest('SRQ resize is not supported') | |
| srq_query_attr = self.server.srq.query() | |
| srq_query_max_wr = srq_query_attr.max_wr | |
| srq_max_wr = min(device_attr.max_srq_wr, srq_query_max_wr*2) | |
| srq_attr = SrqAttr(max_wr=srq_max_wr) | |
| self.server.srq.modify(srq_attr, ibv_srq_attr_mask.IBV_SRQ_MAX_WR) | |
| srq_attr_modified = self.server.srq.query() | |
| self.assertGreaterEqual(srq_attr_modified.max_wr, srq_attr.max_wr, | |
| 'Resize SRQ failed') | |
| def test_modify_srq_limit(self): | |
| """ | |
| Test IBV_SRQ_LIMIT modification. | |
| Add 10 wr to the SRQ and set the limit to 7, | |
| Query and verify that the SRQ limit changed to the expected value. | |
| send 4 packets from the client to the server, only 6 wr remain in the | |
| server SRQ so IBV_EVENT_SRQ_LIMIT_REACHED should be generated. | |
| Listen for income event and if one received check if it's equal to | |
| IBV_EVENT_SRQ_LIMIT_REACHED else fail. | |
| """ | |
| for _ in range(10): | |
| self.server.srq.post_recv(u.get_recv_wr(self.server)) | |
| srq_modify_attr = SrqAttr(srq_limit=7) | |
| self.server.srq.modify(srq_modify_attr, ibv_srq_attr_mask.IBV_SRQ_LIMIT) | |
| server_query = self.server.srq.query() | |
| self.assertEqual(srq_modify_attr.srq_limit, server_query.srq_limit, 'Modify SRQ failed') | |
| for _ in range(4): | |
| c_send_wr, c_sg = u.get_send_elements(self.client, False) | |
| u.send(self.client, c_send_wr) | |
| u.poll_cq(self.client.cq) | |
| u.poll_cq(self.server.cq) | |
| event = self.server.ctx.get_async_event() | |
| event.ack() | |
| self.assertEqual(event.event_type, ibv_event_type.IBV_EVENT_SRQ_LIMIT_REACHED) |