blob: c4e7a041a7b27db26985020cf7cd77d8ea854cd9 [file] [log] [blame]
Artemy Kovalyov23e89242017-06-14 12:53:37 +00001/**
2 * Copyright (C) 2017 Mellanox Technologies Ltd. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the copyright holder nor the names of its
14 * contributors may be used to endorse or promote products derived from
15 * this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
23 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29#ifdef HAVE_CONFIG_H
30#include "config.h"
31#endif
32
Artemy Kovalyov36eea222017-10-04 01:27:27 +030033#define __STDC_LIMIT_MACROS
Artemy Kovalyov23e89242017-06-14 12:53:37 +000034#include <inttypes.h>
35#include <signal.h>
36#include <stdint.h>
37#include <stdio.h>
38#include <stdlib.h>
39#include <string.h>
40#include <sys/mman.h>
41#include <sys/time.h>
42#include <sys/types.h>
43#include <unistd.h>
44
45#include <infiniband/verbs_exp.h>
46
47#include "env.h"
48
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +030049#if 1
50#define BBB 16
51#else
52#define BBB 1
53#endif
54
55#define SZ (512*BBB)
Sergey Gorenko08fd5f32018-11-23 12:28:18 +000056#define SZD(pi_size) ((512+pi_size)*BBB)
Artemy Kovalyov23e89242017-06-14 12:53:37 +000057
Artemy Kovalyov179ad632018-04-28 20:12:16 +000058#define SZ_p(n) (512*((n)%BBB+1))
59#define SZ_pp(n,from,spare) (from+512*((n)%(BBB-spare-from/512)+1))
60
Artemy Kovalyov23e89242017-06-14 12:53:37 +000061struct ibvt_qp_sig : public ibvt_qp_rc {
62 ibvt_qp_sig(ibvt_env &e, ibvt_pd &p, ibvt_cq &c) :
63 ibvt_qp_rc(e, p, c) {}
64
65 virtual void init_attr(struct ibv_qp_init_attr_ex &attr) {
66 ibvt_qp_rc::init_attr(attr);
67 attr.comp_mask |= IBV_EXP_QP_INIT_ATTR_CREATE_FLAGS;
68 attr.exp_create_flags |= IBV_EXP_QP_CREATE_SIGNATURE_EN;
Artemy Kovalyov179ad632018-04-28 20:12:16 +000069 attr.cap.max_send_wr = 0x355;
70 attr.exp_create_flags |= IBV_EXP_QP_CREATE_UMR;
71 attr.comp_mask |= IBV_EXP_QP_INIT_ATTR_MAX_INL_KLMS;
72 attr.max_inl_send_klms = 3;
Artemy Kovalyov23e89242017-06-14 12:53:37 +000073 }
Artemy Kovalyovaa83aa62017-07-15 12:38:36 +030074
75 virtual void send_2wr(ibv_sge sge, ibv_sge sge2) {
76 struct ibv_send_wr wr = {};
77 struct ibv_send_wr wr2 = {};
78 struct ibv_send_wr *bad_wr = NULL;
79
80 wr.next = &wr2;
81 wr.sg_list = &sge;
82 wr.num_sge = 1;
83 wr._wr_opcode = IBV_WR_SEND;
84
85 wr2.sg_list = &sge2;
86 wr2.num_sge = 1;
87 wr2._wr_opcode = IBV_WR_SEND;
88 wr2._wr_send_flags = IBV_EXP_SEND_SIGNALED |
89 IBV_EXP_SEND_SIG_PIPELINED;
90
91 DO(ibv_post_send(qp, &wr, &bad_wr));
92 }
Artemy Kovalyov179ad632018-04-28 20:12:16 +000093
94 virtual void send_2wr_m(ibv_sge sge[], int sge_n, ibv_sge sge2) {
95 struct ibv_send_wr wr = {};
96 struct ibv_send_wr wr2 = {};
97 struct ibv_send_wr *bad_wr = NULL;
98
99 wr.next = &wr2;
100 wr.sg_list = sge;
101 wr.num_sge = sge_n;
102 wr._wr_opcode = IBV_WR_SEND;
103
104 wr2.sg_list = &sge2;
105 wr2.num_sge = 1;
106 wr2._wr_opcode = IBV_WR_SEND;
107 wr2._wr_send_flags = IBV_EXP_SEND_SIGNALED |
108 IBV_EXP_SEND_SIG_PIPELINED;
109
110 DO(ibv_post_send(qp, &wr, &bad_wr));
111 }
Artemy Kovalyovaa83aa62017-07-15 12:38:36 +0300112};
113
114struct ibvt_qp_sig_pipeline : public ibvt_qp_sig {
115 ibvt_qp_sig_pipeline(ibvt_env &e, ibvt_pd &p, ibvt_cq &c) :
116 ibvt_qp_sig(e, p, c) {}
117
118 virtual void init_attr(struct ibv_qp_init_attr_ex &attr) {
119 ibvt_qp_sig::init_attr(attr);
120 attr.exp_create_flags |= IBV_EXP_QP_CREATE_SIGNATURE_PIPELINE;
121 }
122
Artemy Kovalyov23e89242017-06-14 12:53:37 +0000123};
124
125struct ibvt_mr_sig : public ibvt_mr {
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300126 ibvt_mr_sig(ibvt_env &e, ibvt_pd &p) :
127 ibvt_mr(e, p, 0) {}
Artemy Kovalyov23e89242017-06-14 12:53:37 +0000128
129 virtual void init() {
130 struct ibv_exp_create_mr_in in = {};
131 if (mr)
132 return;
133
134 in.pd = pd.pd;
135 in.attr.max_klm_list_size = 1;
136 in.attr.create_flags = IBV_EXP_MR_SIGNATURE_EN;
Artemy Kovalyovaa83aa62017-07-15 12:38:36 +0300137 in.attr.exp_access_flags = IBV_ACCESS_LOCAL_WRITE |
138 IBV_ACCESS_REMOTE_READ |
139 IBV_ACCESS_REMOTE_WRITE;
Artemy Kovalyov23e89242017-06-14 12:53:37 +0000140 SET(mr, ibv_exp_create_mr(&in));
141 }
142};
143
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000144struct sig_domain {
145 virtual struct ibv_exp_sig_domain nosig() {
146 struct ibv_exp_sig_domain sd = {};
147
148 sd.sig_type = IBV_EXP_SIG_TYPE_NONE;
149
150 return sd;
151 }
152
153 virtual struct ibv_exp_sig_domain sig() = 0;
154 virtual uint16_t check_mask() = 0;
155};
156
157struct sig_t10dif : public sig_domain {
158 static unsigned pi_size() {
159 return 8;
160 }
161
162 enum {
163 CHECK_REF_TAG = 0x0f,
164 CHECK_APP_TAG = 0x30,
165 CHECK_GUARD = 0xc0,
166 };
167
168 virtual uint16_t check_mask() {
169 return CHECK_APP_TAG | CHECK_GUARD;
170 }
171
172 virtual struct ibv_exp_sig_domain sig() {
173 struct ibv_exp_sig_domain sd = {};
174
175 sd.sig_type = IBV_EXP_SIG_TYPE_T10_DIF;
176 sd.sig.dif.bg_type = IBV_EXP_T10DIF_CRC;
177 sd.sig.dif.pi_interval = 512;
178 sd.sig.dif.bg = 0x1234;
179 sd.sig.dif.app_tag = 0x5678;
180 sd.sig.dif.ref_tag = 0xabcdef90;
181 sd.sig.dif.ref_remap = 1;
182 sd.sig.dif.app_escape = 1;
183 sd.sig.dif.ref_escape = 1;
184 sd.sig.dif.apptag_check_mask = 0xffff;
185
186 return sd;
187 }
188};
189
190struct sig_crc32 : public sig_domain {
191 static unsigned pi_size() {
192 return 4;
193 }
194
195 enum {
196 CHECK_GUARD = 0xff,
197 };
198
199 virtual uint16_t check_mask() {
200 return CHECK_GUARD;
201 }
202
203 virtual struct ibv_exp_sig_domain sig() {
204 struct ibv_exp_sig_domain sd = {};
205
206 sd.sig_type = IBV_EXP_SIG_TYPE_CRC32;
207 sd.sig.crc.pi_interval = 512;
208 sd.sig.crc.bg = 0xffffffff;
209
210 return sd;
211 }
212};
213
214template <typename QP, typename SD>
215struct sig_test_base : public testing::Test, public SD, public ibvt_env {
Artemy Kovalyovaa83aa62017-07-15 12:38:36 +0300216 ibvt_ctx ctx;
217 ibvt_pd pd;
218 ibvt_cq cq;
219 QP send_qp;
220 QP recv_qp;
221 ibvt_mr src_mr;
Artemy Kovalyov921fbbe2017-08-20 02:51:49 +0300222 ibvt_mr src2_mr;
Artemy Kovalyovaa83aa62017-07-15 12:38:36 +0300223 ibvt_mr mid_mr;
224 ibvt_mr mid2_mr;
Artemy Kovalyov921fbbe2017-08-20 02:51:49 +0300225 ibvt_mr mid_mr_x2;
Artemy Kovalyovaa83aa62017-07-15 12:38:36 +0300226 ibvt_mr dst_mr;
Artemy Kovalyov921fbbe2017-08-20 02:51:49 +0300227 ibvt_mr dst_mr_x2;
Artemy Kovalyovaa83aa62017-07-15 12:38:36 +0300228 ibvt_mr_sig insert_mr;
Artemy Kovalyov921fbbe2017-08-20 02:51:49 +0300229 ibvt_mr_sig insert2_mr;
Artemy Kovalyovaa83aa62017-07-15 12:38:36 +0300230 ibvt_mr_sig check_mr;
231 ibvt_mr_sig strip_mr;
Artemy Kovalyov921fbbe2017-08-20 02:51:49 +0300232 ibvt_mr_sig strip_mr_x2;
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000233 ibvt_mw mw;
Artemy Kovalyov23e89242017-06-14 12:53:37 +0000234
Artemy Kovalyovaa83aa62017-07-15 12:38:36 +0300235 sig_test_base() :
Artemy Kovalyov23e89242017-06-14 12:53:37 +0000236 ctx(*this, NULL),
237 pd(*this, ctx),
238 cq(*this, ctx),
239 send_qp(*this, pd, cq),
240 recv_qp(*this, pd, cq),
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300241 src_mr(*this, pd, SZ),
242 src2_mr(*this, pd, SZ),
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000243 mid_mr(*this, pd, SZD(this->pi_size())),
244 mid2_mr(*this, pd, SZD(this->pi_size())),
245 mid_mr_x2(*this, pd, SZD(this->pi_size()) * 2),
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300246 dst_mr(*this, pd, SZ),
247 dst_mr_x2(*this, pd, SZ * 2),
248 insert_mr(*this, pd),
249 insert2_mr(*this, pd),
250 check_mr(*this, pd),
251 strip_mr(*this, pd),
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000252 strip_mr_x2(*this, pd),
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000253 mw(mid_mr, 0, SZD(this->pi_size()), send_qp)
Artemy Kovalyov23e89242017-06-14 12:53:37 +0000254 { }
255
Artemy Kovalyov79a00f72018-12-12 09:29:00 +0200256 virtual void config_wr(ibvt_mr &sig_mr, struct ibv_sge data,
257 struct ibv_exp_sig_domain mem,
258 struct ibv_exp_sig_domain wire) {
259 struct __cfg_wr {
260 ibv_send_wr wr;
261 ibv_exp_sig_attrs sig;
262 ibv_sge data;
263 } *wr = (__cfg_wr *)calloc(1, sizeof(*wr));
264
265 wr->sig.check_mask = this->check_mask();
266 wr->sig.mem = mem;
267 wr->sig.wire = wire;
268
269 wr->data = data;
270
271 wr->wr.exp_opcode = IBV_EXP_WR_REG_SIG_MR;
272 wr->wr.exp_send_flags = IBV_EXP_SEND_SOLICITED;
273 wr->wr.ext_op.sig_handover.sig_attrs = &wr->sig;
274 wr->wr.ext_op.sig_handover.sig_mr = sig_mr.mr;
275 wr->wr.ext_op.sig_handover.access_flags =
276 IBV_ACCESS_LOCAL_WRITE |
277 IBV_ACCESS_REMOTE_READ |
278 IBV_ACCESS_REMOTE_WRITE;
279 wr->wr.ext_op.sig_handover.prot = NULL;
280
281 wr->wr.num_sge = 1;
282 wr->wr.sg_list = &wr->data;
283
284 add_wr(&wr->wr);
285 }
286
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300287 virtual void config(ibvt_mr &sig_mr, struct ibv_sge data,
288 struct ibv_exp_sig_domain mem,
289 struct ibv_exp_sig_domain wire) {
Artemy Kovalyov79a00f72018-12-12 09:29:00 +0200290 config_wr(sig_mr, data, mem, wire);
291 EXEC(send_qp.post_all_wr());
292 }
Artemy Kovalyov23e89242017-06-14 12:53:37 +0000293
Artemy Kovalyov79a00f72018-12-12 09:29:00 +0200294 virtual void linv_wr(ibvt_mr &sig_mr, int sign = 0) {
295 struct ibv_send_wr *wr = (ibv_send_wr *)calloc(1, sizeof(*wr));
Artemy Kovalyov23e89242017-06-14 12:53:37 +0000296
Artemy Kovalyov79a00f72018-12-12 09:29:00 +0200297 wr->exp_opcode = IBV_EXP_WR_LOCAL_INV;
298 wr->exp_send_flags = IBV_EXP_SEND_SOLICITED | IBV_EXP_SEND_FENCE;
299 if (sign)
300 wr->exp_send_flags |= IBV_EXP_SEND_SIGNALED;
301 wr->ex.invalidate_rkey = sig_mr.mr->rkey;
Artemy Kovalyov23e89242017-06-14 12:53:37 +0000302
Artemy Kovalyov79a00f72018-12-12 09:29:00 +0200303 add_wr(wr);
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300304 }
305
306 virtual void linv(ibvt_mr &sig_mr) {
Artemy Kovalyov79a00f72018-12-12 09:29:00 +0200307 linv_wr(sig_mr);
308 EXEC(send_qp.post_all_wr());
Artemy Kovalyov23e89242017-06-14 12:53:37 +0000309 }
310
311 void mr_status(ibvt_mr &mr, int expected) {
312 struct ibv_exp_mr_status status;
313
314 DO(ibv_exp_check_mr_status(mr.mr, IBV_EXP_MR_CHECK_SIG_STATUS,
315 &status));
316 VERBS_INFO("SEGERR %d %x %x %lx\n",
317 status.sig_err.err_type,
318 status.sig_err.expected,
319 status.sig_err.actual,
320 status.sig_err.sig_err_offset);
321 ASSERT_EQ(expected, status.fail_status);
322 }
323
Artemy Kovalyovaa83aa62017-07-15 12:38:36 +0300324 void ae() {
325 struct ibv_async_event event;
326
327 DO(ibv_get_async_event(this->ctx.ctx, &event));
328 ibv_ack_async_event(&event);
329 }
330
Artemy Kovalyov23e89242017-06-14 12:53:37 +0000331 virtual void SetUp() {
332 INIT(ctx.init());
333 if (skip)
334 return;
335 INIT(send_qp.init());
336 INIT(recv_qp.init());
337 INIT(send_qp.connect(&recv_qp));
338 INIT(recv_qp.connect(&send_qp));
Artemy Kovalyov23e89242017-06-14 12:53:37 +0000339 INIT(src_mr.fill());
Artemy Kovalyov921fbbe2017-08-20 02:51:49 +0300340 INIT(src2_mr.fill());
Artemy Kovalyov23e89242017-06-14 12:53:37 +0000341 INIT(mid_mr.init());
Artemy Kovalyovaa83aa62017-07-15 12:38:36 +0300342 INIT(mid2_mr.init());
Artemy Kovalyov921fbbe2017-08-20 02:51:49 +0300343 INIT(mid_mr_x2.init());
Artemy Kovalyov23e89242017-06-14 12:53:37 +0000344 INIT(dst_mr.init());
Artemy Kovalyov921fbbe2017-08-20 02:51:49 +0300345 INIT(dst_mr_x2.init());
346 INIT(insert_mr.init());
347 INIT(insert2_mr.init());
348 INIT(check_mr.init());
349 INIT(strip_mr.init());
350 INIT(strip_mr_x2.init());
Artemy Kovalyov23e89242017-06-14 12:53:37 +0000351 INIT(cq.arm());
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000352 INIT(mw.init());
Artemy Kovalyov23e89242017-06-14 12:53:37 +0000353 }
354
355 virtual void TearDown() {
356 ASSERT_FALSE(HasFailure());
357 }
358};
359
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000360template <typename SD>
361struct sig_test : public sig_test_base<ibvt_qp_sig, SD> {};
362typedef testing::Types<sig_t10dif, sig_crc32> sig_domain_types;
363TYPED_TEST_CASE(sig_test, sig_domain_types);
Artemy Kovalyovaa83aa62017-07-15 12:38:36 +0300364
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000365typedef sig_test<sig_t10dif> sig_test_t10diff;
366typedef sig_test_base<ibvt_qp_sig_pipeline, sig_t10dif> sig_test_pipeline;
367
368TYPED_TEST(sig_test, c0) {
Artemy Kovalyov23e89242017-06-14 12:53:37 +0000369 CHK_SUT(sig_handover);
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000370 EXEC(config(this->insert_mr, this->src_mr.sge(), this->nosig(), this->sig()));
371 EXEC(config(this->strip_mr, this->mid_mr.sge(), this->sig(), this->nosig()));
372 EXEC(send_qp.rdma(this->mid_mr.sge(), this->insert_mr.sge(0,SZD(this->pi_size())), IBV_WR_RDMA_READ));
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300373 EXEC(cq.poll());
374 EXEC(send_qp.rdma(this->dst_mr.sge(), this->strip_mr.sge(0,SZ), IBV_WR_RDMA_READ));
375 EXEC(cq.poll());
Artemy Kovalyov23e89242017-06-14 12:53:37 +0000376 EXEC(mr_status(this->strip_mr, 0));
377 EXEC(dst_mr.check());
378}
379
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000380TYPED_TEST(sig_test, c1) {
Artemy Kovalyov23e89242017-06-14 12:53:37 +0000381 CHK_SUT(sig_handover);
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000382 EXEC(config(this->insert_mr, this->src_mr.sge(), this->nosig(), this->sig()));
383 EXEC(config(this->strip_mr, this->mid_mr.sge(), this->sig(), this->nosig()));
384 EXEC(send_qp.rdma(this->insert_mr.sge(0,SZD(this->pi_size())), this->mid_mr.sge(), IBV_WR_RDMA_WRITE));
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300385 EXEC(cq.poll());
386 EXEC(send_qp.rdma(this->strip_mr.sge(0,SZ), this->dst_mr.sge(), IBV_WR_RDMA_WRITE));
387 EXEC(cq.poll());
Artemy Kovalyovaa83aa62017-07-15 12:38:36 +0300388 EXEC(mr_status(this->strip_mr, 0));
389 EXEC(dst_mr.check());
390}
391
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000392TYPED_TEST(sig_test, c2) {
Artemy Kovalyovaa83aa62017-07-15 12:38:36 +0300393 CHK_SUT(sig_handover);
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000394 EXEC(config(this->insert_mr, this->mid_mr.sge(), this->sig(), this->nosig()));
395 EXEC(config(this->strip_mr, this->dst_mr.sge(), this->nosig(), this->sig()));
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300396 EXEC(send_qp.rdma(this->insert_mr.sge(0,SZ), this->src_mr.sge(), IBV_WR_RDMA_READ));
397 EXEC(cq.poll());
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000398 EXEC(send_qp.rdma(this->strip_mr.sge(0,SZD(this->pi_size())), this->mid_mr.sge(), IBV_WR_RDMA_READ));
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300399 EXEC(cq.poll());
Artemy Kovalyovaa83aa62017-07-15 12:38:36 +0300400 EXEC(mr_status(this->strip_mr, 0));
401 EXEC(dst_mr.check());
402}
403
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000404TYPED_TEST(sig_test, c3) {
Artemy Kovalyov921fbbe2017-08-20 02:51:49 +0300405 CHK_SUT(sig_handover);
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000406 EXEC(config(this->insert_mr, this->mid_mr.sge(), this->sig(), this->nosig()));
407 EXEC(config(this->strip_mr, this->dst_mr.sge(), this->nosig(), this->sig()));
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300408 EXEC(send_qp.rdma(this->src_mr.sge(), this->insert_mr.sge(0,SZ), IBV_WR_RDMA_WRITE));
409 EXEC(cq.poll());
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000410 EXEC(send_qp.rdma(this->mid_mr.sge(), this->strip_mr.sge(0,SZD(this->pi_size())), IBV_WR_RDMA_WRITE));
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300411 EXEC(cq.poll());
Artemy Kovalyov921fbbe2017-08-20 02:51:49 +0300412 EXEC(mr_status(this->strip_mr, 0));
413 EXEC(dst_mr.check());
414}
415
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000416TYPED_TEST(sig_test, c4) {
Artemy Kovalyov921fbbe2017-08-20 02:51:49 +0300417 CHK_SUT(sig_handover);
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000418 EXEC(config(this->insert_mr, this->src_mr.sge(), this->nosig(), this->sig()));
419 EXEC(config(this->check_mr, this->mid_mr.sge(), this->sig(), this->sig()));
420 EXEC(config(this->strip_mr, this->mid2_mr.sge(), this->sig(), this->nosig()));
421 EXEC(send_qp.rdma(this->insert_mr.sge(0,SZD(this->pi_size())), this->mid_mr.sge(), IBV_WR_RDMA_WRITE));
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300422 EXEC(cq.poll());
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000423 EXEC(send_qp.rdma(this->check_mr.sge(0,SZD(this->pi_size())), this->mid2_mr.sge(), IBV_WR_RDMA_WRITE));
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300424 EXEC(cq.poll());
425 EXEC(send_qp.rdma(this->strip_mr.sge(0,SZ), this->dst_mr.sge(), IBV_WR_RDMA_WRITE));
426 EXEC(cq.poll());
427 EXEC(mr_status(this->strip_mr, 0));
428 EXEC(dst_mr.check());
429}
430
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000431TYPED_TEST(sig_test, r0) {
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300432 CHK_SUT(sig_handover);
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000433 EXEC(config(this->insert_mr, this->src_mr.sge(), this->nosig(), this->sig()));
434 EXEC(config(this->check_mr, this->mid_mr.sge(), this->sig(), this->sig()));
435 struct ibv_exp_sig_domain sd = this->sig();
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300436 sd.sig.dif.ref_remap = 0;
437 EXEC(config(this->strip_mr, this->mid2_mr.sge(), sd, this->nosig()));
438
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000439 EXEC(send_qp.rdma(this->insert_mr.sge(0,SZD(this->pi_size())), this->mid_mr.sge(), IBV_WR_RDMA_WRITE));
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300440 EXEC(cq.poll());
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000441 EXEC(send_qp.rdma(this->check_mr.sge(0,SZD(this->pi_size())), this->mid2_mr.sge(), IBV_WR_RDMA_WRITE));
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300442 EXEC(cq.poll());
443
444 for (long i = 0; i < 10; i++) {
445 EXEC(send_qp.rdma(this->strip_mr.sge(0,SZ), this->dst_mr.sge(), IBV_WR_RDMA_WRITE));
446 EXEC(cq.poll());
447 EXEC(mr_status(this->strip_mr, 0));
448 EXEC(dst_mr.check());
449 }
450}
451
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000452TYPED_TEST(sig_test, r1) {
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300453 CHK_SUT(sig_handover);
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000454 EXEC(config(this->insert_mr, this->src_mr.sge(), this->nosig(), this->sig()));
455 EXEC(config(this->check_mr, this->mid_mr.sge(), this->sig(), this->sig()));
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300456
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000457 EXEC(send_qp.rdma(this->insert_mr.sge(0,SZD(this->pi_size())), this->mid_mr.sge(), IBV_WR_RDMA_WRITE));
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300458 EXEC(cq.poll());
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000459 EXEC(send_qp.rdma(this->check_mr.sge(0,SZD(this->pi_size())), this->mid2_mr.sge(), IBV_WR_RDMA_WRITE));
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300460 EXEC(cq.poll());
461
462 for (long i = 0; i < 100; i++) {
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000463 EXEC(config(this->strip_mr, this->mid2_mr.sge(), this->sig(), this->nosig()));
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300464 EXEC(send_qp.rdma(this->strip_mr.sge(0,SZ), this->dst_mr.sge(), IBV_WR_RDMA_WRITE));
465 EXEC(cq.poll());
466 EXEC(mr_status(this->strip_mr, 0));
467 EXEC(dst_mr.check());
468 EXEC(linv(this->strip_mr));
469 }
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000470}
471
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000472TYPED_TEST(sig_test, r2) {
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000473 CHK_SUT(sig_handover);
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000474 EXEC(config(this->insert_mr, this->src_mr.sge(), this->nosig(), this->sig()));
475 EXEC(config(this->check_mr, this->mid_mr.sge(), this->sig(), this->sig()));
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000476
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000477 EXEC(send_qp.rdma(this->insert_mr.sge(0,SZD(this->pi_size())), this->mid_mr.sge(), IBV_WR_RDMA_WRITE));
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000478 EXEC(cq.poll());
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000479 EXEC(send_qp.rdma(this->check_mr.sge(0,SZD(this->pi_size())), this->mid2_mr.sge(), IBV_WR_RDMA_WRITE));
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000480 EXEC(cq.poll());
481
482 for (long i = 0; i < 100; i++) {
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000483 EXEC(config(this->strip_mr, this->mid2_mr.sge(), this->sig(), this->nosig()));
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000484 EXEC(send_qp.rdma(this->strip_mr.sge(0,SZ_p(i)), this->dst_mr.sge(), IBV_WR_RDMA_WRITE));
485 EXEC(cq.poll());
486 EXEC(mr_status(this->strip_mr, 0));
487 EXEC(dst_mr.check(0,0,1,SZ_p(i)));
488 EXEC(linv(this->strip_mr));
489 }
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000490}
491
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000492TYPED_TEST(sig_test, r3) {
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000493 CHK_SUT(sig_handover);
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000494 EXEC(config(this->insert_mr, this->src_mr.sge(), this->nosig(), this->sig()));
495 EXEC(config(this->check_mr, this->mid_mr.sge(), this->sig(), this->sig()));
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000496
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000497 EXEC(send_qp.rdma(this->insert_mr.sge(0,SZD(this->pi_size())), this->mid_mr.sge(), IBV_WR_RDMA_WRITE));
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000498 EXEC(cq.poll());
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000499 EXEC(send_qp.rdma(this->check_mr.sge(0,SZD(this->pi_size())), this->mid2_mr.sge(), IBV_WR_RDMA_WRITE));
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000500 EXEC(cq.poll());
501
502 for (long i = 0; i < 100; i++) {
503 int j = SZ_pp(i,0,3);
504 int k = SZ_pp(i,j,2);
505 int l = SZ_pp(i,k,1);
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000506 EXEC(config(this->strip_mr, this->mid2_mr.sge(), this->sig(), this->nosig()));
507 EXEC(config(this->strip_mr_x2, this->mid2_mr.sge(), this->sig(), this->nosig()));
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000508 EXEC(send_qp.rdma(this->strip_mr.sge(0,j), this->dst_mr.sge(), IBV_WR_RDMA_WRITE, (enum ibv_send_flags)0));
509 EXEC(send_qp.rdma(this->strip_mr_x2.sge(j,k-j), this->dst_mr.sge(j,0), IBV_WR_RDMA_WRITE, (enum ibv_send_flags)0));
510 EXEC(send_qp.rdma(this->strip_mr.sge(k,l-k), this->dst_mr.sge(k,0), IBV_WR_RDMA_WRITE, (enum ibv_send_flags)0));
511 EXEC(send_qp.rdma(this->strip_mr_x2.sge(l,SZ-l), this->dst_mr.sge(l,0), IBV_WR_RDMA_WRITE));
512 EXEC(cq.poll());
513 EXEC(mr_status(this->strip_mr, 0));
514 EXEC(mr_status(this->strip_mr_x2, 0));
515 EXEC(dst_mr.check(0,0,1,SZ));
516 EXEC(linv(this->strip_mr));
517 EXEC(linv(this->strip_mr_x2));
518 }
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000519}
520
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000521TYPED_TEST(sig_test, r4) {
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000522 CHK_SUT(sig_handover);
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000523 struct ibv_exp_sig_domain sd = this->sig();
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000524 enum ibv_send_flags nof = (enum ibv_send_flags)0;
525
526 for (long i = 0; i < 100; i++) {
527 int j = SZ_pp(i,0,3);
528 int k = SZ_pp(i,j,2);
529 int l = SZ_pp(i,k,1);
530 sd.sig.dif.ref_tag = 0x28f5b5d * i;
531
532 EXEC(config(this->insert_mr, this->src_mr.sge(), this->nosig(), sd));
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000533 EXEC(send_qp.rdma(this->insert_mr.sge(0,SZD(this->pi_size())), this->mid_mr.sge(), IBV_WR_RDMA_WRITE));
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000534 EXEC(cq.poll());
535
536 EXEC(config(this->strip_mr, this->mw.sge(), sd, this->nosig()));
537 EXEC(config(this->strip_mr_x2, this->mw.sge(), sd, this->nosig()));
538 EXEC(send_qp.rdma(this->strip_mr.sge(0,j), this->dst_mr.sge(), IBV_WR_RDMA_WRITE, nof));
539 EXEC(send_qp.rdma(this->strip_mr_x2.sge(j,k-j), this->dst_mr.sge(j,0), IBV_WR_RDMA_WRITE, nof));
540 EXEC(send_qp.rdma(this->strip_mr.sge(k,l-k), this->dst_mr.sge(k,0), IBV_WR_RDMA_WRITE, nof));
541 EXEC(send_qp.rdma(this->strip_mr_x2.sge(l,SZ-l), this->dst_mr.sge(l,0), IBV_WR_RDMA_WRITE));
542 EXEC(cq.poll());
543 EXEC(mr_status(this->insert_mr, 0));
544 EXEC(mr_status(this->strip_mr, 0));
545 EXEC(mr_status(this->strip_mr_x2, 0));
546 EXEC(dst_mr.check(0,0,1,SZ));
547
548 EXEC(linv(this->insert_mr));
549 EXEC(linv(this->strip_mr));
550 EXEC(linv(this->strip_mr_x2));
551 }
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300552}
553
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000554TYPED_TEST(sig_test, c6) {
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300555 CHK_SUT(sig_handover);
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000556 struct ibv_exp_sig_domain sd = this->sig();
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300557 sd.sig.dif.ref_remap = 0;
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000558 EXEC(config(this->insert_mr, this->src_mr.sge(), this->nosig(), this->sig()));
559 EXEC(config(this->insert2_mr, this->src2_mr.sge(), this->nosig(), this->sig()));
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300560 EXEC(config(this->strip_mr_x2, this->mid_mr_x2.sge(), sd, this->nosig()));
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000561 EXEC(send_qp.rdma2(this->insert_mr.sge(0,SZD(this->pi_size())),
562 this->insert2_mr.sge(0,SZD(this->pi_size())),
Artemy Kovalyov921fbbe2017-08-20 02:51:49 +0300563 this->mid_mr_x2.sge(),
564 IBV_WR_RDMA_WRITE));
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300565 EXEC(cq.poll());
566 EXEC(send_qp.rdma(this->strip_mr_x2.sge(0,SZ * 2),
Artemy Kovalyov921fbbe2017-08-20 02:51:49 +0300567 this->dst_mr_x2.sge(),
568 IBV_WR_RDMA_WRITE));
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300569 EXEC(cq.poll());
Artemy Kovalyov921fbbe2017-08-20 02:51:49 +0300570 EXEC(mr_status(this->strip_mr_x2, 0));
571 EXEC(dst_mr_x2.check());
572}
573
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000574TYPED_TEST(sig_test, e0) {
Artemy Kovalyovaa83aa62017-07-15 12:38:36 +0300575 CHK_SUT(sig_handover);
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000576 EXEC(config(this->strip_mr, this->mid_mr.sge(), this->sig(), this->nosig()));
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300577 EXEC(send_qp.rdma(this->dst_mr.sge(), this->strip_mr.sge(0,SZ), IBV_WR_RDMA_READ));
578 EXEC(cq.poll());
Artemy Kovalyovaa83aa62017-07-15 12:38:36 +0300579 EXEC(mr_status(this->strip_mr, 1));
580}
581
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000582TYPED_TEST(sig_test, e1) {
Artemy Kovalyovaa83aa62017-07-15 12:38:36 +0300583 CHK_SUT(sig_handover);
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000584 EXEC(config(this->strip_mr, this->mid_mr.sge(), this->sig(), this->nosig()));
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300585 EXEC(send_qp.rdma(this->strip_mr.sge(0,SZ), this->dst_mr.sge(), IBV_WR_RDMA_WRITE));
586 EXEC(cq.poll());
587 EXEC(mr_status(this->strip_mr, 1));
588}
589
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000590TYPED_TEST(sig_test, e2) {
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300591 CHK_SUT(sig_handover);
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000592 EXEC(config(this->strip_mr, this->dst_mr.sge(), this->nosig(), this->sig()));
593 EXEC(send_qp.rdma(this->strip_mr.sge(0,SZD(this->pi_size())), this->mid_mr.sge(), IBV_WR_RDMA_READ));
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300594 EXEC(cq.poll());
595 EXEC(mr_status(this->strip_mr, 1));
596}
597
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000598TYPED_TEST(sig_test, e3) {
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300599 CHK_SUT(sig_handover);
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000600 EXEC(config(this->strip_mr, this->dst_mr.sge(), this->nosig(), this->sig()));
601 EXEC(send_qp.rdma(this->mid_mr.sge(), this->strip_mr.sge(0,SZD(this->pi_size())), IBV_WR_RDMA_WRITE));
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300602 EXEC(cq.poll());
603 EXEC(mr_status(this->strip_mr, 1));
604}
605
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000606TYPED_TEST(sig_test, e4) {
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300607 CHK_SUT(sig_handover);
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000608 EXEC(config(this->check_mr, this->mid_mr.sge(), this->sig(), this->sig()));
609 EXEC(send_qp.rdma(this->check_mr.sge(0,SZD(this->pi_size())), this->mid2_mr.sge(), IBV_WR_RDMA_WRITE));
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300610 EXEC(cq.poll());
Artemy Kovalyovaa83aa62017-07-15 12:38:36 +0300611 EXEC(mr_status(this->check_mr, 1));
612}
613
614TEST_F(sig_test_pipeline, p0) {
615 CHK_SUT(sig_handover);
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000616 EXEC(config(this->strip_mr, this->mid_mr.sge(), this->sig(), this->nosig()));
Artemy Kovalyovaa83aa62017-07-15 12:38:36 +0300617 EXEC(recv_qp.recv(this->dst_mr.sge()));
618 EXEC(recv_qp.recv(this->dst_mr.sge()));
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000619 EXEC(send_qp.send_2wr(this->strip_mr.sge(0,SZ), this->src_mr.sge(0,SZ)));
620 cq.poll();
Artemy Kovalyovaa83aa62017-07-15 12:38:36 +0300621 EXEC(ae());
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300622 EXEC(cq.poll());
Artemy Kovalyovaa83aa62017-07-15 12:38:36 +0300623 EXEC(mr_status(this->strip_mr, 1));
624}
625
626TEST_F(sig_test_pipeline, p1) {
627 CHK_SUT(sig_handover);
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000628 EXEC(config(this->strip_mr, this->mid_mr.sge(), this->sig(), this->nosig()));
Artemy Kovalyovaa83aa62017-07-15 12:38:36 +0300629 EXEC(recv_qp.recv(this->dst_mr.sge()));
630 EXEC(recv_qp.recv(this->dst_mr.sge()));
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300631 EXEC(send_qp.send_2wr(this->strip_mr.sge(0,SZ), this->src_mr.sge()));
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000632 cq.poll();
633 EXEC(mr_status(this->strip_mr, 1));
634}
635
636TEST_F(sig_test_pipeline, p2) {
637 CHK_SUT(sig_handover);
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000638 EXEC(config(this->strip_mr, this->mid_mr.sge(), this->sig(), this->nosig()));
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000639 EXEC(recv_qp.recv(this->dst_mr.sge()));
640 EXEC(recv_qp.recv(this->dst_mr.sge()));
641 struct ibv_sge sge[4];
642 for (int i=0; i<4; i++)
643 sge[i] = this->strip_mr.sge(0 + i * SZ / 4, SZ/4);
644 EXEC(send_qp.send_2wr_m(sge, 4, this->src_mr.sge(0,SZ)));
645 cq.poll();
646 EXEC(ae());
Artemy Kovalyov4b7c3742017-09-27 09:18:22 +0300647 EXEC(cq.poll());
Artemy Kovalyov23e89242017-06-14 12:53:37 +0000648 EXEC(mr_status(this->strip_mr, 1));
649}
650
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000651
652TEST_F(sig_test_pipeline, p3) {
653 CHK_SUT(sig_handover);
654 for (long i = 0; i < 100; i++) {
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000655 EXEC(config(this->strip_mr, this->mid_mr.sge(), this->sig(), this->nosig()));
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000656 EXEC(recv_qp.recv(this->dst_mr.sge()));
657 EXEC(recv_qp.recv(this->dst_mr.sge()));
658 struct ibv_sge sge[4];
659 for (int i=0; i<4; i++)
660 sge[i] = this->strip_mr.sge(0 + i * SZ / 4, SZ/4);
661 EXEC(send_qp.send_2wr_m(sge, 4, this->src_mr.sge(0,SZ)));
662 cq.poll();
663 EXEC(ae());
664 EXEC(cq.poll());
665 EXEC(mr_status(this->strip_mr, 1));
666 EXEC(linv(this->strip_mr));
667 }
668}
669
670TEST_F(sig_test_pipeline, p4) {
671 CHK_SUT(sig_handover);
Sergey Gorenko08fd5f32018-11-23 12:28:18 +0000672 EXEC(config(this->strip_mr, this->mid_mr.sge(), this->sig(), this->nosig()));
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000673 for (long i = 0; i < 100; i++) {
674 EXEC(recv_qp.recv(this->dst_mr.sge()));
675 EXEC(recv_qp.recv(this->dst_mr.sge()));
676 EXEC(send_qp.send_2wr(this->strip_mr.sge(0,SZ), this->src_mr.sge()));
677 }
Artemy Kovalyov179ad632018-04-28 20:12:16 +0000678}