diff --git a/fabtests/Makefile.am b/fabtests/Makefile.am
index 6d830668833..a60ec46cb41 100644
--- a/fabtests/Makefile.am
+++ b/fabtests/Makefile.am
@@ -40,7 +40,7 @@ bin_PROGRAMS = \
functional/fi_rdm_atomic \
functional/fi_rdm_stress \
functional/fi_multi_recv \
- functional/fi_bw \
+ functional/fi_flood \
functional/fi_rdm_multi_client \
functional/fi_loopback \
benchmarks/fi_msg_pingpong \
@@ -360,9 +360,9 @@ functional_fi_multi_recv_SOURCES = \
functional/multi_recv.c
functional_fi_multi_recv_LDADD = libfabtests.la
-functional_fi_bw_SOURCES = \
- functional/bw.c
-functional_fi_bw_LDADD = libfabtests.la
+functional_fi_flood_SOURCES = \
+ functional/flood.c
+functional_fi_flood_LDADD = libfabtests.la
functional_fi_rdm_multi_client_SOURCES = \
functional/rdm_multi_client.c
@@ -651,7 +651,7 @@ dummy_man_pages = \
man/man1/fi_eq_test.1 \
man/man1/fi_getinfo_test.1 \
man/man1/fi_mr_test.1 \
- man/man1/fi_bw.1 \
+ man/man1/fi_flood.1 \
man/man1/fi_rdm_multi_client.1 \
man/man1/fi_ubertest.1 \
man/man1/fi_efa_ep_rnr_retry.1
diff --git a/fabtests/Makefile.win b/fabtests/Makefile.win
index da244c78735..fb7924227c8 100644
--- a/fabtests/Makefile.win
+++ b/fabtests/Makefile.win
@@ -77,7 +77,7 @@ benchmarks: $(outdir)\dgram_pingpong.exe $(outdir)\msg_bw.exe \
$(outdir)\rdm_pingpong.exe $(outdir)\rma_pingpong.exe $(outdir)\rdm_tagged_bw.exe \
$(outdir)\rdm_bw.exe $(outdir)\rdm_tagged_pingpong.exe $(outdir)\rma_bw.exe
-functional: $(outdir)\av_xfer.exe $(outdir)\bw.exe $(outdir)\cm_data.exe $(outdir)\cq_data.exe \
+functional: $(outdir)\av_xfer.exe $(outdir)\flood.exe $(outdir)\cm_data.exe $(outdir)\cq_data.exe \
$(outdir)\dgram.exe $(outdir)\msg.exe $(outdir)\msg_epoll.exe \
$(outdir)\inject_test.exe $(outdir)\msg_sockets.exe $(outdir)\multi_mr.exe \
$(outdir)\multi_ep.exe $(outdir)\multi_recv.exe $(outdir)\rdm.exe \
@@ -120,7 +120,7 @@ $(outdir)\rma_bw.exe: {benchmarks}rma_bw.c $(basedeps) {benchmarks}benchmark_sha
$(outdir)\av_xfer.exe: {functional}av_xfer.c $(basedeps)
-$(outdir)\bw.exe: {functional}bw.c $(basedeps)
+$(outdir)\flood.exe: {functional}flood.c $(basedeps)
$(outdir)\cm_data.exe: {functional}cm_data.c $(basedeps)
diff --git a/fabtests/fabtests.vcxproj b/fabtests/fabtests.vcxproj
index cba59f15c1a..65b0af71be0 100644
--- a/fabtests/fabtests.vcxproj
+++ b/fabtests/fabtests.vcxproj
@@ -239,7 +239,7 @@
-
+
diff --git a/fabtests/fabtests.vcxproj.filters b/fabtests/fabtests.vcxproj.filters
index d3f495b81e2..e113cbf898e 100644
--- a/fabtests/fabtests.vcxproj.filters
+++ b/fabtests/fabtests.vcxproj.filters
@@ -225,7 +225,7 @@
Source Files\functional
-
+
Source Files\functional
diff --git a/fabtests/functional/bw.c b/fabtests/functional/flood.c
similarity index 70%
rename from fabtests/functional/bw.c
rename to fabtests/functional/flood.c
index 04745e61374..f85f5274e75 100644
--- a/fabtests/functional/bw.c
+++ b/fabtests/functional/flood.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2019 Intel Corporation. All rights reserved.
+ * Copyright (c) Intel Corporation. All rights reserved.
*
* This software is available to you under the BSD license
* below:
@@ -34,7 +34,7 @@
#include
-int sleep_time = 0;
+static int sleep_time = 0;
static ssize_t post_one_tx(struct ft_context *msg)
{
@@ -99,27 +99,96 @@ static int post_rx_sync(void)
return ret;
}
-static int run_loop(void)
+static void mr_close_all(struct ft_context *ctx_arr, int window_size)
+{
+ int i;
+
+ for (i = 0; i < window_size; i++)
+ FT_CLOSE_FID(ctx_arr[i].mr);
+}
+
+static int run_seq_mr_send(void) {
+
+ int ret;
+ int i;
+
+ mr_close_all(tx_ctx_arr, opts.window_size);
+ mr_close_all(rx_ctx_arr, opts.window_size);
+
+ printf("Sequential memory registration:");
+ if (opts.dst_addr) {
+ for (i = 0; i < opts.window_size; i++) {
+ ret = ft_reg_mr(fi, tx_ctx_arr[i].buf, tx_mr_size,
+ ft_info_to_mr_access(fi),
+ FT_TX_MR_KEY + i, opts.iface, opts.device,
+ &(tx_ctx_arr[i].mr), &(tx_ctx_arr[i].desc));
+ if (ret)
+ goto out;
+
+ ret = post_one_tx(&tx_ctx_arr[i]);
+ if (ret)
+ goto out;
+
+ ret = ft_get_tx_comp(tx_seq);
+ if (ret)
+ goto out;
+
+ FT_CLOSE_FID(tx_ctx_arr[i].mr);
+ }
+ } else {
+ for (i = 0; i < opts.window_size; i++) {
+ ret = ft_reg_mr(fi, rx_ctx_arr[i].buf, rx_mr_size,
+ ft_info_to_mr_access(fi), FT_RX_MR_KEY + i, opts.iface, opts.device,
+ &(rx_ctx_arr[i].mr),
+ &(rx_ctx_arr[i].desc));
+ if (ret)
+ goto out;
+
+ ret = ft_post_rx_buf(ep, opts.transfer_size,
+ &(rx_ctx_arr[i].context),
+ rx_ctx_arr[i].buf,
+ rx_ctx_arr[i].desc, ft_tag);
+ if (ret)
+ goto out;
+
+ ret = wait_check_rx_bufs();
+ if (ret)
+ goto out;
+
+ FT_CLOSE_FID(rx_ctx_arr[i].mr);
+ }
+ }
+ if (opts.options & FT_OPT_OOB_SYNC)
+ ret = ft_sync();
+ else
+ ret = post_rx_sync();
+out:
+ printf("%s\n", ret ? "Fail" : "Pass");
+ return ret;
+}
+
+static int run_batch_mr_send(void)
{
int ret, i;
/* Receive side delay is used in order to let the sender
- get ahead of the receiver and post multiple sends
- before the receiver begins processing them. */
+ * get ahead of the receiver and post multiple sends
+ * before the receiver begins processing them.
+ */
if (!opts.dst_addr)
sleep(sleep_time);
- ft_start();
+ printf("Batch memory registration:");
if (opts.dst_addr) {
for (i = 0; i < opts.window_size; i++) {
ret = post_one_tx(&tx_ctx_arr[i]);
if (ret)
- return ret;
+ goto out;
}
ret = ft_get_tx_comp(tx_seq);
if (ret)
- return ret;
+ goto out;
} else {
for (i = 0; i < opts.window_size; i++) {
ret = ft_post_rx_buf(ep, opts.transfer_size,
@@ -127,66 +196,39 @@ static int run_loop(void)
rx_ctx_arr[i].buf,
rx_ctx_arr[i].desc, 0);
if (ret)
- return ret;
+ goto out;
}
ret = wait_check_rx_bufs();
if (ret)
- return ret;
+ goto out;
}
- ft_stop();
if (opts.options & FT_OPT_OOB_SYNC)
ret = ft_sync();
else
ret = post_rx_sync();
- if (ret)
- return ret;
-
- if (opts.machr)
- show_perf_mr(opts.transfer_size, opts.window_size, &start, &end, 1,
- opts.argc, opts.argv);
- else
- show_perf(NULL, opts.transfer_size, opts.window_size, &start, &end, 1);
-
+out:
+ printf("%s\n", ret ? "Fail" : "Pass");
return ret;
}
static int run(void)
{
- int ret, i;
+ int ret;
ret = hints->ep_attr->type == FI_EP_MSG ?
ft_init_fabric_cm() : ft_init_fabric();
if (ret)
return ret;
-
- ret = ft_tx(ep, remote_fi_addr, 1, &tx_ctx);
- if (ret)
- return ret;
- ret = ft_get_tx_comp(tx_seq);
+ ret = run_batch_mr_send();
if (ret)
- return ret;
+ goto out;
- ret = ft_get_rx_comp(rx_seq);
+ ret = run_seq_mr_send();
if (ret)
- return ret;
-
- if (!(opts.options & FT_OPT_SIZE)) {
- for (i = 0; i < TEST_CNT; i++) {
- if (!ft_use_size(i, opts.sizes_enabled))
- continue;
- opts.transfer_size = test_size[i].size;
- ret = run_loop();
- if (ret)
- goto out;
- }
- } else {
- ret = run_loop();
- if (ret)
- goto out;
- }
+ goto out;
out:
return ret;
@@ -197,6 +239,8 @@ int main(int argc, char **argv)
int op, ret;
opts = INIT_OPTS;
+ opts.options |= FT_OPT_ALLOC_MULT_MR;
+ opts.options |= FT_OPT_NO_PRE_POSTED_RX;
hints = fi_allocinfo();
if (!hints)
@@ -225,7 +269,7 @@ int main(int argc, char **argv)
break;
case '?':
case 'h':
- ft_usage(argv[0], "A bandwidth test with data verification.");
+ ft_usage(argv[0], "test to oversubscribe mr cache and receiver with unexpected msgs.");
FT_PRINT_OPTS_USAGE("-T sleep_time",
"Receive side delay before starting");
FT_PRINT_OPTS_USAGE("-v", "Enable data verification");
@@ -243,8 +287,6 @@ int main(int argc, char **argv)
hints->domain_attr->mr_mode = opts.mr_mode;
hints->addr_format = opts.address_format;
- opts.options |= FT_OPT_ALLOC_MULT_MR;
-
if (hints->ep_attr->type == FI_EP_DGRAM) {
fprintf(stderr, "This test does not support DGRAM endpoints\n");
return -FI_EINVAL;
@@ -260,4 +302,4 @@ int main(int argc, char **argv)
ft_free_res();
return ft_exit_code(ret);
-}
+}
\ No newline at end of file
diff --git a/fabtests/man/fabtests.7.md b/fabtests/man/fabtests.7.md
index 4f31360e1cc..bac6c1b3c4c 100644
--- a/fabtests/man/fabtests.7.md
+++ b/fabtests/man/fabtests.7.md
@@ -140,10 +140,13 @@ features of libfabric.
buffer tries to remain the same. This test is used to validate the
correct behavior of memory registration caches.
-*fi_bw*
-: Performs a one-sided bandwidth test with an option for data verification.
- A sleep time on the receiving side can be enabled in order to allow
- the sender to get ahead of the receiver.
+*fi_flood*
+: The test performs a one-sided transfer by utilizing Bulk Memory Region (MR)
+ registration and flooding the receiver with unexpected messages. This is
+ followed by sequential MR registration transfers, which force the MR cache
+ to evict the least recently used MRs before making new transfers. An optional
+ sleep time can be enabled on the receiving side to allow the sender to get
+ ahead of the receiver.
*fi_rdm_multi_client*
: Tests a persistent server communicating with multiple clients, one at a
diff --git a/fabtests/man/man1/fi_bw.1 b/fabtests/man/man1/fi_flood.1
similarity index 100%
rename from fabtests/man/man1/fi_bw.1
rename to fabtests/man/man1/fi_flood.1
diff --git a/fabtests/pytest/default/test_rdm.py b/fabtests/pytest/default/test_rdm.py
index 1978006db21..0236fbd8b79 100644
--- a/fabtests/pytest/default/test_rdm.py
+++ b/fabtests/pytest/default/test_rdm.py
@@ -39,7 +39,7 @@ def test_rdm_shared_av(cmdline_args):
@pytest.mark.functional
def test_rdm_bw_functional(cmdline_args, completion_semantic):
from common import ClientServerTest
- test = ClientServerTest(cmdline_args, "fi_bw -e rdm -v -T 1", completion_semantic=completion_semantic)
+ test = ClientServerTest(cmdline_args, "fi_flood -e rdm -v -T 1", completion_semantic=completion_semantic)
test.run()
@pytest.mark.parametrize("iteration_type",
diff --git a/fabtests/pytest/efa/test_flood_peer.py b/fabtests/pytest/efa/test_flood_peer.py
index d49cfdd1c63..ee321e007f2 100644
--- a/fabtests/pytest/efa/test_flood_peer.py
+++ b/fabtests/pytest/efa/test_flood_peer.py
@@ -3,6 +3,6 @@
@pytest.mark.functional
def test_flood_peer(cmdline_args):
from common import ClientServerTest
- test = ClientServerTest(cmdline_args, "fi_bw -e rdm -W 6400 -S 512 -T 5",
+ test = ClientServerTest(cmdline_args, "fi_flood -e rdm -W 6400 -S 512 -T 5",
timeout=300)
test.run()
diff --git a/fabtests/scripts/runfabtests.cmd b/fabtests/scripts/runfabtests.cmd
index 07e21d4f2eb..5fb9b3833da 100644
--- a/fabtests/scripts/runfabtests.cmd
+++ b/fabtests/scripts/runfabtests.cmd
@@ -74,9 +74,9 @@ set functional_tests=^
"inject_test -N -A inject -v"^
"inject_test -A inj_complete -v"^
"inject_test -N -A inj_complete -v"^
- "bw -e rdm -v -T 1"^
- "bw -e rdm -v -T 1 -U"^
- "bw -e msg -v -T 1"^
+ "flood -e rdm -v -T 1"^
+ "flood -e rdm -v -T 1 -U"^
+ "flood -e msg -v -T 1"^
"rdm_multi_client -C 10 -I 5"^
"rdm_multi_client -C 10 -I 5 -U"
diff --git a/fabtests/scripts/runfabtests.sh b/fabtests/scripts/runfabtests.sh
index 65cc9958f6f..a6c3b075576 100755
--- a/fabtests/scripts/runfabtests.sh
+++ b/fabtests/scripts/runfabtests.sh
@@ -150,9 +150,9 @@ functional_tests=(
"fi_inject_test -N -A inject -v"
"fi_inject_test -A inj_complete -v"
"fi_inject_test -N -A inj_complete -v"
- "fi_bw -e rdm -v -T 1"
- "fi_bw -e rdm -v -T 1 -U"
- "fi_bw -e msg -v -T 1"
+ "fi_flood -e rdm -v -T 1"
+ "fi_flood -e rdm -v -T 1 -U"
+ "fi_flood -e msg -v -T 1"
"fi_rdm_multi_client -C 10 -I 5"
"fi_rdm_multi_client -C 10 -I 5 -U"
)
diff --git a/fabtests/test_configs/tcp/io_uring.exclude b/fabtests/test_configs/tcp/io_uring.exclude
index d84ee2fde6a..9b7a5c73176 100644
--- a/fabtests/test_configs/tcp/io_uring.exclude
+++ b/fabtests/test_configs/tcp/io_uring.exclude
@@ -70,13 +70,14 @@ fi_msg_sockets
# fi_unexpected_msg -e rdm fails with no message
fi_unexpected_msg -e rdm
-# fi_bw -e msg fails with
+# fi_flood -e msg fails with
# fi_eq_sread(): common/shared.c:1165, ret=-4 (Interrupted system call)
-fi_bw -e msg
+fi_flood -e msg
-# fi_bw fails by hanging
+# fi_flood fails by hanging
+# fi_flood fails by runfabtest timeout only on the CI.
# This is a suspected race condition
-fi_bw
+fi_flood
# fi_msg_pingpong fails with
# fi_eq_sread(): common/shared.c:1127, ret=-4 (Interrupted system call)