From 37914f3cd65b0bbe8bbed8c368afe7fd8becda6f Mon Sep 17 00:00:00 2001 From: Alexey Marchuk Date: Mon, 14 Sep 2020 13:47:39 +0300 Subject: [PATCH] perf: Add cli params to enable/disable zcopy Usage: -z sock_impl_name - disable zcopy -Z sock_impl_name - enable zcopy Change-Id: I02b628c63ca6e9e80f81e4571aebdd76fdf90be2 Signed-off-by: Alexey Marchuk Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4214 Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Jim Harris --- examples/nvme/perf/perf.c | 43 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/examples/nvme/perf/perf.c b/examples/nvme/perf/perf.c index e03ceaf77..a5a638c2d 100644 --- a/examples/nvme/perf/perf.c +++ b/examples/nvme/perf/perf.c @@ -48,6 +48,7 @@ #include "spdk/util.h" #include "spdk/log.h" #include "spdk/likely.h" +#include "spdk/sock.h" #ifdef SPDK_CONFIG_URING #include @@ -268,6 +269,38 @@ static int g_file_optind; /* Index of first filename in argv */ static inline void task_complete(struct perf_task *task); +static void +perf_set_sock_zcopy(const char *impl_name, bool enable) +{ + struct spdk_sock_impl_opts sock_opts = {}; + size_t opts_size = sizeof(sock_opts); + int rc; + + rc = spdk_sock_impl_get_opts(impl_name, &sock_opts, &opts_size); + if (rc != 0) { + if (errno == EINVAL) { + fprintf(stderr, "Unknown sock impl %s\n", impl_name); + } else { + fprintf(stderr, "Failed to get opts for sock impl %s: error %d (%s)\n", impl_name, errno, + strerror(errno)); + } + return; + } + + if (opts_size != sizeof(sock_opts)) { + fprintf(stderr, "Warning: sock_opts size mismatch. Expected %zu, received %zu\n", + sizeof(sock_opts), opts_size); + opts_size = sizeof(sock_opts); + } + + sock_opts.enable_zerocopy_send = enable; + + if (spdk_sock_impl_set_opts(impl_name, &sock_opts, opts_size)) { + fprintf(stderr, "Failed to %s zcopy send for sock impl %s: error %d (%s)\n", + enable ? "enable" : "disable", impl_name, errno, strerror(errno)); + } +} + #ifdef SPDK_CONFIG_URING static void @@ -1387,6 +1420,8 @@ static void usage(char *program_name) printf("\t"); spdk_log_usage(stdout, "-T"); printf("\t[-V enable VMD enumeration]\n"); + printf("\t[-z disable zero copy send for the given sock implementation]\n"); + printf("\t[-Z enable zero copy send for the given sock implementation. Default for posix impl]\n"); #ifdef SPDK_CONFIG_URING printf("\t[-R enable using liburing to drive kernel devices (Default: libaio)]\n"); #endif @@ -1801,7 +1836,7 @@ parse_args(int argc, char **argv) long int val; int rc; - while ((op = getopt(argc, argv, "a:c:e:i:lo:q:r:k:s:t:w:C:DGHILM:NP:RT:U:V")) != -1) { + while ((op = getopt(argc, argv, "a:c:e:i:lo:q:r:k:s:t:w:z:C:DGHILM:NP:RT:U:VZ:")) != -1) { switch (op) { case 'a': case 'i': @@ -1930,6 +1965,12 @@ parse_args(int argc, char **argv) case 'V': g_vmd = true; break; + case 'z': + perf_set_sock_zcopy(optarg, false); + break; + case 'Z': + perf_set_sock_zcopy(optarg, true); + break; default: usage(argv[0]); return 1;