| import unittest | |
| import errno | |
| from pyverbs.providers.mlx5.mlx5dv_sched import Mlx5dvSchedAttr, \ | |
| Mlx5dvSchedNode, Mlx5dvSchedLeaf | |
| from tests.mlx5_base import Mlx5RDMATestCase, Mlx5PyverbsAPITestCase | |
| from pyverbs.pyverbs_error import PyverbsRDMAError | |
| from pyverbs.providers.mlx5.mlx5dv import Mlx5QP | |
| from pyverbs.providers.mlx5.mlx5_enums import mlx5dv_sched_elem_attr_flags | |
| from tests.base import RCResources | |
| import tests.utils as u | |
| class Mlx5SchedTest(Mlx5PyverbsAPITestCase): | |
| def test_create_sched_tree(self): | |
| """ | |
| Create schedule elements tree. Test the schedule elements API, this | |
| includes creating schedule nodes with different flags and connecting | |
| them with schedule leaves. In addition, modify some nodes with | |
| different BW share and max BW. | |
| """ | |
| try: | |
| root_node = Mlx5dvSchedNode(self.ctx, Mlx5dvSchedAttr()) | |
| # Create a node with only max_avg_bw argument. | |
| max_sched_attr = Mlx5dvSchedAttr(root_node, max_avg_bw=10, | |
| flags=mlx5dv_sched_elem_attr_flags.MLX5DV_SCHED_ELEM_ATTR_FLAGS_MAX_AVG_BW) | |
| max_bw_node = Mlx5dvSchedNode(self.ctx, max_sched_attr) | |
| # Create a node with only bw_share argument. | |
| weighed_sched_attr = Mlx5dvSchedAttr(root_node, bw_share=10, | |
| flags=mlx5dv_sched_elem_attr_flags.MLX5DV_SCHED_ELEM_ATTR_FLAGS_BW_SHARE) | |
| max_bw_node = Mlx5dvSchedNode(self.ctx, weighed_sched_attr) | |
| # Create a node with max_avg_bw and bw_share arguments. | |
| mixed_flags = mlx5dv_sched_elem_attr_flags.MLX5DV_SCHED_ELEM_ATTR_FLAGS_MAX_AVG_BW | \ | |
| mlx5dv_sched_elem_attr_flags.MLX5DV_SCHED_ELEM_ATTR_FLAGS_BW_SHARE | |
| mixed_sched_attr = Mlx5dvSchedAttr(root_node, max_avg_bw=10, bw_share=2, | |
| flags=mixed_flags) | |
| mixed_bw_node = Mlx5dvSchedNode(self.ctx, mixed_sched_attr) | |
| # Modify a node. | |
| modify_sched_attr = Mlx5dvSchedAttr(root_node, max_avg_bw=4, bw_share=1, | |
| flags=mixed_flags) | |
| mixed_bw_node.modify(modify_sched_attr) | |
| # Attach sched leaf to mixed_bw_node | |
| max_sched_attr = Mlx5dvSchedAttr(mixed_bw_node) | |
| sched_leaf = Mlx5dvSchedLeaf(self.ctx, max_sched_attr) | |
| # Modify a leaf. | |
| modify_sched_attr = Mlx5dvSchedAttr(mixed_bw_node, max_avg_bw=3, bw_share=3, | |
| flags=mixed_flags) | |
| sched_leaf.modify(modify_sched_attr) | |
| except PyverbsRDMAError as ex: | |
| if ex.error_code == errno.EOPNOTSUPP: | |
| raise unittest.SkipTest('Create schedule elements is not supported') | |
| raise ex | |
| class Mlx5SchedTrafficTest(Mlx5RDMATestCase): | |
| def setUp(self): | |
| super().setUp() | |
| self.iters = 10 | |
| self.server = None | |
| self.client = None | |
| self.traffic_args = None | |
| def test_sched_per_qp_traffic(self): | |
| """ | |
| Tests attaching a QP to a sched leaf. The test creates a sched tree | |
| consisting of a root node and a leaf with max BW and share BW, modifies | |
| two RC QPs to be attached to the sched leaf and then run traffic using | |
| those QPs. | |
| """ | |
| self.create_players(RCResources) | |
| try: | |
| root_node = Mlx5dvSchedNode(self.server.ctx, Mlx5dvSchedAttr()) | |
| mixed_flags = mlx5dv_sched_elem_attr_flags.MLX5DV_SCHED_ELEM_ATTR_FLAGS_MAX_AVG_BW | \ | |
| mlx5dv_sched_elem_attr_flags.MLX5DV_SCHED_ELEM_ATTR_FLAGS_BW_SHARE | |
| mixed_sched_attr = Mlx5dvSchedAttr(root_node, max_avg_bw=10, | |
| bw_share=2, flags=mixed_flags) | |
| leaf = Mlx5dvSchedLeaf(self.server.ctx, mixed_sched_attr) | |
| Mlx5QP.modify_qp_sched_elem(self.server.qp, req_sched_leaf=leaf, | |
| resp_sched_leaf=leaf) | |
| except PyverbsRDMAError as ex: | |
| if ex.error_code == errno.EOPNOTSUPP: | |
| raise unittest.SkipTest('Creation or usage of schedule elements is not supported') | |
| raise ex | |
| u.traffic(**self.traffic_args) |