Skip to content

Commit a487a46

Browse files
committed
prov/efa: Add unit tests for 0 byte send/read/write
Adds unit tests for 0 byte send/read/write for both efa-proto and efa-direct Signed-off-by: Seth Zegelstein <szegel@amazon.com>
1 parent 89c97b0 commit a487a46

File tree

8 files changed

+687
-2
lines changed

8 files changed

+687
-2
lines changed

prov/efa/test/efa_unit_test_common.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,3 +425,29 @@ struct efa_rdm_ope *efa_unit_test_alloc_rxe(struct efa_resource *resource, uint3
425425
/* TODO - peer struct might need more info */
426426
return efa_rdm_ep_alloc_rxe(efa_rdm_ep, peer, op);
427427
}
428+
429+
430+
void efa_unit_test_rdm_0byte_prep(struct efa_resource *resource, fi_addr_t *addr)
431+
{
432+
struct efa_ep_addr raw_addr;
433+
size_t raw_addr_len = sizeof(raw_addr);
434+
struct efa_rdm_ep *efa_rdm_ep;
435+
struct efa_rdm_peer *peer;
436+
int ret;
437+
438+
efa_unit_test_resource_construct_rdm_shm_disabled(resource);
439+
440+
ret = fi_getname(&resource->ep->fid, &raw_addr, &raw_addr_len);
441+
assert_int_equal(ret, 0);
442+
443+
raw_addr.qpn = 1;
444+
raw_addr.qkey = 0x1234;
445+
ret = fi_av_insert(resource->av, &raw_addr, 1, addr, 0, NULL);
446+
assert_int_equal(ret, 1);
447+
448+
/* Mark peer as handshake received and enable RDMA write/read */
449+
efa_rdm_ep = container_of(resource->ep, struct efa_rdm_ep, base_ep.util_ep.ep_fid);
450+
peer = efa_rdm_ep_get_peer(efa_rdm_ep, *addr);
451+
peer->flags |= EFA_RDM_PEER_HANDSHAKE_RECEIVED;
452+
peer->extra_info[0] |= EFA_RDM_EXTRA_FEATURE_RDMA_WRITE | EFA_RDM_EXTRA_FEATURE_RDMA_READ | EFA_RDM_EXTRA_FEATURE_UNSOLICITED_WRITE_RECV;
453+
}

prov/efa/test/efa_unit_test_domain.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,39 @@ void test_efa_domain_info_type_efa_direct(struct efa_resource **state)
3333
assert_true(efa_domain->info_type == EFA_INFO_DIRECT);
3434
}
3535

36+
/**
37+
* @brief Verify bounce buffer is allocated for efa-direct domain
38+
*
39+
* @param[in] state struct efa_resource that is managed by the framework
40+
*/
41+
void test_efa_domain_direct_has_bounce_buffer(struct efa_resource **state)
42+
{
43+
struct efa_resource *resource = *state;
44+
struct efa_domain *efa_domain;
45+
46+
efa_unit_test_resource_construct(resource, FI_EP_RDM, EFA_DIRECT_FABRIC_NAME);
47+
efa_domain = container_of(resource->domain, struct efa_domain, util_domain.domain_fid);
48+
assert_non_null(efa_domain->zero_byte_bounce_buf);
49+
assert_non_null(efa_domain->zero_byte_bounce_buf_mr);
50+
assert_non_null(efa_domain->zero_byte_bounce_buf_mr->ibv_mr);
51+
}
52+
53+
/**
54+
* @brief Verify bounce buffer is NOT allocated for efa RDM domain
55+
*
56+
* @param[in] state struct efa_resource that is managed by the framework
57+
*/
58+
void test_efa_domain_rdm_no_bounce_buffer(struct efa_resource **state)
59+
{
60+
struct efa_resource *resource = *state;
61+
struct efa_domain *efa_domain;
62+
63+
efa_unit_test_resource_construct(resource, FI_EP_RDM, EFA_FABRIC_NAME);
64+
efa_domain = container_of(resource->domain, struct efa_domain, util_domain.domain_fid);
65+
assert_null(efa_domain->zero_byte_bounce_buf);
66+
assert_null(efa_domain->zero_byte_bounce_buf_mr);
67+
}
68+
3669
/* test fi_open_ops with a wrong name */
3770
void test_efa_domain_open_ops_wrong_name(struct efa_resource **state)
3871
{

prov/efa/test/efa_unit_test_msg.c

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,3 +248,95 @@ void test_efa_msg_fi_injectdata(struct efa_resource **state)
248248

249249
efa_unit_test_buff_destruct(&send_buff);
250250
}
251+
252+
/* 0-byte MSG tests */
253+
void test_efa_msg_send_0_byte(struct efa_resource **state)
254+
{
255+
struct efa_resource *resource = *state;
256+
fi_addr_t addr;
257+
int ret;
258+
259+
test_efa_msg_send_prep(resource, &addr);
260+
261+
assert_int_equal(g_ibv_submitted_wr_id_cnt, 0);
262+
ret = fi_send(resource->ep, NULL, 0, NULL, addr, NULL);
263+
assert_int_equal(ret, 0);
264+
assert_int_equal(g_ibv_submitted_wr_id_cnt, 1);
265+
}
266+
267+
void test_efa_msg_sendv_0_byte(struct efa_resource **state)
268+
{
269+
struct efa_resource *resource = *state;
270+
fi_addr_t addr;
271+
struct iovec iov = {0};
272+
int ret;
273+
274+
test_efa_msg_send_prep(resource, &addr);
275+
276+
assert_int_equal(g_ibv_submitted_wr_id_cnt, 0);
277+
ret = fi_sendv(resource->ep, &iov, NULL, 0, addr, NULL);
278+
assert_int_equal(ret, 0);
279+
assert_int_equal(g_ibv_submitted_wr_id_cnt, 1);
280+
}
281+
282+
void test_efa_msg_sendmsg_0_byte(struct efa_resource **state)
283+
{
284+
struct efa_resource *resource = *state;
285+
fi_addr_t addr;
286+
struct iovec iov = {0};
287+
struct fi_msg msg = {0};
288+
int ret;
289+
290+
test_efa_msg_send_prep(resource, &addr);
291+
292+
efa_unit_test_construct_msg(&msg, &iov, 0, addr, NULL, 0, NULL);
293+
294+
assert_int_equal(g_ibv_submitted_wr_id_cnt, 0);
295+
ret = fi_sendmsg(resource->ep, &msg, 0);
296+
assert_int_equal(ret, 0);
297+
assert_int_equal(g_ibv_submitted_wr_id_cnt, 1);
298+
}
299+
300+
void test_efa_msg_senddata_0_byte(struct efa_resource **state)
301+
{
302+
struct efa_resource *resource = *state;
303+
fi_addr_t addr;
304+
int ret;
305+
uint64_t data = 0x1234567890ABCDEF;
306+
307+
test_efa_msg_send_prep(resource, &addr);
308+
309+
assert_int_equal(g_ibv_submitted_wr_id_cnt, 0);
310+
ret = fi_senddata(resource->ep, NULL, 0, NULL, data, addr, NULL);
311+
assert_int_equal(ret, 0);
312+
assert_int_equal(g_ibv_submitted_wr_id_cnt, 1);
313+
}
314+
315+
void test_efa_msg_inject_0_byte(struct efa_resource **state)
316+
{
317+
struct efa_resource *resource = *state;
318+
fi_addr_t addr;
319+
int ret;
320+
321+
test_efa_msg_send_prep(resource, &addr);
322+
323+
assert_int_equal(g_ibv_submitted_wr_id_cnt, 0);
324+
ret = fi_inject(resource->ep, NULL, 0, addr);
325+
assert_int_equal(ret, 0);
326+
assert_int_equal(g_ibv_submitted_wr_id_cnt, 1);
327+
}
328+
329+
void test_efa_msg_injectdata_0_byte(struct efa_resource **state)
330+
{
331+
struct efa_resource *resource = *state;
332+
fi_addr_t addr;
333+
int ret;
334+
uint64_t data = 0x1234567890ABCDEF;
335+
336+
test_efa_msg_send_prep(resource, &addr);
337+
338+
assert_int_equal(g_ibv_submitted_wr_id_cnt, 0);
339+
ret = fi_injectdata(resource->ep, NULL, 0, data, addr);
340+
assert_int_equal(ret, 0);
341+
assert_int_equal(g_ibv_submitted_wr_id_cnt, 1);
342+
}

prov/efa/test/efa_unit_test_ope.c

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1176,3 +1176,164 @@ void test_efa_rdm_atomic_compare_desc_persistence(struct efa_resource **state)
11761176
efa_unit_test_buff_destruct(&result_buff);
11771177
efa_unit_test_buff_destruct(&compare_buff);
11781178
}
1179+
1180+
1181+
/* RDM MSG 0-byte tests */
1182+
void test_efa_rdm_msg_send_0_byte_no_shm(struct efa_resource **state)
1183+
{
1184+
struct efa_resource *resource = *state;
1185+
struct efa_rdm_ep *efa_rdm_ep;
1186+
fi_addr_t addr;
1187+
int ret;
1188+
1189+
efa_unit_test_rdm_0byte_prep(resource, &addr);
1190+
efa_rdm_ep = container_of(resource->ep, struct efa_rdm_ep, base_ep.util_ep.ep_fid);
1191+
1192+
assert_int_equal(efa_rdm_ep->efa_outstanding_tx_ops, 0);
1193+
ret = fi_send(resource->ep, NULL, 0, NULL, addr, NULL);
1194+
assert_int_equal(ret, 0);
1195+
assert_int_equal(efa_rdm_ep->efa_outstanding_tx_ops, 1);
1196+
}
1197+
1198+
void test_efa_rdm_msg_sendv_0_byte_no_shm(struct efa_resource **state)
1199+
{
1200+
struct efa_resource *resource = *state;
1201+
fi_addr_t addr;
1202+
struct iovec iov = {0};
1203+
int ret;
1204+
1205+
efa_unit_test_rdm_0byte_prep(resource, &addr);
1206+
1207+
ret = fi_sendv(resource->ep, &iov, NULL, 0, addr, NULL);
1208+
assert_int_equal(ret, 0);
1209+
}
1210+
1211+
void test_efa_rdm_msg_sendmsg_0_byte_no_shm(struct efa_resource **state)
1212+
{
1213+
struct efa_resource *resource = *state;
1214+
fi_addr_t addr;
1215+
struct iovec iov = {0};
1216+
struct fi_msg msg = {0};
1217+
int ret;
1218+
1219+
efa_unit_test_rdm_0byte_prep(resource, &addr);
1220+
1221+
efa_unit_test_construct_msg(&msg, &iov, 0, addr, NULL, 0, NULL);
1222+
1223+
ret = fi_sendmsg(resource->ep, &msg, 0);
1224+
assert_int_equal(ret, 0);
1225+
}
1226+
1227+
void test_efa_rdm_msg_senddata_0_byte_no_shm(struct efa_resource **state)
1228+
{
1229+
struct efa_resource *resource = *state;
1230+
fi_addr_t addr;
1231+
int ret;
1232+
1233+
efa_unit_test_rdm_0byte_prep(resource, &addr);
1234+
1235+
ret = fi_senddata(resource->ep, NULL, 0, NULL, 0, addr, NULL);
1236+
assert_int_equal(ret, 0);
1237+
}
1238+
1239+
void test_efa_rdm_msg_inject_0_byte_no_shm(struct efa_resource **state)
1240+
{
1241+
struct efa_resource *resource = *state;
1242+
fi_addr_t addr;
1243+
int ret;
1244+
1245+
efa_unit_test_rdm_0byte_prep(resource, &addr);
1246+
1247+
ret = fi_inject(resource->ep, NULL, 0, addr);
1248+
assert_int_equal(ret, 0);
1249+
}
1250+
1251+
void test_efa_rdm_msg_injectdata_0_byte_no_shm(struct efa_resource **state)
1252+
{
1253+
struct efa_resource *resource = *state;
1254+
fi_addr_t addr;
1255+
int ret;
1256+
1257+
efa_unit_test_rdm_0byte_prep(resource, &addr);
1258+
1259+
ret = fi_injectdata(resource->ep, NULL, 0, 0, addr);
1260+
assert_int_equal(ret, 0);
1261+
}
1262+
1263+
/* RDM Tagged 0-byte tests */
1264+
void test_efa_rdm_tagged_send_0_byte_no_shm(struct efa_resource **state)
1265+
{
1266+
struct efa_resource *resource = *state;
1267+
fi_addr_t addr;
1268+
int ret;
1269+
1270+
efa_unit_test_rdm_0byte_prep(resource, &addr);
1271+
1272+
ret = fi_tsend(resource->ep, NULL, 0, NULL, addr, 0, NULL);
1273+
assert_int_equal(ret, 0);
1274+
}
1275+
1276+
void test_efa_rdm_tagged_sendv_0_byte_no_shm(struct efa_resource **state)
1277+
{
1278+
struct efa_resource *resource = *state;
1279+
fi_addr_t addr;
1280+
struct iovec iov = {0};
1281+
int ret;
1282+
1283+
efa_unit_test_rdm_0byte_prep(resource, &addr);
1284+
1285+
ret = fi_tsendv(resource->ep, &iov, NULL, 0, addr, 0, NULL);
1286+
assert_int_equal(ret, 0);
1287+
}
1288+
1289+
void test_efa_rdm_tagged_sendmsg_0_byte_no_shm(struct efa_resource **state)
1290+
{
1291+
struct efa_resource *resource = *state;
1292+
fi_addr_t addr;
1293+
struct iovec iov = {0};
1294+
struct fi_msg_tagged tmsg = {0};
1295+
int ret;
1296+
1297+
efa_unit_test_rdm_0byte_prep(resource, &addr);
1298+
1299+
efa_unit_test_construct_tmsg(&tmsg, &iov, 0, addr, NULL, 0, NULL, 0, 0);
1300+
1301+
ret = fi_tsendmsg(resource->ep, &tmsg, 0);
1302+
assert_int_equal(ret, 0);
1303+
}
1304+
1305+
void test_efa_rdm_tagged_senddata_0_byte_no_shm(struct efa_resource **state)
1306+
{
1307+
struct efa_resource *resource = *state;
1308+
fi_addr_t addr;
1309+
int ret;
1310+
1311+
efa_unit_test_rdm_0byte_prep(resource, &addr);
1312+
1313+
ret = fi_tsenddata(resource->ep, NULL, 0, NULL, 0, addr, 0, NULL);
1314+
assert_int_equal(ret, 0);
1315+
}
1316+
1317+
void test_efa_rdm_tagged_inject_0_byte_no_shm(struct efa_resource **state)
1318+
{
1319+
struct efa_resource *resource = *state;
1320+
fi_addr_t addr;
1321+
int ret;
1322+
1323+
efa_unit_test_rdm_0byte_prep(resource, &addr);
1324+
1325+
ret = fi_tinject(resource->ep, NULL, 0, addr, 0);
1326+
assert_int_equal(ret, 0);
1327+
}
1328+
1329+
void test_efa_rdm_tagged_injectdata_0_byte_no_shm(struct efa_resource **state)
1330+
{
1331+
struct efa_resource *resource = *state;
1332+
fi_addr_t addr;
1333+
int ret;
1334+
1335+
efa_unit_test_rdm_0byte_prep(resource, &addr);
1336+
1337+
ret = fi_tinjectdata(resource->ep, NULL, 0, 0, addr, 0);
1338+
assert_int_equal(ret, 0);
1339+
}

0 commit comments

Comments
 (0)