| # SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB) |
| # Copyright (c) 2025 Mellanox Technologies, Inc. All rights reserved. See COPYING file |
| """ |
| Test module for Pyverbs' privileged context. |
| """ |
| import unittest |
| import errno |
| |
| from pyverbs.providers.mlx5.mlx5dv import Mlx5DevxObj |
| from pyverbs.pyverbs_error import PyverbsRDMAError |
| from tests.mlx5_base import Mlx5RcResources, Mlx5PrivilegedRC |
| from tests.utils import requires_root |
| from tests.base import RDMATestCase |
| import tests.utils as u |
| |
| |
| class Mlx5RdmaCtrl(Mlx5PrivilegedRC): |
| def __init__(self, dev_name, ib_port, gid_index, msg_size=1024, **kwargs): |
| """ |
| Initialize mlx5 DV privileged context resources based on Mlx5PrivilegedRC. |
| :param dev_name: Device name to be used |
| :param ib_port: IB port of the device to use |
| :param gid_index: Which GID index to use |
| :param msg_size: The resource msg size |
| :param kwargs: General arguments |
| """ |
| self.rdma_ctrl_obj = None |
| super().__init__(dev_name, ib_port, gid_index, msg_size=msg_size, **kwargs) |
| |
| def get_vhca_id(self): |
| from tests.mlx5_prm_structs import QueryHcaCapIn, QueryCmdHcaCapOut |
| try: |
| query_cap_in = QueryHcaCapIn(op_mod=0x1) |
| query_cap_out = QueryCmdHcaCapOut(self.ctx.devx_general_cmd( |
| query_cap_in, len(QueryCmdHcaCapOut()))) |
| |
| if query_cap_out.status: |
| raise PyverbsRDMAError('Failed to query general HCA CAPs with syndrome ' |
| f'({query_cap_out.syndrome}') |
| |
| except PyverbsRDMAError as ex: |
| if ex.error_code in [errno.EOPNOTSUPP, errno.EPROTONOSUPPORT]: |
| raise unittest.SkipTest(f'mlx5dv_query_port() isn\'t supported') |
| raise ex |
| |
| return query_cap_out.capability.vhca_id |
| |
| def create_rdma_ctrl_obj(self, vhca_id): |
| """ |
| Create rdma ctrl obj. |
| :param vhca_id: vhca id to control on. |
| """ |
| from tests.mlx5_prm_structs import CreateGeneralObjIn, GeneralObjInCmdHdr, \ |
| CreateGeneralObjOut, RdmaCtrlObj, DevxOps, DevxGeneralObjTypes |
| rdma_ctrl_obj_in = CreateGeneralObjIn(general_obj_in_cmd_hdr=GeneralObjInCmdHdr( |
| opcode=DevxOps.MLX5_CMD_OP_CREATE_GENERAL_OBJECT, |
| obj_type=DevxGeneralObjTypes.MLX5_OBJ_TYPE_RDMA_CTRL), |
| obj_context=RdmaCtrlObj(other_vhca_id=vhca_id)) |
| self.rdma_ctrl_obj = Mlx5DevxObj(self.ctx, rdma_ctrl_obj_in, len(CreateGeneralObjOut())) |
| rdma_ctrl_obj_out = CreateGeneralObjOut(self.rdma_ctrl_obj.out_view) |
| |
| if rdma_ctrl_obj_out.general_obj_out_cmd_hdr.status: |
| raise PyverbsRDMAError(f'Failed to create rdma ctrl obj with syndrome \ |
| {rdma_ctrl_obj_out.general_obj_out_cmd_hdr.syndrome}') |
| |
| |
| class PrivilegeContextTestCase(RDMATestCase): |
| def tearDown(self): |
| """ |
| Cleans up resources if manual cleanup is needed. |
| """ |
| if self.client and self.client.rdma_ctrl_obj: |
| self.client.rdma_ctrl_obj.close() |
| super().tearDown() |
| |
| @u.skip_unsupported |
| @requires_root() |
| def test_mlx5_rdma_ctrl_obj_traffic(self): |
| """ |
| This test case verifies the functionality of Privilege RC traffic by executing the following |
| steps: |
| 1. Initialize the client with Privilege RC context and server with regular RC context. |
| 2. Get the VHCA ID of the client. |
| 3. Create the RDMA control object on the client side (on privilege context). |
| 4. Run the traffic between client and server. |
| """ |
| self.client = Mlx5RdmaCtrl(**self.dev_info) |
| self.server = Mlx5RcResources(**self.dev_info) |
| vhca_id = self.client.get_vhca_id() |
| self.client.create_rdma_ctrl_obj(vhca_id) |
| self.pre_run() |
| self.sync_remote_attr() |
| u.traffic(client=self.client, server=self.server,iters=self.iters, |
| gid_idx=self.gid_index, port=self.ib_port, is_cq_ex=True) |