From 722c7303863ef6791d19dfe793d85fe2bd0f6540 Mon Sep 17 00:00:00 2001 From: Michal Bloch Date: Tue, 12 Mar 2024 12:34:05 +0100 Subject: [PATCH] kdbus benchmark: add payload arg Also print results every 10s instead of 1s for better averaging Change-Id: Ib13b5378b4233c6a71b9a61814c7f2f644cef34b --- tests/kdbus/kdbus-test.c | 10 ++++++++++ tests/kdbus/kdbus-test.h | 1 + tests/kdbus/test-benchmark.c | 32 +++++++++++++++++++++----------- 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/tests/kdbus/kdbus-test.c b/tests/kdbus/kdbus-test.c index a2650b2..058fcb1 100644 --- a/tests/kdbus/kdbus-test.c +++ b/tests/kdbus/kdbus-test.c @@ -46,6 +46,7 @@ struct kdbus_test_args { int wait; int fork; int tap_output; + size_t payload; unsigned nTests; char const * const *tests; char *module; @@ -365,6 +366,7 @@ static wur int test_prepare_env(const struct kdbus_test *t, const struct kdbus_test_args *args, struct kdbus_test_env *env) { + env->payload = args->payload; if (t->flags & TEST_CREATE_BUS) { char *s; char *n = NULL; @@ -621,6 +623,7 @@ static void usage(const char *argv0) "\t-t, --test Run one specific test only, in verbose mode\n" "\t-b, --bus Instead of generating a random bus name, take .\n" "\t-w, --wait Wait before actually starting test\n" + "\t --payload Benchmark: set payload size\n" "\t --mntns New mount namespace\n" "\t --pidns New PID namespace\n" "\t --userns New user namespace\n" @@ -898,10 +901,12 @@ wur int main(int argc, char *argv[]) ARG_USERNS, ARG_UIDMAP, ARG_GIDMAP, + ARG_PAYLOAD, }; memset(&kdbus_args, 0, sizeof(kdbus_args)); kdbus_args.module = "kdbus"; + kdbus_args.payload = 8192; static const struct option options[] = { { "loop", no_argument, NULL, 'x' }, @@ -920,6 +925,7 @@ wur int main(int argc, char *argv[]) { "userns", no_argument, NULL, ARG_USERNS }, { "uidmap", required_argument, NULL, ARG_UIDMAP }, { "gidmap", required_argument, NULL, ARG_GIDMAP }, + { "payload", required_argument, NULL, ARG_PAYLOAD }, {} }; @@ -994,6 +1000,10 @@ wur int main(int argc, char *argv[]) kdbus_args.gid_map = optarg; break; + case ARG_PAYLOAD: + kdbus_args.payload = strtol(optarg, NULL, 10); + break; + case 'h': usage(argv[0]); diff --git a/tests/kdbus/kdbus-test.h b/tests/kdbus/kdbus-test.h index 41f854e..def9b7d 100644 --- a/tests/kdbus/kdbus-test.h +++ b/tests/kdbus/kdbus-test.h @@ -10,6 +10,7 @@ struct kdbus_test_env { const char *root; const char *module; int control_fd; + size_t payload; struct kdbus_conn *conn; }; diff --git a/tests/kdbus/test-benchmark.c b/tests/kdbus/test-benchmark.c index f7c64a5..af87d85 100644 --- a/tests/kdbus/test-benchmark.c +++ b/tests/kdbus/test-benchmark.c @@ -33,7 +33,7 @@ static bool use_memfd = true; /* transmit memfd? */ static bool compare_uds = false; /* unix-socket comparison? */ static bool attach_none = false; /* clear attach-flags? */ -static char stress_payload[8192]; +static char *stress_payload; struct stats { uint64_t count; @@ -94,6 +94,7 @@ static void add_stats(uint64_t prev) static wur int setup_simple_kdbus_msg(struct kdbus_conn *conn, uint64_t dst_id, + size_t payload_size, struct kdbus_msg **msg_out) { struct kdbus_msg *msg; @@ -117,7 +118,7 @@ static wur int setup_simple_kdbus_msg(struct kdbus_conn *conn, item->type = KDBUS_ITEM_PAYLOAD_VEC; item->size = KDBUS_ITEM_HEADER_SIZE + sizeof(struct kdbus_vec); item->vec.address = (uintptr_t) stress_payload; - item->vec.size = sizeof(stress_payload); + item->vec.size = payload_size; item = KDBUS_ITEM_NEXT(item); *msg_out = msg; @@ -127,6 +128,7 @@ static wur int setup_simple_kdbus_msg(struct kdbus_conn *conn, static wur int setup_memfd_kdbus_msg(struct kdbus_conn *conn, uint64_t dst_id, + size_t payload_size, off_t *memfd_item_offset, struct kdbus_msg **msg_out) { @@ -152,7 +154,7 @@ static wur int setup_memfd_kdbus_msg(struct kdbus_conn *conn, item->type = KDBUS_ITEM_PAYLOAD_VEC; item->size = KDBUS_ITEM_HEADER_SIZE + sizeof(struct kdbus_vec); item->vec.address = (uintptr_t) stress_payload; - item->vec.size = sizeof(stress_payload); + item->vec.size = payload_size; item = KDBUS_ITEM_NEXT(item); item->type = KDBUS_ITEM_PAYLOAD_MEMFD; @@ -254,7 +256,7 @@ out: static wur int benchmark(struct kdbus_test_env *env) { - static char buf[sizeof(stress_payload)]; + char *buf; struct kdbus_msg *kdbus_msg = NULL; off_t memfd_cached_offset = 0; int ret; @@ -266,7 +268,13 @@ static wur int benchmark(struct kdbus_test_env *env) setlocale(LC_ALL, ""); - for (i = 0; i < sizeof(stress_payload); i++) + stress_payload = malloc(env->payload); + ASSERT_NONZERO(stress_payload); + + buf = malloc(env->payload); + ASSERT_NONZERO(buf); + + for (i = 0; i < env->payload; i++) stress_payload[i] = i; /* setup kdbus pair */ @@ -291,9 +299,9 @@ static wur int benchmark(struct kdbus_test_env *env) /* setup a kdbus msg now */ if (use_memfd) - ASSERT_ZERO(setup_memfd_kdbus_msg(conn_b, conn_a->id, &memfd_cached_offset, &kdbus_msg)); + ASSERT_ZERO(setup_memfd_kdbus_msg(conn_b, conn_a->id, env->payload, &memfd_cached_offset, &kdbus_msg)); else - ASSERT_ZERO(setup_simple_kdbus_msg(conn_b, conn_a->id, &kdbus_msg)); + ASSERT_ZERO(setup_simple_kdbus_msg(conn_b, conn_a->id, env->payload, &kdbus_msg)); /* start benchmark */ @@ -351,13 +359,13 @@ static wur int benchmark(struct kdbus_test_env *env) fds[1].fd = uds[1]; /* cancel any pending message */ - UNUSED(read(uds[1], buf, sizeof(buf))); + UNUSED(read(uds[1], buf, env->payload)); start = now(CLOCK_REALTIME); reset_stats(); send_ns = now(CLOCK_REALTIME); - ASSERT_RETURN((typeof(write(uds[0], stress_payload, sizeof(stress_payload))))sizeof(stress_payload),==,write(uds[0], stress_payload, sizeof(stress_payload))); + ASSERT_RETURN((typeof(write(uds[0], stress_payload, env->payload)))env->payload,==,write(uds[0], stress_payload, env->payload)); while (1) { unsigned int nfds = sizeof(fds) / sizeof(fds[0]); @@ -372,12 +380,12 @@ static wur int benchmark(struct kdbus_test_env *env) break; if (fds[1].revents & POLLIN) { - ASSERT_RETURN((typeof(read(uds[1], buf, sizeof(buf))))sizeof(buf),==,read(uds[1], buf, sizeof(buf))); + ASSERT_RETURN((typeof(read(uds[1], buf, env->payload)))env->payload,==,read(uds[1], buf, env->payload)); add_stats(send_ns); send_ns = now(CLOCK_REALTIME); - ASSERT_RETURN((typeof(write(uds[0], buf, sizeof(buf))))sizeof(buf),==,write(uds[0], buf, sizeof(buf))); + ASSERT_RETURN((typeof(write(uds[0], buf, env->payload)))env->payload,==,write(uds[0], buf, env->payload)); } now_ns = now(CLOCK_REALTIME); @@ -395,6 +403,8 @@ static wur int benchmark(struct kdbus_test_env *env) kdbus_printf("-- closing bus connections\n"); free(kdbus_msg); + free(buf); + free(stress_payload); kdbus_conn_free(conn_a); kdbus_conn_free(conn_b); -- 2.34.1