From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 0A228A0561 for ; Fri, 28 Feb 2020 09:32:18 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E34301BFDA; Fri, 28 Feb 2020 09:32:17 +0100 (CET) Received: from mail-pg1-f193.google.com (mail-pg1-f193.google.com [209.85.215.193]) by dpdk.org (Postfix) with ESMTP id C8C4A1BFDA for ; Fri, 28 Feb 2020 09:32:16 +0100 (CET) Received: by mail-pg1-f193.google.com with SMTP id d9so1144583pgu.3 for ; Fri, 28 Feb 2020 00:32:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:references:from:cc:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=cdFM1QzOuyNhlM6r/evjZ+0F2scxDMILHBfJl1y/FqU=; b=rqv0D9Sm6Oo7oT6IBYWH0kEo3578RdxjI4kJYdIivOh3yp7Fm3DVepl4RBhSGGZNbt MsHNU59UGCUuwGABRzG+JCmJoX2/xouV9E0fCXnmRuQlKlDVKQ1WYLtxkTsY+rb3skP6 NEPY8XBhpv3d3QnU8whpcWEmR5qrrNaaRHjRuB9Wv2PKq7AzGed+YLDluQMBBXKArlBy /DVEtpT3hDsSy+6ll+p6oieYiSzfGsmfMRenjrs+x26S6im+csUNmL6rtbKIpX/lG0e4 cYxXQvRQPrp3lOQe0z6EosPwg7/nGNAAheCgMG8zPHjUPGgcVF0miepoWqXzKTBPB63f FVvw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:cc:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=cdFM1QzOuyNhlM6r/evjZ+0F2scxDMILHBfJl1y/FqU=; b=jZfIzuZI+wB+e7+07p7iEhE+yz+aOZkF2Ye1rqgYxESPZI/lMrnhZ0CbsQ6bc661Ec NaJmOayN4ZLyJLix/05FsZKcHI8FIm2Nw/SK1J99J91h2HgInRt8wZAJ/hYsuqfbcNdc AL0Aqr3flIqJ0OSP1m4kekogWVcwxoybliOArnEDwyQ3bO+quQa5hRbsR37MtKf8HvBw dVXxjqCLZmH0K4oJjv+pvKMmFK0dW1Pb7GaSCSH330Kt444sCOTWvLtjn7krxTN+WyJc YWyTH2wTWAzRAv1m3Mv0uaxrA2kFWZaZsWzjvPYnWC0NgPSYdAAbfGWjwQ7gsQYSu+Mq 2lfg== X-Gm-Message-State: APjAAAU2vVXRTO78BqvMxqfxI9FHS5iS9dXtcCikmE2bDRmn5QR9oyTV hdcANSrl1IhOc8F4o39pL/Ji2P3t X-Google-Smtp-Source: APXvYqxvzZmFh8bRGuUjMmjpq06DNqPYhbhFobZLsv74poTPChSe35aBPirDbLTW4xZyfya97YuXLQ== X-Received: by 2002:a63:cb11:: with SMTP id p17mr3551339pgg.42.1582878735871; Fri, 28 Feb 2020 00:32:15 -0800 (PST) Received: from mugwort.local ([192.47.164.146]) by smtp.gmail.com with ESMTPSA id y1sm9291024pgi.56.2020.02.28.00.32.14 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 28 Feb 2020 00:32:15 -0800 (PST) To: Itsuro Oda References: <20200226020245.3037-1-oda@valinux.co.jp> <20200227042512.22098-1-oda@valinux.co.jp> <20200227042512.22098-2-oda@valinux.co.jp> From: Yasufumi Ogawa Cc: spp@dpdk.org, ferruh.yigit@intel.com Message-ID: <77d939c7-6bfa-91ac-341c-e87666dc730f@gmail.com> Date: Fri, 28 Feb 2020 17:32:13 +0900 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:68.0) Gecko/20100101 Thunderbird/68.5.0 MIME-Version: 1.0 In-Reply-To: <20200227042512.22098-2-oda@valinux.co.jp> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit Subject: Re: [spp] [PATCH v2 1/3] vdev_test: simple tool to perform packet forwarding for vdev X-BeenThere: spp@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Soft Patch Panel List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: spp-bounces@dpdk.org Sender: "spp" This is the second one. $ checkpatches.sh patches/0013-vdev_test-simple-tool-to-perform-packet-forwarding-f.patch ### [PATCH 13/15] vdev_test: simple tool to perform packet forwarding for vdev ERROR:INITIALISED_STATIC: do not initialise statics to 0 #85: FILE: tools/vdev_test/vdev_test.c:29: +static int tx_first = 0; ERROR:INITIALISED_STATIC: do not initialise statics to NULL #87: FILE: tools/vdev_test/vdev_test.c:31: +static char *devargs = NULL; ERROR:CODE_INDENT: code indent should use tabs where possible #103: FILE: tools/vdev_test/vdev_test.c:47: + int c;$ WARNING:LEADING_SPACE: please, no spaces at the start of a line #103: FILE: tools/vdev_test/vdev_test.c:47: + int c;$ ERROR:CODE_INDENT: code indent should use tabs where possible #105: FILE: tools/vdev_test/vdev_test.c:49: + while ((c = getopt_long(argc, argv, "", lopts, NULL)) != -1) {$ WARNING:LEADING_SPACE: please, no spaces at the start of a line #105: FILE: tools/vdev_test/vdev_test.c:49: + while ((c = getopt_long(argc, argv, "", lopts, NULL)) != -1) {$ ERROR:CODE_INDENT: code indent should use tabs where possible #106: FILE: tools/vdev_test/vdev_test.c:50: + switch (c) {$ WARNING:LEADING_SPACE: please, no spaces at the start of a line #106: FILE: tools/vdev_test/vdev_test.c:50: + switch (c) {$ ERROR:CODE_INDENT: code indent should use tabs where possible #107: FILE: tools/vdev_test/vdev_test.c:51: + case 0:$ WARNING:LEADING_SPACE: please, no spaces at the start of a line #107: FILE: tools/vdev_test/vdev_test.c:51: + case 0:$ ERROR:CODE_INDENT: code indent should use tabs where possible #108: FILE: tools/vdev_test/vdev_test.c:52: + /* long option */$ ERROR:CODE_INDENT: code indent should use tabs where possible #109: FILE: tools/vdev_test/vdev_test.c:53: + break;$ WARNING:LEADING_SPACE: please, no spaces at the start of a line #109: FILE: tools/vdev_test/vdev_test.c:53: + break;$ ERROR:CODE_INDENT: code indent should use tabs where possible #114: FILE: tools/vdev_test/vdev_test.c:58: + default:$ ERROR:CODE_INDENT: code indent should use tabs where possible #115: FILE: tools/vdev_test/vdev_test.c:59: + /* invalid option */$ ERROR:CODE_INDENT: code indent should use tabs where possible #117: FILE: tools/vdev_test/vdev_test.c:61: + }$ WARNING:LEADING_SPACE: please, no spaces at the start of a line #117: FILE: tools/vdev_test/vdev_test.c:61: + }$ ERROR:CODE_INDENT: code indent should use tabs where possible #118: FILE: tools/vdev_test/vdev_test.c:62: + }$ WARNING:LEADING_SPACE: please, no spaces at the start of a line #118: FILE: tools/vdev_test/vdev_test.c:62: + }$ WARNING:BRACES: braces {} are not necessary for single statement blocks #120: FILE: tools/vdev_test/vdev_test.c:64: + if (optind != argc - 1) { + return -1; + } ERROR:CODE_INDENT: code indent should use tabs where possible #126: FILE: tools/vdev_test/vdev_test.c:70: + return 0;$ WARNING:LEADING_SPACE: please, no spaces at the start of a line #126: FILE: tools/vdev_test/vdev_test.c:70: + return 0;$ ERROR:CODE_INDENT: code indent should use tabs where possible #143: FILE: tools/vdev_test/vdev_test.c:87: + struct rte_mbuf *m;$ WARNING:LEADING_SPACE: please, no spaces at the start of a line #143: FILE: tools/vdev_test/vdev_test.c:87: + struct rte_mbuf *m;$ WARNING:BRACES: braces {} are not necessary for single statement blocks #155: FILE: tools/vdev_test/vdev_test.c:99: + if (ret < 0) { + rte_exit(EXIT_FAILURE, "EAL initialization failed\n"); + } WARNING:LONG_LINE: line over 80 characters #167: FILE: tools/vdev_test/vdev_test.c:111: + printf("device: %s tx_first: %d devargs: %s\n", device, tx_first, devargs); WARNING:BRACES: braces {} are not necessary for single statement blocks #170: FILE: tools/vdev_test/vdev_test.c:114: + if (rte_eal_process_type() != RTE_PROC_SECONDARY) { + rte_exit(EXIT_FAILURE, "must be secondary\n"); + } WARNING:BRACES: braces {} are not necessary for single statement blocks #196: FILE: tools/vdev_test/vdev_test.c:140: + if (ret < 0) { + rte_exit(EXIT_FAILURE, "device not found\n"); + } WARNING:UNSPECIFIED_INT: Prefer 'unsigned int' to bare use of 'unsigned' #199: FILE: tools/vdev_test/vdev_test.c:143: + printf("port_id: %u\n", (unsigned)port_id); ERROR:CODE_INDENT: code indent should use tabs where possible #201: FILE: tools/vdev_test/vdev_test.c:145: + nb_ports = rte_eth_dev_count_avail();$ WARNING:LEADING_SPACE: please, no spaces at the start of a line #201: FILE: tools/vdev_test/vdev_test.c:145: + nb_ports = rte_eth_dev_count_avail();$ ERROR:CODE_INDENT: code indent should use tabs where possible #203: FILE: tools/vdev_test/vdev_test.c:147: + printf("num port: %u\n", (unsigned)nb_ports);$ WARNING:LEADING_SPACE: please, no spaces at the start of a line #203: FILE: tools/vdev_test/vdev_test.c:147: + printf("num port: %u\n", (unsigned)nb_ports);$ WARNING:UNSPECIFIED_INT: Prefer 'unsigned int' to bare use of 'unsigned' #203: FILE: tools/vdev_test/vdev_test.c:147: + printf("num port: %u\n", (unsigned)nb_ports); ERROR:CODE_INDENT: code indent should use tabs where possible #208: FILE: tools/vdev_test/vdev_test.c:152: + mbuf_pool = rte_pktmbuf_pool_create("MBUF_POOL", NUM_MBUFS,$ WARNING:LEADING_SPACE: please, no spaces at the start of a line #208: FILE: tools/vdev_test/vdev_test.c:152: + mbuf_pool = rte_pktmbuf_pool_create("MBUF_POOL", NUM_MBUFS,$ ERROR:CODE_INDENT: code indent should use tabs where possible #209: FILE: tools/vdev_test/vdev_test.c:153: + MBUF_CACHE_SIZE, 0, RTE_MBUF_DEFAULT_BUF_SIZE,$ WARNING:LEADING_SPACE: please, no spaces at the start of a line #209: FILE: tools/vdev_test/vdev_test.c:153: + MBUF_CACHE_SIZE, 0, RTE_MBUF_DEFAULT_BUF_SIZE,$ WARNING:BRACES: braces {} are not necessary for single statement blocks #212: FILE: tools/vdev_test/vdev_test.c:156: + if (mbuf_pool == NULL) { + rte_exit(EXIT_FAILURE, "Cannot get mbuf pool\n"); + } WARNING:BRACES: braces {} are not necessary for single statement blocks #216: FILE: tools/vdev_test/vdev_test.c:160: + if (strncmp("virtio_user", device, 11) == 0) { + port_conf.intr_conf.lsc = 1; + } WARNING:BRACES: braces {} are not necessary for single statement blocks #220: FILE: tools/vdev_test/vdev_test.c:164: + if (ret != 0) { + rte_exit(EXIT_FAILURE, "rte_eth_dev_configure failed\n"); + } WARNING:BRACES: braces {} are not necessary for single statement blocks #226: FILE: tools/vdev_test/vdev_test.c:170: + if (ret < 0) { + rte_exit(EXIT_FAILURE, "rte_eth_rx_queue_setup failed\n"); + } WARNING:BRACES: braces {} are not necessary for single statement blocks #232: FILE: tools/vdev_test/vdev_test.c:176: + if (ret < 0) { + rte_exit(EXIT_FAILURE, "rte_eth_tx_queue_setup failed\n"); + } WARNING:BRACES: braces {} are not necessary for single statement blocks #237: FILE: tools/vdev_test/vdev_test.c:181: + if (ret < 0) { + rte_exit(EXIT_FAILURE, "rte_eth_dev_start failed\n"); + } WARNING:BRACES: braces {} are not necessary for single statement blocks #272: FILE: tools/vdev_test/vdev_test.c:216: + for (buf = nb_tx; buf < nb_rx; buf++) { + rte_pktmbuf_free(bufs[buf]); + } WARNING:LINE_CONTINUATIONS: Avoid unnecessary line continuations #287: FILE: tools/vdev_test/vdev_test.c:231: + total = (t1.tv_sec - t0.tv_sec) * 1000000 \ WARNING:BRACES: braces {} are not necessary for single statement blocks #298: FILE: tools/vdev_test/vdev_test.c:242: + if (devargs) { + rte_eal_hotplug_remove("vdev", device); + } total: 18 errors, 29 warnings, 272 lines checked 0/1 valid patch On 2020/02/27 13:25, Itsuro Oda wrote: > vdev_test is a simple tool to perform packet forwarding for > virtual ethernet devices. It is mainly to test pipe PMD > because testpmd can not be secondary process but vdev_test > can be. > > Signed-off-by: Itsuro Oda > --- > tools/vdev_test/Makefile | 25 ++++ > tools/vdev_test/vdev_test.c | 247 ++++++++++++++++++++++++++++++++++++ > 2 files changed, 272 insertions(+) > create mode 100644 tools/vdev_test/Makefile > create mode 100644 tools/vdev_test/vdev_test.c > > diff --git a/tools/vdev_test/Makefile b/tools/vdev_test/Makefile > new file mode 100644 > index 0000000..aabd9c4 > --- /dev/null > +++ b/tools/vdev_test/Makefile > @@ -0,0 +1,25 @@ > +# SPDX-License-Identifier: BSD-3-Clause > +# Copyright(c) 2020 Nippon Telegraph and Telephone Corporation > + > +ifeq ($(RTE_SDK),) > +$(error "Please define RTE_SDK environment variable") > +endif > + > +# Default target, can be overridden by command line or environment > +RTE_TARGET ?= x86_64-native-linuxapp-gcc > + > +include $(RTE_SDK)/mk/rte.vars.mk > + > +# binary name > +APP = vdev_test > + > +# all source are stored in SRCS-y > +SRCS-y := vdev_test.c > + > +CFLAGS += -O3 > +CFLAGS += $(WERROR_FLAGS) > + > +SPP_DRIVERS_DIR = $(BASE_OUTPUT)/src/drivers > +EXTRA_LDLIBS = -L$(SPP_DRIVERS_DIR)/vhost -L$(SPP_DRIVERS_DIR)/pipe --whole-archive -lrte_pmd_spp_vhost -lrte_pmd_spp_pipe --no-whole-archive > + > +include $(RTE_SDK)/mk/rte.extapp.mk > diff --git a/tools/vdev_test/vdev_test.c b/tools/vdev_test/vdev_test.c > new file mode 100644 > index 0000000..f7eb507 > --- /dev/null > +++ b/tools/vdev_test/vdev_test.c > @@ -0,0 +1,247 @@ > +/* SPDX-License-Identifier: BSD-3-Clause > + * Copyright(c) 2019 Nippon Telegraph and Telephone Corporation > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#define RING_SIZE 128 > +#define BURST_SIZE 32 > +#define NUM_MBUFS 8191 > +#define MBUF_CACHE_SIZE 512 > + > +#define PKTMBUF_POOL_NAME "MProc_pktmbuf_pool" > + > +static int tx_first = 0; > +static char *device; > +static char *devargs = NULL; > +static int force_quit; > + > +static struct option lopts[] = { > + {"send", no_argument, &tx_first, 1}, > + {"create", required_argument, NULL, 'c'}, > + {NULL, 0, 0, 0} > +}; > + > +static const struct rte_eth_conf port_conf_default = { > + .rxmode = { .max_rx_pkt_len = RTE_ETHER_MAX_LEN } > +}; > + > +static int > +parse_args(int argc, char *argv[]) > +{ > + int c; > + > + while ((c = getopt_long(argc, argv, "", lopts, NULL)) != -1) { > + switch (c) { > + case 0: > + /* long option */ > + break; > + case 'c': > + /* --create */ > + devargs = optarg; > + break; > + default: > + /* invalid option */ > + return -1; > + } > + } > + > + if (optind != argc - 1) { > + return -1; > + } > + > + device = argv[optind]; > + > + return 0; > +} > + > +static void > +signal_handler(int signum) > +{ > + printf("signel %d recieved\n", signum); > + force_quit = 1; > +} > + > +int > +main(int argc, char *argv[]) > +{ > + int ret; > + uint16_t port_id; > + uint16_t nb_ports; > + struct rte_mempool *mbuf_pool = NULL; > + struct rte_mbuf *m; > + uint16_t nb_tx; > + struct rte_mbuf *bufs[BURST_SIZE]; > + uint16_t nb_rx; > + struct rte_eth_conf port_conf = port_conf_default; > + struct rte_eth_stats stats; > + struct timeval t0, t1; > + long total; > + uint16_t buf; > + int i; > + > + ret = rte_eal_init(argc, argv); > + if (ret < 0) { > + rte_exit(EXIT_FAILURE, "EAL initialization failed\n"); > + } > + argc -= ret; > + argv += ret; > + > + ret = parse_args(argc, argv); > + if (ret < 0) { > + rte_exit(EXIT_FAILURE, > + "usage: vdev_test -- " > + "[--send] [--create devargs] vdev\n"); > + } > + printf("device: %s tx_first: %d devargs: %s\n", device, tx_first, devargs); > + > + if (strncmp("spp_pipe", device, 8) == 0) { > + if (rte_eal_process_type() != RTE_PROC_SECONDARY) { > + rte_exit(EXIT_FAILURE, "must be secondary\n"); > + } > + } > + > + if (devargs) { > + /* --create */ > + ret = rte_eth_dev_get_port_by_name(device, &port_id); > + if (ret == 0) { > + rte_exit(EXIT_FAILURE, > + "%s already exists.\n", device); > + } > + for (i = 0; i < 3; i++) { > + ret = rte_eal_hotplug_add("vdev", device, devargs); > + if (ret == 0) > + break; > + sleep(1); > + } > + if (ret < 0) { > + pause(); > + rte_exit(EXIT_FAILURE, > + "%s %s create failed.\n", device, devargs); > + } > + } > + > + ret = rte_eth_dev_get_port_by_name(device, &port_id); > + if (ret < 0) { > + rte_exit(EXIT_FAILURE, "device not found\n"); > + } > + printf("port_id: %u\n", (unsigned)port_id); > + > + nb_ports = rte_eth_dev_count_avail(); > + /* just infomation */ > + printf("num port: %u\n", (unsigned)nb_ports); > + > + if (rte_eal_process_type() == RTE_PROC_SECONDARY) { > + mbuf_pool = rte_mempool_lookup(PKTMBUF_POOL_NAME); > + } else { > + mbuf_pool = rte_pktmbuf_pool_create("MBUF_POOL", NUM_MBUFS, > + MBUF_CACHE_SIZE, 0, RTE_MBUF_DEFAULT_BUF_SIZE, > + rte_socket_id()); > + } > + if (mbuf_pool == NULL) { > + rte_exit(EXIT_FAILURE, "Cannot get mbuf pool\n"); > + } > + > + if (strncmp("virtio_user", device, 11) == 0) { > + port_conf.intr_conf.lsc = 1; > + } > + ret = rte_eth_dev_configure(port_id, 1, 1, &port_conf); > + if (ret != 0) { > + rte_exit(EXIT_FAILURE, "rte_eth_dev_configure failed\n"); > + } > + > + ret = rte_eth_rx_queue_setup(port_id, 0, RING_SIZE, > + rte_eth_dev_socket_id(port_id), NULL, mbuf_pool); > + if (ret < 0) { > + rte_exit(EXIT_FAILURE, "rte_eth_rx_queue_setup failed\n"); > + } > + > + ret = rte_eth_tx_queue_setup(port_id, 0, RING_SIZE, > + rte_eth_dev_socket_id(port_id), NULL); > + if (ret < 0) { > + rte_exit(EXIT_FAILURE, "rte_eth_tx_queue_setup failed\n"); > + } > + > + ret = rte_eth_dev_start(port_id); > + if (ret < 0) { > + rte_exit(EXIT_FAILURE, "rte_eth_dev_start failed\n"); > + } > + > + force_quit = 0; > + signal(SIGINT, signal_handler); > + signal(SIGTERM, signal_handler); > + > + if (tx_first) { > + /* send a packet */ > + m = rte_pktmbuf_alloc(mbuf_pool); > + if (m == NULL) { > + fprintf(stderr, "rte_pktmbuf_alloc failed\n"); > + goto out; > + } > + if (rte_pktmbuf_append(m, RTE_ETHER_MIN_LEN) == NULL) { > + fprintf(stderr, "rte_pktmbuf_append failed\n"); > + goto out; > + } > + > + nb_tx = rte_eth_tx_burst(port_id, 0, &m, 1); > + if (nb_tx != 1) { > + fprintf(stderr, "can not send a packet\n"); > + rte_pktmbuf_free(m); > + goto out; > + } > + printf("send a packet\n"); > + gettimeofday(&t0, NULL); > + } > + > + /* recieve and send a packet */ > + while (!force_quit) { > + nb_rx = rte_eth_rx_burst(port_id, 0, bufs, BURST_SIZE); > + if (nb_rx > 0) { > + nb_tx = rte_eth_tx_burst(port_id, 0, bufs, nb_rx); > + for (buf = nb_tx; buf < nb_rx; buf++) { > + rte_pktmbuf_free(bufs[buf]); > + } > + } > + } > + > + gettimeofday(&t1, NULL); > + > + ret = rte_eth_stats_get(port_id, &stats); > + if (ret == 0) { > + printf("ipackets: %lu\n", stats.ipackets); > + printf("opackets: %lu\n", stats.opackets); > + printf("ierrors: %lu\n", stats.ierrors); > + printf("oerrors: %lu\n", stats.oerrors); > + if (tx_first) { > + total = (t1.tv_sec - t0.tv_sec) * 1000000 \ > + + t1.tv_usec - t0.tv_usec; > + printf("%ld us: %.2f packet/s\n", total, > + (double)stats.ipackets / total * 1000000); > + } > + } > + > +out: > + rte_eth_dev_stop(port_id); > + rte_eth_dev_close(port_id); > + > + if (devargs) { > + rte_eal_hotplug_remove("vdev", device); > + } > + > + return 0; > +} >