Example #1
0
def post_send_ex(agr_obj, send_object, gid_index, port, send_op=None):
    qp_type = agr_obj.qp.qp_type
    agr_obj.qp.wr_start()
    agr_obj.qp.wr_id = 0x123
    agr_obj.qp.wr_flags = e.IBV_SEND_SIGNALED
    if send_op == e.IBV_QP_EX_WITH_SEND:
        agr_obj.qp.wr_send()
    elif send_op == e.IBV_QP_EX_WITH_RDMA_WRITE:
        agr_obj.qp.wr_rdma_write(agr_obj.rkey, agr_obj.raddr)
    elif send_op == e.IBV_QP_EX_WITH_SEND_WITH_IMM:
        agr_obj.qp.wr_send_imm(IMM_DATA)
    elif send_op == e.IBV_QP_EX_WITH_RDMA_WRITE_WITH_IMM:
        agr_obj.qp.wr_rdma_write_imm(agr_obj.rkey, agr_obj.raddr, IMM_DATA)
    elif send_op == e.IBV_QP_EX_WITH_RDMA_READ:
        agr_obj.qp.wr_rdma_read(agr_obj.rkey, agr_obj.raddr)
    elif send_op == e.IBV_QP_EX_WITH_ATOMIC_CMP_AND_SWP:
        # We're checking the returned value (remote's content), so cmp/swp
        # values are of no importance.
        agr_obj.qp.wr_atomic_cmp_swp(agr_obj.rkey, agr_obj.raddr, 42, 43)
    elif send_op == e.IBV_QP_EX_WITH_ATOMIC_FETCH_AND_ADD:
        agr_obj.qp.wr_atomic_fetch_add(agr_obj.rkey, agr_obj.raddr, 1)
    elif send_op == e.IBV_QP_EX_WITH_BIND_MW:
        bind_info = MWBindInfo(agr_obj.mr, agr_obj.mr.buf, agr_obj.mr.rkey,
                               e.IBV_ACCESS_REMOTE_WRITE)
        mw = MW(agr_obj.pd, mw_type=e.IBV_MW_TYPE_2)
        # A new rkey is needed to be set into bind_info, modify rkey
        agr_obj.qp.wr_bind_mw(mw, agr_obj.mr.rkey + 12, bind_info)
        agr_obj.qp.wr_send()
    if qp_type == e.IBV_QPT_UD:
        ah = get_global_ah(agr_obj, gid_index, port)
        agr_obj.qp.wr_set_ud_addr(ah, agr_obj.rqpn, agr_obj.UD_QKEY)
    if qp_type == e.IBV_QPT_XRC_SEND:
        agr_obj.qp.wr_set_xrc_srqn(agr_obj.remote_srqn)
    agr_obj.qp.wr_set_sge(send_object)
    agr_obj.qp.wr_complete()
Example #2
0
 def test_dereg_mw_type2(self):
     """
     Test ibv_dealloc_mw() for type 2 MW
     """
     for ctx, attr, attr_ex in self.devices:
         with PD(ctx) as pd:
             with MW(pd, e.IBV_MW_TYPE_2) as mw:
                 mw.close()
Example #3
0
 def test_reg_mw_type2(self):
     """
     Test ibv_alloc_mw() for type 2 MW
     """
     for ctx, attr, attr_ex in self.devices:
         with PD(ctx) as pd:
             with MW(pd, e.IBV_MW_TYPE_2):
                 pass
Example #4
0
 def test_dereg_mw(self):
     """ Test ibv_dealloc_mw() """
     lst = d.get_device_list()
     for dev in lst:
         with d.Context(name=dev.name.decode()) as ctx:
             with PD(ctx) as pd:
                 with MW(pd,
                         random.choice([e.IBV_MW_TYPE_1,
                                        e.IBV_MW_TYPE_2])) as mw:
                     mw.close()
Example #5
0
 def test_reg_mw_wrong_type(self):
     """ Test ibv_alloc_mw() """
     for ctx, attr, attr_ex in self.devices:
         with PD(ctx) as pd:
             try:
                 mw_type = random.randint(3, 100)
                 MW(pd, mw_type)
             except PyverbsRDMAError:
                 pass
             else:
                 raise PyverbsError('Created a MW with type {t}'.\
                                    format(t=mw_type))
Example #6
0
 def test_reg_mw_wrong_type(self):
     """ Test ibv_alloc_mw() """
     lst = d.get_device_list()
     for dev in lst:
         with d.Context(name=dev.name.decode()) as ctx:
             with PD(ctx) as pd:
                 try:
                     mw_type = random.randint(3, 100)
                     mw = MW(pd, mw_type)
                 except PyverbsRDMAError as e:
                     pass
                 else:
                     raise PyverbsError('Created a MW with type {t}'.\
                                        format(t=mw_type))
Example #7
0
 def test_reg_mw_wrong_type(self):
     """
     Verify that trying to create a MW of a wrong type fails
     """
     for ctx, attr, attr_ex in self.devices:
         with PD(ctx) as pd:
             try:
                 mw_type = random.randint(3, 100)
                 MW(pd, mw_type)
             except PyverbsRDMAError:
                 pass
             else:
                 raise PyverbsError('Created a MW with type {t}'.\
                                    format(t=mw_type))
Example #8
0
 def test_dereg_mw_type2(self):
     """
     Test ibv_dealloc_mw() for type 2 MW
     """
     for ctx, attr, attr_ex in self.devices:
         with PD(ctx) as pd:
             try:
                 with MW(pd, e.IBV_MW_TYPE_2) as mw:
                     mw.close()
             except PyverbsRDMAError as ex:
                 if ex.error_code == errno.EOPNOTSUPP:
                     raise unittest.SkipTest(
                         'Create memory window of type 2 is not supported')
                 raise ex
Example #9
0
 def test_reg_mw_wrong_type(self):
     """
     Verify that trying to create a MW of a wrong type fails
     """
     with d.Context(name=self.dev_name) as ctx:
         with PD(ctx) as pd:
             try:
                 mw_type = 3
                 MW(pd, mw_type)
             except PyverbsRDMAError as ex:
                 if ex.error_code == errno.EOPNOTSUPP:
                     raise unittest.SkipTest('Create memory window of type {} is not supported'.format(mw_type))
             else:
                 raise PyverbsError('Created a MW with type {t}'.\
                                    format(t=mw_type))
Example #10
0
 def test_reg_mw_wrong_type(self):
     """
     Verify that trying to create a MW of a wrong type fails
     """
     for ctx, attr, attr_ex in self.devices:
         with PD(ctx) as pd:
             try:
                 mw_type = random.randint(3, 100)
                 MW(pd, mw_type)
             except PyverbsRDMAError as ex:
                 if ex.error_code == errno.EOPNOTSUPP:
                     raise unittest.SkipTest(
                         'Create memory window of type {} is not supported'.
                         format(mw_type))
             else:
                 raise PyverbsError('Created a MW with type {t}'.\
                                    format(t=mw_type))
Example #11
0
def post_send_ex(agr_obj, send_object, send_op=None, qp_idx=0, ah=None):
    qp = agr_obj.qps[qp_idx]
    qp_type = qp.qp_type
    qp.wr_start()
    qp.wr_id = 0x123
    qp.wr_flags = e.IBV_SEND_SIGNALED
    if send_op == e.IBV_QP_EX_WITH_SEND:
        qp.wr_send()
    elif send_op == e.IBV_QP_EX_WITH_RDMA_WRITE:
        qp.wr_rdma_write(agr_obj.rkey, agr_obj.raddr)
    elif send_op == e.IBV_QP_EX_WITH_SEND_WITH_IMM:
        qp.wr_send_imm(IMM_DATA)
    elif send_op == e.IBV_QP_EX_WITH_RDMA_WRITE_WITH_IMM:
        qp.wr_rdma_write_imm(agr_obj.rkey, agr_obj.raddr, IMM_DATA)
    elif send_op == e.IBV_QP_EX_WITH_RDMA_READ:
        qp.wr_rdma_read(agr_obj.rkey, agr_obj.raddr)
    elif send_op == e.IBV_QP_EX_WITH_ATOMIC_CMP_AND_SWP:
        # We're checking the returned value (remote's content), so cmp/swp
        # values are of no importance.
        qp.wr_atomic_cmp_swp(agr_obj.rkey, agr_obj.raddr, 42, 43)
    elif send_op == e.IBV_QP_EX_WITH_ATOMIC_FETCH_AND_ADD:
        qp.wr_atomic_fetch_add(agr_obj.rkey, agr_obj.raddr, 1)
    elif send_op == e.IBV_QP_EX_WITH_BIND_MW:
        bind_info = MWBindInfo(agr_obj.mr, agr_obj.mr.buf, agr_obj.mr.rkey,
                               e.IBV_ACCESS_REMOTE_WRITE)
        mw = MW(agr_obj.pd, mw_type=e.IBV_MW_TYPE_2)
        # A new rkey is needed to be set into bind_info, modify rkey
        qp.wr_bind_mw(mw, agr_obj.mr.rkey + 12, bind_info)
        qp.wr_send()
    if qp_type == e.IBV_QPT_UD:
        qp.wr_set_ud_addr(ah, agr_obj.rqps_num[qp_idx], agr_obj.UD_QKEY)
    if isinstance(agr_obj, SRDResources):
        qp.wr_set_ud_addr(ah, agr_obj.rqps_num[qp_idx], agr_obj.SRD_QKEY)
    if qp_type == e.IBV_QPT_XRC_SEND:
        qp.wr_set_xrc_srqn(agr_obj.remote_srqn)
    if hasattr(agr_obj, 'remote_dct_num'):
        if isinstance(agr_obj, Mlx5DcStreamsRes):
            stream_id = agr_obj.generate_stream_id(qp_idx)
            agr_obj.check_bad_flow(qp_idx)
            qp.wr_set_dc_addr_stream(ah, agr_obj.remote_dct_num, DCT_KEY,
                                     stream_id)
        else:
            qp.wr_set_dc_addr(ah, agr_obj.remote_dct_num, DCT_KEY)
    qp.wr_set_sge(send_object)
    qp.wr_complete()
Example #12
0
 def test_qp_ex_rc_bind_mw(self):
     """
     Verify bind memory window operation using the new post_send API.
     Instead of checking through regular pingpong style traffic, we'll
     do as follows:
     - Register an MR with remote write access
     - Bind a MW without remote write permission to the MR
     - Verify that remote write fails
     Since it's a unique flow, it's an integral part of that test rather
     than a utility method.
     """
     client, server = self.create_players('rc_bind_mw')
     client_sge = u.get_send_elements(client, False)[1]
     # Create a MW and bind it
     server.qp.wr_start()
     server.qp.wr_id = 0x123
     server.qp.wr_flags = e.IBV_SEND_SIGNALED
     bind_info = MWBindInfo(server.mr, server.mr.buf, server.mr.length,
                            e.IBV_ACCESS_LOCAL_WRITE)
     try:
         mw = MW(server.pd, mw_type=e.IBV_MW_TYPE_2)
     except PyverbsRDMAError as ex:
         if ex.error_code == errno.EOPNOTSUPP:
             raise unittest.SkipTest(
                 'Memory Window allocation is not supported')
         raise ex
     new_key = inc_rkey(server.mr.rkey)
     server.qp.wr_bind_mw(mw, new_key, bind_info)
     server.qp.wr_complete()
     u.poll_cq(server.cq)
     # Verify that remote write fails
     client.qp.wr_start()
     client.qp.wr_id = 0x124
     client.qp.wr_flags = e.IBV_SEND_SIGNALED
     client.qp.wr_rdma_write(new_key, server.mr.buf)
     client.qp.wr_set_sge(client_sge)
     client.qp.wr_complete()
     try:
         u.poll_cq(client.cq)
     except PyverbsRDMAError as ex:
         if ex.error_code != e.IBV_WC_REM_ACCESS_ERR:
             raise ex
Example #13
0
 def __init__(self, dev_name, ib_port, gid_index, mw_type):
     """
     Initialize Memory Window resources based on RC resources that include RC
     QP.
     :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 mw_type: The MW type to use
     """
     super().__init__(dev_name=dev_name, ib_port=ib_port,
                                gid_index=gid_index)
     self.mw_type = mw_type
     access = e.IBV_ACCESS_REMOTE_WRITE | e.IBV_ACCESS_LOCAL_WRITE
     self.mw_bind_info = MWBindInfo(self.mr, self.mr.buf, self.msg_size,
                                    access)
     self.mw_bind = MWBind(self.mw_bind_info, e.IBV_SEND_SIGNALED)
     try:
         self.mw = MW(self.pd, self.mw_type)
     except PyverbsRDMAError as ex:
         if ex.error_code == errno.EOPNOTSUPP:
             raise unittest.SkipTest('Create MW is not supported')
         raise ex