From patchwork Fri Jul 26 16:50:51 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 57195 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 05C471C50B; Fri, 26 Jul 2019 18:51:13 +0200 (CEST) Received: from mail-pl1-f195.google.com (mail-pl1-f195.google.com [209.85.214.195]) by dpdk.org (Postfix) with ESMTP id D1BE71C4FC for ; Fri, 26 Jul 2019 18:51:04 +0200 (CEST) Received: by mail-pl1-f195.google.com with SMTP id y8so24979499plr.12 for ; Fri, 26 Jul 2019 09:51:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=YJujDFrP/qcrLCR8gDP/xIDX4/zfNEpPB4AkU/uobzU=; b=IsY19jhTzTecx6Gj+kd8y+P6HqBNE/3ferHXRFHqCealetbetKNjGek3hjx8lE5Wmj DaiufLjocWjqAzmd6Vm+iaCTCnFMC9O7tReRnM96DRzmWBGNYS/+6H3HqPHBYK70iWL7 a9IoK7tnZtPn1xpAHn9zxN0uKv/BU9KpLKfyd0Af/3MScA5p2Cain68XVBlQbeDx2iD5 L3Daeuaf4L5Cghnv7RpvtxGETzDGszJtR76AbuaH0J9shbch0cnE43ouQWtR6HlJagFI B1yrvKYByor+o+/xRz7cXeS3RiaVuiO75cVUvHehVKx0n/FjHbZIsYSictLFrimr73/+ UppA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=YJujDFrP/qcrLCR8gDP/xIDX4/zfNEpPB4AkU/uobzU=; b=KiUhmFn4xuArITRND+rEu5CmhkXzeYvvtkDQGVu41yr79kWC6KgwJkM1eLcBYOQzSc iaAXN24JNAflKFtYcO3uUP/HkTKkmyt92pmtuodsKIrp6XZKRhMxydW4HWL6diPxGUaL Uw8cGy8onJY5j4H3LxLF/HBxn8JDli+nMwMHn7cHVmBtArU24YGHjJRobQztn9sp2Sby 5f43u6wbIJytIaxIHn7GbO05Y8M+eY/4QohenySRWT0exNnQY6Aswu/2d6GWAVRqYkyH sO6Oo8TvnKEbPMz/0VNXDKnDSkWgT4M32411S5jbrLWpJoPQjE9tSH72ju4ZV7Hki6yV SpgQ== X-Gm-Message-State: APjAAAXTVX+HVasTg3WlRvfc5JsR5aO/ODfvzlqGiObzxsub9zS3ayI4 2QDTMS3HKrrxgwWuhi01AoU+SH0K X-Google-Smtp-Source: APXvYqxQJVvxzW2dTpaDo5No2uIlOfug0NOEMO8nL1mTTfL90x6RrRgR81Xnpkw2HrWe4eyqHAE7aQ== X-Received: by 2002:a17:902:2de4:: with SMTP id p91mr66407961plb.28.1564159863341; Fri, 26 Jul 2019 09:51:03 -0700 (PDT) Received: from hermes.lan (204-195-22-127.wavecable.com. [204.195.22.127]) by smtp.gmail.com with ESMTPSA id s3sm14747747pgq.17.2019.07.26.09.51.02 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Fri, 26 Jul 2019 09:51:02 -0700 (PDT) From: Stephen Hemminger To: dev@dpdk.org Cc: Stephen Hemminger Date: Fri, 26 Jul 2019 09:50:51 -0700 Message-Id: <20190726165054.24078-2-stephen@networkplumber.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190726165054.24078-1-stephen@networkplumber.org> References: <20190709150939.31338-1-stephen@networkplumber.org> <20190726165054.24078-1-stephen@networkplumber.org> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v4 1/4] examples/multi_process/client_server_mp: check port validity X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Stephen Hemminger The mp_server incorrectly allows a port mask that included hidden ports and which later caused either lost packets or failed initialization. This fixes explicitly checking that each bit in portmask is a valid port before using it. Fixes: 5b7ba31148a8 ("ethdev: add port ownership") Signed-off-by: Stephen Hemminger --- .../client_server_mp/mp_server/args.c | 46 +++++++++++++------ .../client_server_mp/mp_server/args.h | 2 +- .../client_server_mp/mp_server/init.c | 7 +-- 3 files changed, 35 insertions(+), 20 deletions(-) diff --git a/examples/multi_process/client_server_mp/mp_server/args.c b/examples/multi_process/client_server_mp/mp_server/args.c index b0d8d7665c85..c1ab12ad00d1 100644 --- a/examples/multi_process/client_server_mp/mp_server/args.c +++ b/examples/multi_process/client_server_mp/mp_server/args.c @@ -10,6 +10,7 @@ #include #include +#include #include #include "common.h" @@ -34,6 +35,22 @@ usage(void) , progname); } +/** + * Check if port is present in the system + * It maybe owned by a device and should not be used. + */ +static int +port_is_present(uint16_t portid) +{ + uint16_t id; + + RTE_ETH_FOREACH_DEV(id) { + if (id == portid) + return 1; + } + return 0; +} + /** * The ports to be used by the application are passed in * the form of a bitmask. This function parses the bitmask @@ -41,31 +58,32 @@ usage(void) * array variable */ static int -parse_portmask(uint8_t max_ports, const char *portmask) +parse_portmask(const char *portmask) { char *end = NULL; unsigned long pm; - uint16_t count = 0; + uint16_t count; if (portmask == NULL || *portmask == '\0') return -1; /* convert parameter to a number and verify */ pm = strtoul(portmask, &end, 16); - if (end == NULL || *end != '\0' || pm == 0) + if (end == NULL || *end != '\0' || pm > UINT16_MAX || pm == 0) return -1; /* loop through bits of the mask and mark ports */ - while (pm != 0){ - if (pm & 0x01){ /* bit is set in mask, use port */ - if (count >= max_ports) - printf("WARNING: requested port %u not present" - " - ignoring\n", (unsigned)count); - else - ports->id[ports->num_ports++] = count; + for (count = 0; pm != 0; pm >>= 1, ++count) { + if ((pm & 0x1) == 0) + continue; + + if (!port_is_present(count)) { + printf("WARNING: requested port %u not present - ignoring\n", + count); + continue; } - pm = (pm >> 1); - count++; + + ports->id[ports->num_ports++] = count; } return 0; @@ -99,7 +117,7 @@ parse_num_clients(const char *clients) * on error. */ int -parse_app_args(uint16_t max_ports, int argc, char *argv[]) +parse_app_args(int argc, char *argv[]) { int option_index, opt; char **argvopt = argv; @@ -112,7 +130,7 @@ parse_app_args(uint16_t max_ports, int argc, char *argv[]) &option_index)) != EOF){ switch (opt){ case 'p': - if (parse_portmask(max_ports, optarg) != 0){ + if (parse_portmask(optarg) != 0) { usage(); return -1; } diff --git a/examples/multi_process/client_server_mp/mp_server/args.h b/examples/multi_process/client_server_mp/mp_server/args.h index 79c190a33a37..52c8cc86e6f0 100644 --- a/examples/multi_process/client_server_mp/mp_server/args.h +++ b/examples/multi_process/client_server_mp/mp_server/args.h @@ -5,6 +5,6 @@ #ifndef _ARGS_H_ #define _ARGS_H_ -int parse_app_args(uint16_t max_ports, int argc, char *argv[]); +int parse_app_args(int argc, char *argv[]); #endif /* ifndef _ARGS_H_ */ diff --git a/examples/multi_process/client_server_mp/mp_server/init.c b/examples/multi_process/client_server_mp/mp_server/init.c index 3af5dc6994bf..1b0569937b51 100644 --- a/examples/multi_process/client_server_mp/mp_server/init.c +++ b/examples/multi_process/client_server_mp/mp_server/init.c @@ -238,7 +238,7 @@ init(int argc, char *argv[]) { int retval; const struct rte_memzone *mz; - uint16_t i, total_ports; + uint16_t i; /* init EAL, parsing EAL args */ retval = rte_eal_init(argc, argv); @@ -247,9 +247,6 @@ init(int argc, char *argv[]) argc -= retval; argv += retval; - /* get total number of ports */ - total_ports = rte_eth_dev_count_total(); - /* set up array for port data */ mz = rte_memzone_reserve(MZ_PORT_INFO, sizeof(*ports), rte_socket_id(), NO_FLAGS); @@ -259,7 +256,7 @@ init(int argc, char *argv[]) ports = mz->addr; /* parse additional, application arguments */ - retval = parse_app_args(total_ports, argc, argv); + retval = parse_app_args(argc, argv); if (retval != 0) return -1; From patchwork Fri Jul 26 16:50:52 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 57196 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 303DC1C515; Fri, 26 Jul 2019 18:51:15 +0200 (CEST) Received: from mail-pl1-f194.google.com (mail-pl1-f194.google.com [209.85.214.194]) by dpdk.org (Postfix) with ESMTP id AFFBD1C4FF for ; Fri, 26 Jul 2019 18:51:05 +0200 (CEST) Received: by mail-pl1-f194.google.com with SMTP id k8so24982005plt.3 for ; Fri, 26 Jul 2019 09:51:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=8v7OSOzARnVHBELM/KAu2BccRvpC7XvWrmT3Mxp8KjI=; b=r6lOyyzm0n16mMTrTJL2LNGIxCJl1cXhOv3jdU3TdwSexQnBpXH1+VEhVgq5bmr2sg 3RMEdWxmQc5PCTeFnDgUPvxRRK9W8sp5zkX2YWM38yvzIBMTrlDo21hvakpYpv/skUjK vKlMbeFDWctB2sJ/ZAbqz61aQlqwxfGwKI/M9uRA0bQ36wU4DGHEIAen/idFsoR3o9pL B8HlS9IIouL/fExlCfPjfbFkyK2fTzUa4WtY7G24c1aC6hZpzClPfVu8b6JYLqZeIJEj kKA8PmdY6HXg/rviu+J3fQmAAJkg6FgGaxdRpxa1eiKbOD/jWe6K3q7Gv2CQ7qRQEjno PDdg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=8v7OSOzARnVHBELM/KAu2BccRvpC7XvWrmT3Mxp8KjI=; b=CMPVz2GZTgieG/TbZeOVmNkuOJFoJm8aDU7bbOYrI6wRHekTFAma3A/IhDdC01HEfb 83USbvkI+V6iRHCGxVuw/ksErdbh6uw+8SHG/TxJ9I9ruGyvds/tqCA5zaufVRHNKwLn k3QP1Ca7e2kC1FTsQ8D/MuJbEc2XEUUzJDfa0wIypmTbH4cqxNtTOgISsCXkXUfYYIB2 2iqjBVZiV0bVcurB8e4tkfVdPh7KdTPTHChgdPEKUMi036mhv7D8ieHQYwJQ0638Zgug mzuOCSFHCL1zvONlP9uZr+ZNRVBssgASOhvUhP+LyP4iuT7iIndRonFihvu5ZvonEcUg BNHg== X-Gm-Message-State: APjAAAWyWEstF9el+dActtucv1ep3mAc5AvoNAkYx1GNFsgVTYNE5Zcv eJbEkj4Y4dsT4mVdeeqNCjFSffS0 X-Google-Smtp-Source: APXvYqyTnw2CKhU/elZDMInhDDNs/54zhBjyH1T7CC+2YRG9olH1DTUtO3Qy7LsbWfVKndEGLnD89Q== X-Received: by 2002:a17:902:7781:: with SMTP id o1mr97324417pll.205.1564159864665; Fri, 26 Jul 2019 09:51:04 -0700 (PDT) Received: from hermes.lan (204-195-22-127.wavecable.com. [204.195.22.127]) by smtp.gmail.com with ESMTPSA id s3sm14747747pgq.17.2019.07.26.09.51.03 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Fri, 26 Jul 2019 09:51:03 -0700 (PDT) From: Stephen Hemminger To: dev@dpdk.org Cc: Stephen Hemminger Date: Fri, 26 Jul 2019 09:50:52 -0700 Message-Id: <20190726165054.24078-3-stephen@networkplumber.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190726165054.24078-1-stephen@networkplumber.org> References: <20190709150939.31338-1-stephen@networkplumber.org> <20190726165054.24078-1-stephen@networkplumber.org> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v4 2/4] examples/multi_process/client_server_mp - fix crash in mp_client with sparse ports X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Stephen Hemminger The mp_client crashes if run on Azure or any system where ethdev ports are owned. In that case, the tx_buffer and tx_stats for the real port were initialized correctly, but the wrong port was used. For example if the server has Ports 3 and 5. Then calling rte_eth_tx_buffer_flush on any other buffer will dereference null because the tx buffer for that port was not allocated. Also: - the flush code is common enough that it should not be marked unlikely - combine conditions to reduce indentation - avoid unnecessary if() if sent is zero. Fixes: e2366e74e029 ("examples: use buffered Tx") Signed-off-by: Stephen Hemminger --- .../client_server_mp/mp_client/client.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/multi_process/client_server_mp/mp_client/client.c b/examples/multi_process/client_server_mp/mp_client/client.c index c23dd3f378f7..361d90b54b2d 100644 --- a/examples/multi_process/client_server_mp/mp_client/client.c +++ b/examples/multi_process/client_server_mp/mp_client/client.c @@ -246,19 +246,19 @@ main(int argc, char *argv[]) for (;;) { uint16_t i, rx_pkts; - uint16_t port; rx_pkts = rte_ring_dequeue_burst(rx_ring, pkts, PKT_READ_SIZE, NULL); - if (unlikely(rx_pkts == 0)){ - if (need_flush) - for (port = 0; port < ports->num_ports; port++) { - sent = rte_eth_tx_buffer_flush(ports->id[port], client_id, - tx_buffer[port]); - if (unlikely(sent)) - tx_stats->tx[port] += sent; - } + if (rx_pkts == 0 && need_flush) { + for (i = 0; i < ports->num_ports; i++) { + uint16_t port = ports->id[i]; + + sent = rte_eth_tx_buffer_flush(port, + client_id, + tx_buffer[port]); + tx_stats->tx[port] += sent; + } need_flush = 0; continue; } From patchwork Fri Jul 26 16:50:53 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 57197 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 19E771C51D; Fri, 26 Jul 2019 18:51:19 +0200 (CEST) Received: from mail-pl1-f193.google.com (mail-pl1-f193.google.com [209.85.214.193]) by dpdk.org (Postfix) with ESMTP id 2E62C1C504 for ; Fri, 26 Jul 2019 18:51:07 +0200 (CEST) Received: by mail-pl1-f193.google.com with SMTP id 4so17978762pld.10 for ; Fri, 26 Jul 2019 09:51:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=A5i/wMMYD/NDjvQ76cpx2QG8xWB7hvVmCM8nmfWvIKY=; b=Ju1tcU04mZ+UbLghaRxp9CWQuIq+WOD+B9kKSMQrLPSLHKi0JjVeTulcVptQ8DM1M/ pCamDXxA5i93cRkljBqTujUTzjc9yvxer1gT7viROuSICvreKxBlScKwu4hRQR9UkxL+ 1IUzrj51UHIiw88j1BCZUMf4UZGwDZrWgGjzRfVhj4UsO4iEEB/0gLy/Vl7zjyzzXAz1 vJsY4pXWssFQ94KhGj/yr0f4flf02ExA1tsfNIzNnCbiKSPBrlLKk9DyEhwixKl07tL3 0uM8/fxlej9z6lz32S27GJhwjVdVHun8Lbrwi34it3qS7e1QZC8b84IXYzh5c7sOgQ78 Eb9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=A5i/wMMYD/NDjvQ76cpx2QG8xWB7hvVmCM8nmfWvIKY=; b=E7KtKFrF9rMidAhm0BwWm7CFuaqUU4uvGQVdR68GT9IlVSNVmMzJChplItq8BUZ6Ae YsRK1qBTnjZ1VIzYZyYBxArwV8Q1xls8wRfayHLQGBVSpgF+Unc8wsH9xyr3nXGSi2Vh p9dXrSaiCH6SnKNJHObEEz1BpqQrxhgOKmv3wgQti5nLc7lcgXCPK47O3KcAqotMZKeO ya2g0t26JPrkO11ej0FioXqC/JPxClUYcq72NfFYUJaquoMlCil5Qe3dGobfFSC1b3ez eeVRjfcjGm6++hGrL9kstDdHTsju4+IWq814n75MMKzfkLCWl4MmbtRLxlR6cCfTySgH KJgA== X-Gm-Message-State: APjAAAX7Uu7b7fIbAuIA5m4pC12CWCWlveRSBBZ2XdehH8igwI40C23/ zAHvb9+pek5DxSs+WGD1XBHdGTtJ X-Google-Smtp-Source: APXvYqw1cXNGQZc78x5+eFdPJBivNNiiSsC6/qyBtSwAs5tYLDG7/HGjNGlmurZZLjvAcI4WxcyF0g== X-Received: by 2002:a17:902:4283:: with SMTP id h3mr94483516pld.15.1564159865826; Fri, 26 Jul 2019 09:51:05 -0700 (PDT) Received: from hermes.lan (204-195-22-127.wavecable.com. [204.195.22.127]) by smtp.gmail.com with ESMTPSA id s3sm14747747pgq.17.2019.07.26.09.51.04 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Fri, 26 Jul 2019 09:51:04 -0700 (PDT) From: Stephen Hemminger To: dev@dpdk.org Cc: Stephen Hemminger Date: Fri, 26 Jul 2019 09:50:53 -0700 Message-Id: <20190726165054.24078-4-stephen@networkplumber.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190726165054.24078-1-stephen@networkplumber.org> References: <20190709150939.31338-1-stephen@networkplumber.org> <20190726165054.24078-1-stephen@networkplumber.org> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v4 3/4] examples/multi_process/client_server_mp/mp_server: fix style X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Lots of little style complaints from checkpatch. Signed-off-by: Stephen Hemminger --- .../client_server_mp/mp_server/args.c | 37 ++++++------ .../client_server_mp/mp_server/init.c | 58 +++++++++++-------- .../client_server_mp/mp_server/main.c | 44 +++++++------- 3 files changed, 76 insertions(+), 63 deletions(-) diff --git a/examples/multi_process/client_server_mp/mp_server/args.c b/examples/multi_process/client_server_mp/mp_server/args.c index c1ab12ad00d1..f8c501a13d5e 100644 --- a/examples/multi_process/client_server_mp/mp_server/args.c +++ b/examples/multi_process/client_server_mp/mp_server/args.c @@ -127,33 +127,34 @@ parse_app_args(int argc, char *argv[]) progname = argv[0]; while ((opt = getopt_long(argc, argvopt, "n:p:", lgopts, - &option_index)) != EOF){ - switch (opt){ - case 'p': - if (parse_portmask(optarg) != 0) { - usage(); - return -1; - } - break; - case 'n': - if (parse_num_clients(optarg) != 0){ - usage(); - return -1; - } - break; - default: - printf("ERROR: Unknown option '%c'\n", opt); + &option_index)) != EOF) { + + switch (opt) { + case 'p': + if (parse_portmask(optarg) != 0) { + usage(); + return -1; + } + break; + case 'n': + if (parse_num_clients(optarg) != 0) { usage(); return -1; + } + break; + default: + printf("ERROR: Unknown option '%c'\n", opt); + usage(); + return -1; } } - if (ports->num_ports == 0 || num_clients == 0){ + if (ports->num_ports == 0 || num_clients == 0) { usage(); return -1; } - if (ports->num_ports % 2 != 0){ + if (ports->num_ports % 2 != 0) { printf("ERROR: application requires an even number of ports to use\n"); return -1; } diff --git a/examples/multi_process/client_server_mp/mp_server/init.c b/examples/multi_process/client_server_mp/mp_server/init.c index 1b0569937b51..26416f42cf03 100644 --- a/examples/multi_process/client_server_mp/mp_server/init.c +++ b/examples/multi_process/client_server_mp/mp_server/init.c @@ -49,7 +49,7 @@ struct rte_mempool *pktmbuf_pool; /* array of info/queues for clients */ -struct client *clients = NULL; +struct client *clients; /* the port details */ struct port_info *ports; @@ -72,7 +72,8 @@ init_mbuf_pools(void) num_mbufs_server + num_mbufs_client + num_mbufs_mp_cache; /* don't pass single-producer/single-consumer flags to mbuf create as it - * seems faster to use a cache instead */ + * seems faster to use a cache instead + */ printf("Creating mbuf pool '%s' [%u mbufs] ...\n", PKTMBUF_POOL_NAME, num_mbufs); pktmbuf_pool = rte_pktmbuf_pool_create(PKTMBUF_POOL_NAME, num_mbufs, @@ -108,9 +109,11 @@ init_port(uint16_t port_num) fflush(stdout); /* Standard DPDK port initialisation - config port, then set up - * rx and tx rings */ - if ((retval = rte_eth_dev_configure(port_num, rx_rings, tx_rings, - &port_conf)) != 0) + * rx and tx rings + */ + retval = rte_eth_dev_configure(port_num, rx_rings, tx_rings, + &port_conf); + if (retval != 0) return retval; retval = rte_eth_dev_adjust_nb_rx_tx_desc(port_num, &rx_ring_size, @@ -122,22 +125,25 @@ init_port(uint16_t port_num) retval = rte_eth_rx_queue_setup(port_num, q, rx_ring_size, rte_eth_dev_socket_id(port_num), NULL, pktmbuf_pool); - if (retval < 0) return retval; + if (retval < 0) + return retval; } - for ( q = 0; q < tx_rings; q ++ ) { + for (q = 0; q < tx_rings; q++) { retval = rte_eth_tx_queue_setup(port_num, q, tx_ring_size, rte_eth_dev_socket_id(port_num), NULL); - if (retval < 0) return retval; + if (retval < 0) + return retval; } rte_eth_promiscuous_enable(port_num); retval = rte_eth_dev_start(port_num); - if (retval < 0) return retval; + if (retval < 0) + return retval; - printf( "done: \n"); + printf("done:\n"); return 0; } @@ -150,15 +156,15 @@ init_port(uint16_t port_num) static int init_shm_rings(void) { - unsigned i; - unsigned socket_id; - const char * q_name; - const unsigned ringsize = CLIENT_QUEUE_RINGSIZE; + unsigned int i, socket_id; + const char *q_name; + const unsigned int ringsize = CLIENT_QUEUE_RINGSIZE; clients = rte_malloc("client details", sizeof(*clients) * num_clients, 0); if (clients == NULL) - rte_exit(EXIT_FAILURE, "Cannot allocate memory for client program details\n"); + rte_exit(EXIT_FAILURE, + "Cannot allocate memory for client program details\n"); for (i = 0; i < num_clients; i++) { /* Create an RX queue for each client */ @@ -166,9 +172,10 @@ init_shm_rings(void) q_name = get_rx_queue_name(i); clients[i].rx_q = rte_ring_create(q_name, ringsize, socket_id, - RING_F_SP_ENQ | RING_F_SC_DEQ ); /* single prod, single cons */ + RING_F_SP_ENQ | RING_F_SC_DEQ); if (clients[i].rx_q == NULL) - rte_exit(EXIT_FAILURE, "Cannot create rx ring queue for client %u\n", i); + rte_exit(EXIT_FAILURE, + "Cannot create rx ring queue for client %u\n", i); } return 0; } @@ -195,11 +202,11 @@ check_all_ports_link_status(uint16_t port_num, uint32_t port_mask) /* print link status if flag set */ if (print_flag == 1) { if (link.link_status) - printf("Port %d Link Up - speed %u " - "Mbps - %s\n", ports->id[portid], - (unsigned)link.link_speed, - (link.link_duplex == ETH_LINK_FULL_DUPLEX) ? - ("full-duplex") : ("half-duplex\n")); + printf("Port %d Link Up - speed %u Mbps - %s-duplex\n", + ports->id[portid], + link.link_speed, + (link.link_duplex == ETH_LINK_FULL_DUPLEX) ? + "full" : "half"); else printf("Port %d Link Down\n", (uint8_t)ports->id[portid]); @@ -251,7 +258,8 @@ init(int argc, char *argv[]) mz = rte_memzone_reserve(MZ_PORT_INFO, sizeof(*ports), rte_socket_id(), NO_FLAGS); if (mz == NULL) - rte_exit(EXIT_FAILURE, "Cannot reserve memory zone for port information\n"); + rte_exit(EXIT_FAILURE, + "Cannot reserve memory zone for port information\n"); memset(mz->addr, 0, sizeof(*ports)); ports = mz->addr; @@ -269,8 +277,8 @@ init(int argc, char *argv[]) for (i = 0; i < ports->num_ports; i++) { retval = init_port(ports->id[i]); if (retval != 0) - rte_exit(EXIT_FAILURE, "Cannot initialise port %u\n", - (unsigned)i); + rte_exit(EXIT_FAILURE, + "Cannot initialise port %u\n", i); } check_all_ports_link_status(ports->num_ports, (~0x0)); diff --git a/examples/multi_process/client_server_mp/mp_server/main.c b/examples/multi_process/client_server_mp/mp_server/main.c index 0150533700f0..bfec0bef3a71 100644 --- a/examples/multi_process/client_server_mp/mp_server/main.c +++ b/examples/multi_process/client_server_mp/mp_server/main.c @@ -64,8 +64,9 @@ get_printable_mac_addr(uint16_t port) if (unlikely(port >= RTE_MAX_ETHPORTS)) return err_address; - if (unlikely(addresses[port][0]=='\0')){ + if (unlikely(addresses[port][0] == '\0')) { struct rte_ether_addr mac; + rte_eth_macaddr_get(port, &mac); snprintf(addresses[port], sizeof(addresses[port]), "%02x:%02x:%02x:%02x:%02x:%02x\n", @@ -85,9 +86,9 @@ get_printable_mac_addr(uint16_t port) static void do_stats_display(void) { - unsigned i, j; + unsigned int i, j; const char clr[] = { 27, '[', '2', 'J', '\0' }; - const char topLeft[] = { 27, '[', '1', ';', '1', 'H','\0' }; + const char topLeft[] = { 27, '[', '1', ';', '1', 'H', '\0' }; uint64_t port_tx[RTE_MAX_ETHPORTS], port_tx_drop[RTE_MAX_ETHPORTS]; uint64_t client_tx[MAX_CLIENTS], client_tx_drop[MAX_CLIENTS]; @@ -97,12 +98,14 @@ do_stats_display(void) memset(client_tx, 0, sizeof(client_tx)); memset(client_tx_drop, 0, sizeof(client_tx_drop)); - for (i = 0; i < num_clients; i++){ + for (i = 0; i < num_clients; i++) { const volatile struct tx_stats *tx = &ports->tx_stats[i]; - for (j = 0; j < ports->num_ports; j++){ + + for (j = 0; j < ports->num_ports; j++) { /* assign to local variables here, save re-reading volatile vars */ const uint64_t tx_val = tx->tx[ports->id[j]]; const uint64_t drop_val = tx->tx_drop[ports->id[j]]; + port_tx[j] += tx_val; port_tx_drop[j] += drop_val; client_tx[i] += tx_val; @@ -116,21 +119,21 @@ do_stats_display(void) printf("PORTS\n"); printf("-----\n"); for (i = 0; i < ports->num_ports; i++) - printf("Port %u: '%s'\t", (unsigned)ports->id[i], - get_printable_mac_addr(ports->id[i])); + printf("Port %u: '%s'\t", ports->id[i], + get_printable_mac_addr(ports->id[i])); printf("\n\n"); - for (i = 0; i < ports->num_ports; i++){ - printf("Port %u - rx: %9"PRIu64"\t" - "tx: %9"PRIu64"\n", - (unsigned)ports->id[i], ports->rx_stats.rx[i], + for (i = 0; i < ports->num_ports; i++) { + printf("Port %u - rx: %9"PRIu64"\ttx: %9"PRIu64"\n", + ports->id[i], ports->rx_stats.rx[i], port_tx[i]); } printf("\nCLIENTS\n"); printf("-------\n"); - for (i = 0; i < num_clients; i++){ + for (i = 0; i < num_clients; i++) { const unsigned long long rx = clients[i].stats.rx; const unsigned long long rx_drop = clients[i].stats.rx_drop; + printf("Client %2u - rx: %9llu, rx_drop: %9llu\n" " tx: %9"PRIu64", tx_drop: %9"PRIu64"\n", i, rx, rx_drop, client_tx[i], client_tx_drop[i]); @@ -153,7 +156,8 @@ sleep_lcore(__attribute__((unused)) void *dummy) /* Only one core should display stats */ if (rte_atomic32_test_and_set(&display_stats)) { - const unsigned sleeptime = 1; + const unsigned int sleeptime = 1; + printf("Core %u displaying statistics\n", rte_lcore_id()); /* Longer initial pause so above printf is seen */ @@ -173,7 +177,7 @@ sleep_lcore(__attribute__((unused)) void *dummy) static void clear_stats(void) { - unsigned i; + unsigned int i; for (i = 0; i < num_clients; i++) clients[i].stats.rx = clients[i].stats.rx_drop = 0; @@ -194,12 +198,11 @@ flush_rx_queue(uint16_t client) cl = &clients[client]; if (rte_ring_enqueue_bulk(cl->rx_q, (void **)cl_rx_buf[client].buffer, - cl_rx_buf[client].count, NULL) == 0){ + cl_rx_buf[client].count, NULL) == 0) { for (j = 0; j < cl_rx_buf[client].count; j++) rte_pktmbuf_free(cl_rx_buf[client].buffer[j]); cl->stats.rx_drop += cl_rx_buf[client].count; - } - else + } else cl->stats.rx += cl_rx_buf[client].count; cl_rx_buf[client].count = 0; @@ -243,14 +246,14 @@ process_packets(uint32_t port_num __rte_unused, static void do_packet_forwarding(void) { - unsigned port_num = 0; /* indexes the port[] array */ + unsigned int port_num = 0; /* indexes the port[] array */ for (;;) { struct rte_mbuf *buf[PACKET_READ_SIZE]; uint16_t rx_count; /* read a port */ - rx_count = rte_eth_rx_burst(ports->id[port_num], 0, \ + rx_count = rte_eth_rx_burst(ports->id[port_num], 0, buf, PACKET_READ_SIZE); ports->rx_stats.rx[port_num] += rx_count; @@ -281,8 +284,9 @@ int main(int argc, char *argv[]) { signal(SIGINT, signal_handler); + /* initialise the system */ - if (init(argc, argv) < 0 ) + if (init(argc, argv) < 0) return -1; RTE_LOG(INFO, APP, "Finished Process Init.\n"); From patchwork Fri Jul 26 16:50:54 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 57198 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E96F31C52A; Fri, 26 Jul 2019 18:51:20 +0200 (CEST) Received: from mail-pl1-f194.google.com (mail-pl1-f194.google.com [209.85.214.194]) by dpdk.org (Postfix) with ESMTP id 938B91C505 for ; Fri, 26 Jul 2019 18:51:07 +0200 (CEST) Received: by mail-pl1-f194.google.com with SMTP id k8so24982032plt.3 for ; Fri, 26 Jul 2019 09:51:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=GRL9o22FsqlZS1KIBKGsZH8PR5E+wVCUALAgsRD4EO0=; b=Lb/NsSj2iSVmJnwv/Z1M4hAA3ZsHWrFGgw/JlQnvE+RqE6Qa/uG/nxflxBgd05Bf9P gmI81FNywl4pNfPL4qD2nWhyMkbH3hWbqm1MT36ObxUrTE8q6m1lvdH0Zd/sXjmshpuz BwaLuX++FAscOK3MI09MFaarZJwEnhQkOHiXmEWxHU8SjU/LW3CEqLrwRSZLD1Tuof89 a8LjaSjJMrlUSwjjqzTF+tK/0tCdIwylnS3lCbtlhng8Fh8Mn9hFqv6tl87fNSzLYYA7 FnM4Y45vpfrLo43SBXdagGrDO+8kR45Dw4yHzgWIBe67PmH8dvZBDu2jyXbTv0F0uIbP iFVg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=GRL9o22FsqlZS1KIBKGsZH8PR5E+wVCUALAgsRD4EO0=; b=XgCyrskjEyNNuHOHM9UddnCKVyktxWBqtvtD3zUcRyspl3Mh6lI5JtiNqKrqxpHVqp Vok8us60EkXGnWud2QR3KY6xip5wGV4/qPIqEnZCCxqLoESbto9zBnch5zYFPfrEq+Bm 3pvRgBR17vZpJz7xGOQiGvggtlis7wBA40V/kUOJ1sC8hemoCAX8+YN9fdLaJAj9OS4U eIfbmSB/57gCRYh2eT44uG2eCJDYnlXocos/CTunnxyFY/+mHoBUYIHjlg+yY1fpaxFf Z9TseSAmpfy9sWY+mIbAGuhBSAuf8gaoX6kTwuIX68U9/r+dL48+s2jA/E5c6hpvF/92 62YQ== X-Gm-Message-State: APjAAAW7gLgQPbHvoXopbZCPYJ013G7o1iAeIORyOEbK6r/4WYVyFp6J CX6uKNCMZo2yN0eCxvbRLESZITxk X-Google-Smtp-Source: APXvYqzxda7+fi+Yd1i8hMIwkvL6QgsK/3v2fCmh+z8JmQ977kD+gbjBBwIT1Hq81g0by7FJeXxKDw== X-Received: by 2002:a17:902:8f81:: with SMTP id z1mr95253879plo.290.1564159866533; Fri, 26 Jul 2019 09:51:06 -0700 (PDT) Received: from hermes.lan (204-195-22-127.wavecable.com. [204.195.22.127]) by smtp.gmail.com with ESMTPSA id s3sm14747747pgq.17.2019.07.26.09.51.05 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Fri, 26 Jul 2019 09:51:06 -0700 (PDT) From: Stephen Hemminger To: dev@dpdk.org Cc: Stephen Hemminger Date: Fri, 26 Jul 2019 09:50:54 -0700 Message-Id: <20190726165054.24078-5-stephen@networkplumber.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190726165054.24078-1-stephen@networkplumber.org> References: <20190709150939.31338-1-stephen@networkplumber.org> <20190726165054.24078-1-stephen@networkplumber.org> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v4 4/4] examples/multi_process/client_server_mp/mp_server: use ether format address X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" No need to use snprintf to print ethernet address. Signed-off-by: Stephen Hemminger --- .../client_server_mp/mp_server/main.c | 32 ++++++------------- 1 file changed, 9 insertions(+), 23 deletions(-) diff --git a/examples/multi_process/client_server_mp/mp_server/main.c b/examples/multi_process/client_server_mp/mp_server/main.c index bfec0bef3a71..d1339d4be64c 100644 --- a/examples/multi_process/client_server_mp/mp_server/main.c +++ b/examples/multi_process/client_server_mp/mp_server/main.c @@ -56,26 +56,6 @@ struct client_rx_buf { /* One buffer per client rx queue - dynamically allocate array */ static struct client_rx_buf *cl_rx_buf; -static const char * -get_printable_mac_addr(uint16_t port) -{ - static const char err_address[] = "00:00:00:00:00:00"; - static char addresses[RTE_MAX_ETHPORTS][sizeof(err_address)]; - - if (unlikely(port >= RTE_MAX_ETHPORTS)) - return err_address; - if (unlikely(addresses[port][0] == '\0')) { - struct rte_ether_addr mac; - - rte_eth_macaddr_get(port, &mac); - snprintf(addresses[port], sizeof(addresses[port]), - "%02x:%02x:%02x:%02x:%02x:%02x\n", - mac.addr_bytes[0], mac.addr_bytes[1], mac.addr_bytes[2], - mac.addr_bytes[3], mac.addr_bytes[4], mac.addr_bytes[5]); - } - return addresses[port]; -} - /* * This function displays the recorded statistics for each port * and for each client. It uses ANSI terminal codes to clear @@ -118,9 +98,15 @@ do_stats_display(void) printf("PORTS\n"); printf("-----\n"); - for (i = 0; i < ports->num_ports; i++) - printf("Port %u: '%s'\t", ports->id[i], - get_printable_mac_addr(ports->id[i])); + for (i = 0; i < ports->num_ports; i++) { + struct rte_ether_addr mac = { }; + char buf[32]; + + rte_eth_macaddr_get(ports->id[i], &mac); + rte_ether_format_addr(buf, sizeof(buf), &mac); + printf("Port %u: '%s'\t", ports->id[i], buf); + } + printf("\n\n"); for (i = 0; i < ports->num_ports; i++) { printf("Port %u - rx: %9"PRIu64"\ttx: %9"PRIu64"\n",