Skip to content

Commit 7fd5f60

Browse files
dkkranzmrgolin
authored andcommitted
tests: Add read SGID test on EFA DV CQ
Run a simple traffic test using EfaCQRes class, in order to read SGID from receive work completion. Signed-off-by: Daniel Kranzdorf <[email protected]>
1 parent 18f83bd commit 7fd5f60

File tree

3 files changed

+83
-4
lines changed

3 files changed

+83
-4
lines changed

tests/efa_base.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
# SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB)
2-
# Copyright 2020 Amazon.com, Inc. or its affiliates. All rights reserved.
2+
# Copyright 2020-2022 Amazon.com, Inc. or its affiliates. All rights reserved.
33

44
import unittest
55
import random
66
import errno
77

88
from pyverbs.pyverbs_error import PyverbsRDMAError
9+
from pyverbs.cq import CqInitAttrEx
910
from pyverbs.qp import QPAttr, QPCap, QPInitAttrEx
1011
import pyverbs.providers.efa.efa_enums as efa_e
1112
import pyverbs.providers.efa.efadv as efa
@@ -96,3 +97,35 @@ def create_mr(self):
9697
self.mr = tests.utils.create_custom_mr(self, e.IBV_ACCESS_REMOTE_READ)
9798
else:
9899
self.mr = tests.utils.create_custom_mr(self)
100+
101+
102+
class EfaCQRes(SRDResources):
103+
def __init__(self, dev_name, ib_port, gid_index, send_ops_flags,
104+
qp_count=1, requested_dev_cap=None, wc_flags=None):
105+
"""
106+
Initialize EFA DV CQ based on SRD resources.
107+
:param requested_dev_cap: A necessary device cap. If it's not supported
108+
by the device, the test will be skipped.
109+
:param wc_flags: WC flags for EFA DV CQ.
110+
"""
111+
self.requested_dev_cap = requested_dev_cap
112+
self.efa_wc_flags = wc_flags
113+
super().__init__(dev_name, ib_port, gid_index, send_ops_flags, qp_count=qp_count)
114+
115+
def create_context(self):
116+
super().create_context()
117+
if self.requested_dev_cap:
118+
with efa.EfaContext(name=self.ctx.name) as efa_ctx:
119+
if not efa_ctx.query_efa_device().device_caps & self.requested_dev_cap:
120+
miss_caps = efa.dev_cap_to_str(self.requested_dev_cap)
121+
raise unittest.SkipTest(f'Device caps doesn\'t support {miss_caps}')
122+
123+
def create_cq(self):
124+
cia = CqInitAttrEx(wc_flags=e.IBV_WC_STANDARD_FLAGS)
125+
efa_cia = efa.EfaDVCQInitAttr(self.efa_wc_flags)
126+
try:
127+
self.cq = efa.EfaCQ(self.ctx, cia, efa_cia)
128+
except PyverbsRDMAError as ex:
129+
if ex.error_code == errno.EOPNOTSUPP:
130+
raise unittest.SkipTest('Create EFA DV CQ is not supported')
131+
raise ex

tests/test_efadv.py

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB)
2-
# Copyright 2020 Amazon.com, Inc. or its affiliates. All rights reserved.
2+
# Copyright 2020-2022 Amazon.com, Inc. or its affiliates. All rights reserved.
33
"""
44
Test module for efa direct-verbs.
55
"""
@@ -17,7 +17,7 @@
1717
import pyverbs.enums as e
1818
from pyverbs.pd import PD
1919

20-
from tests.efa_base import EfaAPITestCase
20+
from tests.efa_base import EfaAPITestCase, EfaRDMATestCase, EfaCQRes
2121
import tests.utils as u
2222

2323

@@ -125,3 +125,38 @@ def get_qp_init_attr_ex(cq, pd, attr):
125125
qia.recv_cq = cq
126126
qia.pd = pd
127127
return qia
128+
129+
130+
class EfaCqTest(EfaRDMATestCase):
131+
def setUp(self):
132+
super().setUp()
133+
self.iters = 100
134+
self.server = None
135+
self.client = None
136+
137+
def create_players(self, dev_cap, wc_flags, send_ops_flags, qp_count=8):
138+
try:
139+
self.client = EfaCQRes(self.dev_name, self.ib_port, self.gid_index, send_ops_flags, qp_count,
140+
dev_cap, wc_flags)
141+
self.server = EfaCQRes(self.dev_name, self.ib_port, self.gid_index, send_ops_flags, qp_count,
142+
dev_cap, wc_flags)
143+
except PyverbsRDMAError as ex:
144+
if ex.error_code == errno.EOPNOTSUPP:
145+
raise unittest.SkipTest('Create EfaCQ Resources is not supported')
146+
raise ex
147+
self.client.pre_run(self.server.psns, self.server.qps_num)
148+
self.server.pre_run(self.client.psns, self.client.qps_num)
149+
self.server.remote_gid = self.client.ctx.query_gid(self.client.ib_port, self.client.gid_index)
150+
151+
def test_dv_cq_ex_with_sgid(self):
152+
send_op = e.IBV_QP_EX_WITH_SEND
153+
wc_flag = efa_e.EFADV_WC_EX_WITH_SGID
154+
dev_cap = efa_e.EFADV_DEVICE_ATTR_CAPS_CQ_WITH_SGID
155+
self.create_players(dev_cap, wc_flag, send_op, qp_count=1)
156+
recv_wr = u.get_recv_wr(self.server)
157+
self.server.qps[0].post_recv(recv_wr)
158+
ah_client = u.get_global_ah(self.client, self.gid_index, self.ib_port)
159+
_ , sg = u.get_send_elements(self.client, False)
160+
u.send(self.client, sg, send_op, new_send=True, qp_idx=0, ah=ah_client)
161+
u.poll_cq_ex(self.client.cq)
162+
u.poll_cq_ex(self.server.cq, sgid=self.server.remote_gid)

tests/utils.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from pyverbs.addr import AHAttr, AH, GlobalRoute
2121
from tests.base import XRCResources, DCT_KEY
2222
from tests.efa_base import SRDResources
23+
from pyverbs.providers.efa.efadv import EfaCQ
2324
from pyverbs.wr import SGE, SendWR, RecvWR
2425
from pyverbs.qp import QPCap, QPInitAttr, QPInitAttrEx, QPAttr, QPEx, QP
2526
from tests.mlx5_base import Mlx5DcResources, Mlx5DcStreamsRes
@@ -572,13 +573,15 @@ def poll_cq(cq, count=1, data=None):
572573
return wcs
573574

574575

575-
def poll_cq_ex(cqex, count=1, data=None):
576+
def poll_cq_ex(cqex, count=1, data=None, sgid=None):
576577
"""
577578
Poll <count> completions from the extended CQ.
578579
:param cq: CQEX to poll from
579580
:param count: How many completions to poll
580581
:param data: In case of a work request with immediate, the immediate data
581582
to be compared after poll
583+
:param sgid: In case of EFA receive completion, the sgid to be compared
584+
after poll
582585
:return: None
583586
"""
584587
try:
@@ -595,6 +598,10 @@ def poll_cq_ex(cqex, count=1, data=None):
595598
format(s=cqex.status))
596599
if data:
597600
assert data == socket.ntohl(cqex.read_imm_data())
601+
602+
if isinstance(cqex, EfaCQ):
603+
if sgid is not None and cqex.read_opcode() == e.IBV_WC_RECV:
604+
assert sgid.gid == cqex.read_sgid().gid
598605
# Now poll the rest of the packets
599606
while count > 0 and (time.perf_counter() - start_poll_t < POLL_CQ_TIMEOUT):
600607
ret = cqex.poll_next()
@@ -608,6 +615,10 @@ def poll_cq_ex(cqex, count=1, data=None):
608615
format(s=cqex.status))
609616
if data:
610617
assert data == socket.ntohl(cqex.read_imm_data())
618+
619+
if isinstance(cqex, EfaCQ):
620+
if sgid is not None and cqex.read_opcode() == e.IBV_WC_RECV:
621+
assert sgid.gid == cqex.read_sgid().gid
611622
count -= 1
612623
if count > 0:
613624
raise PyverbsError(f'Got timeout on polling ({count} CQEs remaining)')

0 commit comments

Comments
 (0)