kdbus benchmark: add payload arg 66/308066/3
authorMichal Bloch <m.bloch@samsung.com>
Tue, 12 Mar 2024 11:34:05 +0000 (12:34 +0100)
committerMichal Bloch <m.bloch@samsung.com>
Tue, 26 Mar 2024 15:47:00 +0000 (16:47 +0100)
Also print results every 10s instead of 1s for better averaging

Change-Id: Ib13b5378b4233c6a71b9a61814c7f2f644cef34b

tests/kdbus/kdbus-test.c
tests/kdbus/kdbus-test.h
tests/kdbus/test-benchmark.c

index a2650b233dae0cad9770a59fbe32e8b48a9482da..058fcb105efd86f9ed12e772b7205546458ec393 100644 (file)
@@ -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 <test-id>  Run one specific test only, in verbose mode\n"
               "\t-b, --bus <busname>   Instead of generating a random bus name, take <busname>.\n"
               "\t-w, --wait <secs>     Wait <secs> before actually starting test\n"
+              "\t    --payload <bytes> 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]);
 
index 41f854ed864d6f53f1829f2d8c5dbc118586c07c..def9b7d9cbdce65587489c0f92a89eee3a711dda 100644 (file)
@@ -10,6 +10,7 @@ struct kdbus_test_env {
        const char *root;
        const char *module;
        int control_fd;
+       size_t payload;
        struct kdbus_conn *conn;
 };
 
index f7c64a5a49feeb989e67cf710f0bc5250d2b83f6..af87d85e2ff62e779d200d7ec7778f4e46f843ae 100644 (file)
@@ -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);