blob: 827c2c23aac7393c039bdfec6f8c5ab1014fe27f [file] [log] [blame]
# SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB)
# Copyright 2020-2023 Amazon.com, Inc. or its affiliates. All rights reserved.
import unittest
import errno
from pyverbs.cq import CQ, CompChannel
from pyverbs.pyverbs_error import PyverbsRDMAError
from pyverbs.libibverbs_enums import ibv_qp_create_send_ops_flags, ibv_wr_opcode, ibv_qp_attr_mask
from tests.efa_base import EfaRDMATestCase
from tests.efa_base import SRDResources
import tests.utils as u
class CqEventsSRD(SRDResources):
def __init__(self, dev_name, ib_port, gid_index):
super().__init__(dev_name, ib_port, gid_index, ibv_qp_create_send_ops_flags.IBV_QP_EX_WITH_SEND)
def create_cq(self):
self.comp_channel = CompChannel(self.ctx)
self.cq = CQ(self.ctx, self.num_msgs, None, self.comp_channel)
self.cq.req_notify()
class CqEventsSRDTestCase(EfaRDMATestCase):
def setUp(self):
super().setUp()
self.iters = 100
def test_cq_events_srd(self):
for use_new_send in [False, True]:
with self.subTest():
super().create_players(CqEventsSRD)
u.traffic(**self.traffic_args, new_send=use_new_send)
class QPSRDTestCase(EfaRDMATestCase):
def setUp(self):
super().setUp()
self.iters = 100
self.server = None
self.client = None
def create_players(self, send_ops_flags=0, qp_count=8):
super().create_players(SRDResources, send_ops_flags=send_ops_flags, qp_count=qp_count)
def full_sq_bad_flow(self):
"""
Check post_send while qp's sq is full.
- Find qp's sq length
- Fill the qp with work requests until overflow
"""
qp_idx = 0
send_op = ibv_wr_opcode.IBV_WR_SEND
ah = u.get_global_ah(self.client, self.gid_index, self.ib_port)
qp_attr, _ = self.client.qps[qp_idx].query(ibv_qp_attr_mask.IBV_QP_CAP)
max_send_wr = qp_attr.cap.max_send_wr
with self.assertRaises(PyverbsRDMAError) as ex:
for _ in range (max_send_wr + 1):
_, c_sg = u.get_send_elements(self.client, False)
u.send(self.client, c_sg, send_op, new_send=True, qp_idx=qp_idx, ah=ah)
self.assertEqual(ex.exception.error_code, errno.ENOMEM)
def test_qp_ex_srd_send(self):
self.create_players(ibv_qp_create_send_ops_flags.IBV_QP_EX_WITH_SEND)
u.traffic(**self.traffic_args, new_send=True, send_op=ibv_wr_opcode.IBV_WR_SEND)
def test_qp_ex_srd_send_imm(self):
self.create_players(ibv_qp_create_send_ops_flags.IBV_QP_EX_WITH_SEND_WITH_IMM)
u.traffic(**self.traffic_args, new_send=True, send_op=ibv_wr_opcode.IBV_WR_SEND_WITH_IMM)
def test_qp_ex_srd_rdma_read(self):
self.create_players(ibv_qp_create_send_ops_flags.IBV_QP_EX_WITH_RDMA_READ)
self.server.mr.write('s' * self.server.msg_size, self.server.msg_size)
u.rdma_traffic(**self.traffic_args, new_send=True, send_op=ibv_wr_opcode.IBV_WR_RDMA_READ)
def test_qp_ex_srd_rdma_write(self):
self.create_players(ibv_qp_create_send_ops_flags.IBV_QP_EX_WITH_RDMA_WRITE)
u.rdma_traffic(**self.traffic_args, new_send=True, send_op=ibv_wr_opcode.IBV_WR_RDMA_WRITE)
def test_qp_ex_srd_rdma_write_with_imm(self):
self.create_players(ibv_qp_create_send_ops_flags.IBV_QP_EX_WITH_RDMA_WRITE_WITH_IMM)
u.traffic(**self.traffic_args, new_send=True, send_op=ibv_wr_opcode.IBV_WR_RDMA_WRITE_WITH_IMM)
def test_qp_ex_srd_old_send(self):
self.create_players()
u.traffic(**self.traffic_args, new_send=False)
def test_qp_ex_srd_old_send_imm(self):
self.create_players()
u.traffic(**self.traffic_args, new_send=False, send_op=ibv_wr_opcode.IBV_WR_SEND_WITH_IMM)
def test_qp_ex_srd_zero_size(self):
self.create_players(ibv_qp_create_send_ops_flags.IBV_QP_EX_WITH_SEND)
self.client.msg_size = 0
self.server.msg_size = 0
u.traffic(**self.traffic_args, new_send=True, send_op=ibv_wr_opcode.IBV_WR_SEND)
def test_post_receive_qp_state_bad_flow(self):
self.create_players(ibv_qp_create_send_ops_flags.IBV_QP_EX_WITH_SEND, qp_count=1)
u.post_rq_state_bad_flow(self)
def test_post_send_qp_state_bad_flow(self):
self.create_players(ibv_qp_create_send_ops_flags.IBV_QP_EX_WITH_SEND, qp_count=1)
u.post_sq_state_bad_flow(self)
def test_full_rq_bad_flow(self):
self.create_players(ibv_qp_create_send_ops_flags.IBV_QP_EX_WITH_SEND, qp_count=1)
u.full_rq_bad_flow(self)
def test_full_sq_bad_flow(self):
self.create_players(ibv_qp_create_send_ops_flags.IBV_QP_EX_WITH_SEND, qp_count=1)
self.full_sq_bad_flow()
def test_rq_with_larger_sgl_bad_flow(self):
self.create_players(ibv_qp_create_send_ops_flags.IBV_QP_EX_WITH_SEND, qp_count=1)
u.create_rq_with_larger_sgl_bad_flow(self)