int wait;
int fork;
int tap_output;
+ size_t payload;
unsigned nTests;
char const * const *tests;
char *module;
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;
"\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"
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' },
{ "userns", no_argument, NULL, ARG_USERNS },
{ "uidmap", required_argument, NULL, ARG_UIDMAP },
{ "gidmap", required_argument, NULL, ARG_GIDMAP },
+ { "payload", required_argument, NULL, ARG_PAYLOAD },
{}
};
kdbus_args.gid_map = optarg;
break;
+ case ARG_PAYLOAD:
+ kdbus_args.payload = strtol(optarg, NULL, 10);
+ break;
+
case 'h':
usage(argv[0]);
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;
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;
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;
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)
{
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;
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;
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 */
/* 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 */
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]);
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);
kdbus_printf("-- closing bus connections\n");
free(kdbus_msg);
+ free(buf);
+ free(stress_payload);
kdbus_conn_free(conn_a);
kdbus_conn_free(conn_b);