From patchwork Thu Dec 7 13:00:03 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Github ODP bot X-Patchwork-Id: 120967 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp8325653qgn; Thu, 7 Dec 2017 05:03:14 -0800 (PST) X-Google-Smtp-Source: AGs4zMYgv74/Dxcu+rhaL1NR6nHsNqt68hMv/ncF6aq9uEmIBGXNpZ9fraONGoS+7QbsTA6qlmEM X-Received: by 10.200.2.150 with SMTP id p22mr9974947qtg.328.1512651794477; Thu, 07 Dec 2017 05:03:14 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1512651794; cv=none; d=google.com; s=arc-20160816; b=iPMi3Zs4GCokm326cHWPSAPtFX07JA8zmQDzhSwj456L/76KHkTuO7iqkrYeQMXiVW TrynXyRDTN6tIqQYbdVp6OqUzTi1bBJJxFFPQP1KT8JCtLKLi+EoG+6rVF4+ArJKLP3m G/PJ8qCMHnoLl74U/hc0uCrShTWljNW5+4xxHl1mmttnF/0Zi6iyD9OSAINFW+9OfjVj oT9JbnJRx+4nCZAn0kYe5YcmAy95+SZNNZ8lEtYb32YY3h8Ry22Dj7EBn5Wt3eyLFcEJ /+tRWIEb2PEW5VMDffsjBmcAQbLbdQQM6Cm6q3OrDkGadQ5fMyBVDs0x3S7ii45zziA/ nNzA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:github-pr-num :references:in-reply-to:message-id:date:to:from:delivered-to :arc-authentication-results; bh=YTQZu0B5Ee/2FuAJCfD1aWGje2iqbVbDh2UdfUhJjz8=; b=oOt9N0W5F0CjsWDKI8+3gE+YVnPtglGJjPSwYp5BaaNyetxF7BXtoHEQOjW6Ycrzzi VsT2B97JE4nJ9cFKyUIS0omQJElwzAtxYSyPSm/Rn6/P4WxJ89o1T0qeKjgiyQLcmXdm /M1P+h3mERqCUE0sg9EgeS2FHzC5FfBYtGJ7gWMbc6r906XO6Zby8Ed2btxaO19t2+0G qMBDD6SBr+1xyU+s8746m5ErKG+vu0xQi5M+LRek4S8p8gwkB68Uz6q1PxAo+juc0XHQ mGeT245HePEc7/JaPE/NeFBJ54n7BXcYnfiJcd+3z7xpT61/IHssh0v5GZir0h7hhp+K lGRg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Return-Path: Received: from lists.linaro.org (ec2-54-197-127-237.compute-1.amazonaws.com. [54.197.127.237]) by mx.google.com with ESMTP id h126si1298658qkf.354.2017.12.07.05.03.13; Thu, 07 Dec 2017 05:03:14 -0800 (PST) Received-SPF: pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) client-ip=54.197.127.237; Authentication-Results: mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Received: by lists.linaro.org (Postfix, from userid 109) id CA8ED6097C; Thu, 7 Dec 2017 13:03:13 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on ip-10-142-244-252 X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,URIBL_BLOCKED autolearn=disabled version=3.4.0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by lists.linaro.org (Postfix) with ESMTP id 5244960951; Thu, 7 Dec 2017 13:00:36 +0000 (UTC) X-Original-To: lng-odp@lists.linaro.org Delivered-To: lng-odp@lists.linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id 0F4D1608F6; Thu, 7 Dec 2017 13:00:21 +0000 (UTC) Received: from forward106o.mail.yandex.net (forward106o.mail.yandex.net [37.140.190.187]) by lists.linaro.org (Postfix) with ESMTPS id E557A60903 for ; Thu, 7 Dec 2017 13:00:11 +0000 (UTC) Received: from mxback2j.mail.yandex.net (mxback2j.mail.yandex.net [IPv6:2a02:6b8:0:1619::10b]) by forward106o.mail.yandex.net (Yandex) with ESMTP id BAADC785A82 for ; Thu, 7 Dec 2017 16:00:09 +0300 (MSK) Received: from smtp2o.mail.yandex.net (smtp2o.mail.yandex.net [2a02:6b8:0:1a2d::26]) by mxback2j.mail.yandex.net (nwsmtp/Yandex) with ESMTP id l3k4XqY6QS-09v41j3x; Thu, 07 Dec 2017 16:00:09 +0300 Received: by smtp2o.mail.yandex.net (nwsmtp/Yandex) with ESMTPSA id 5HyJRBoKQy-08QCKFW3; Thu, 07 Dec 2017 16:00:08 +0300 (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (Client certificate not present) From: Github ODP bot To: lng-odp@lists.linaro.org Date: Thu, 7 Dec 2017 16:00:03 +0300 Message-Id: <1512651606-28483-2-git-send-email-odpbot@yandex.ru> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1512651606-28483-1-git-send-email-odpbot@yandex.ru> References: <1512651606-28483-1-git-send-email-odpbot@yandex.ru> Github-pr-num: 327 Subject: [lng-odp] [PATCH v1 1/4] example: generator: remove 1 ms sleep on send loop X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "The OpenDataPlane \(ODP\) List" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: lng-odp-bounces@lists.linaro.org Sender: "lng-odp" From: Bogdan Pricope The 1 ms sleep is reducing total packet throughput. Signed-off-by: Bogdan Pricope --- /** Email created from pull request 327 (bogdanPricope:master_update_generator_pr) ** https://github.com/Linaro/odp/pull/327 ** Patch: https://github.com/Linaro/odp/pull/327.patch ** Base sha: 811281a22b6274b7f41b926a9cfbe09e48a366bd ** Merge commit sha: 9edce40a148dd5654384464f71ff62c58d5105fa **/ example/generator/odp_generator.c | 1 - 1 file changed, 1 deletion(-) diff --git a/example/generator/odp_generator.c b/example/generator/odp_generator.c index 53b397b33..6ee4f6389 100644 --- a/example/generator/odp_generator.c +++ b/example/generator/odp_generator.c @@ -655,7 +655,6 @@ static int gen_send_thread(void *arg) burst_size - ret); burst_start += ret; burst_size -= ret; - odp_time_wait_ns(ODP_TIME_MSEC_IN_NS); continue; } EXAMPLE_ERR(" [%02i] packet send failed\n", thr); From patchwork Thu Dec 7 13:00:04 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Github ODP bot X-Patchwork-Id: 120965 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp8322520qgn; Thu, 7 Dec 2017 05:01:23 -0800 (PST) X-Google-Smtp-Source: AGs4zMaPUMQo/ME69sKnKrb1dc+6L0FNKzyobo/rVLPOpcZo3k3uVid9jmR6MYYJx4wUIHZTMpF1 X-Received: by 10.129.112.72 with SMTP id l69mr18516539ywc.506.1512651683361; Thu, 07 Dec 2017 05:01:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1512651683; cv=none; d=google.com; s=arc-20160816; b=pXFwnl92BKHEy9u0xrcrOylYoeDxq4mJIdrwdxUnwm6z+4dBWF+wMWBbpWU3zX4iSc gn/tDrYj+4+qLg9Cbcoue7kkO+G31QokYjHyIMfyrLhmNqn0yU5UfhY8wHeVPVzCMdQz WqRLpRUzDTSbbdjl2wIUvAQtg219v4ITuEHszJL3KxitIwI5DY9RavHPPY2Kd2seGC4S AD8ErYrjpVs3DX8mETSGAk3Bg+gYuleZAtORCRuEkEKU6ipHFs7gVX98rpaKvXK3qq+L mkEfiKRj9/eE57+8uxnYSY2iXh7EA5vZ9uPvRiADiGTIHC8aajcCFUnVhvrwdyMaO0/S LnVw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:github-pr-num :references:in-reply-to:message-id:date:to:from:delivered-to :arc-authentication-results; bh=nON5D6Ntv/ZBjJoYRwxTYPrpbvy8CLqiTaiATUhrju0=; b=LEdedcDOY4FT5D7p9R5WBIn0evbXGEoT5cPl/fFwCwjz5Pdm8C3k0L/12kFok/bto+ 1nf7Tt9cszcOjjZ6/CC1z0D20Wd+zKWI7BDUWMnY7/6zJzJUHeep9UdikaCuDpzqvuZE DRchudRZmAZpg6qYbjl81OQcuo4DqupRhFSDoB+eacXJT+dm0+IeGDA/u7qVaY/qAElW bW2aYvGSxwqSOHPwRFx2J/vLRMSqcEgrxylN15mnRkv/Qj5CuXzeEynKVZPMPZ51rxJg 9MkKcwyRKFeR9ejZiL3+e/aCLEyWHy6vHUhAhDpZW0idMQMJEfXoYjDAzZZqIMipVJZS nCKQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Return-Path: Received: from lists.linaro.org (ec2-54-197-127-237.compute-1.amazonaws.com. [54.197.127.237]) by mx.google.com with ESMTP id c13si2667499qth.423.2017.12.07.05.01.22; Thu, 07 Dec 2017 05:01:23 -0800 (PST) Received-SPF: pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) client-ip=54.197.127.237; Authentication-Results: mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Received: by lists.linaro.org (Postfix, from userid 109) id D12BB60973; Thu, 7 Dec 2017 13:01:22 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on ip-10-142-244-252 X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,URIBL_BLOCKED autolearn=disabled version=3.4.0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by lists.linaro.org (Postfix) with ESMTP id B9E7060918; Thu, 7 Dec 2017 13:00:25 +0000 (UTC) X-Original-To: lng-odp@lists.linaro.org Delivered-To: lng-odp@lists.linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id AEF2A6091D; Thu, 7 Dec 2017 13:00:16 +0000 (UTC) Received: from forward100o.mail.yandex.net (forward100o.mail.yandex.net [37.140.190.180]) by lists.linaro.org (Postfix) with ESMTPS id 4A2646090A for ; Thu, 7 Dec 2017 13:00:13 +0000 (UTC) Received: from mxback7j.mail.yandex.net (mxback7j.mail.yandex.net [IPv6:2a02:6b8:0:1619::110]) by forward100o.mail.yandex.net (Yandex) with ESMTP id 2CD202A24282 for ; Thu, 7 Dec 2017 16:00:11 +0300 (MSK) Received: from smtp2o.mail.yandex.net (smtp2o.mail.yandex.net [2a02:6b8:0:1a2d::26]) by mxback7j.mail.yandex.net (nwsmtp/Yandex) with ESMTP id tOHhtGDhYx-0AbG31iF; Thu, 07 Dec 2017 16:00:11 +0300 Received: by smtp2o.mail.yandex.net (nwsmtp/Yandex) with ESMTPSA id 5HyJRBoKQy-09QKJs8K; Thu, 07 Dec 2017 16:00:09 +0300 (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (Client certificate not present) From: Github ODP bot To: lng-odp@lists.linaro.org Date: Thu, 7 Dec 2017 16:00:04 +0300 Message-Id: <1512651606-28483-3-git-send-email-odpbot@yandex.ru> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1512651606-28483-1-git-send-email-odpbot@yandex.ru> References: <1512651606-28483-1-git-send-email-odpbot@yandex.ru> Github-pr-num: 327 Subject: [lng-odp] [PATCH v1 2/4] example: generator: increase maximum TX burst size to 512 X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "The OpenDataPlane \(ODP\) List" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: lng-odp-bounces@lists.linaro.org Sender: "lng-odp" From: Bogdan Pricope Bigger TX bursts may increase packet throughput. Signed-off-by: Bogdan Pricope --- /** Email created from pull request 327 (bogdanPricope:master_update_generator_pr) ** https://github.com/Linaro/odp/pull/327 ** Patch: https://github.com/Linaro/odp/pull/327.patch ** Base sha: 811281a22b6274b7f41b926a9cfbe09e48a366bd ** Merge commit sha: 9edce40a148dd5654384464f71ff62c58d5105fa **/ example/generator/odp_generator.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/example/generator/odp_generator.c b/example/generator/odp_generator.c index 6ee4f6389..47b91d6ef 100644 --- a/example/generator/odp_generator.c +++ b/example/generator/odp_generator.c @@ -26,7 +26,8 @@ #define POOL_NUM_PKT 2048 /* Number of packets in packet pool */ #define POOL_PKT_LEN 1856 /* Max packet length */ #define DEFAULT_PKT_INTERVAL 1000 /* Interval between each packet */ -#define MAX_UDP_TX_BURST 32 +#define DEFAULT_UDP_TX_BURST 16 +#define MAX_UDP_TX_BURST 512 #define MAX_RX_BURST 32 #define APPL_MODE_UDP 0 /**< UDP mode */ @@ -1311,7 +1312,7 @@ static void parse_args(int argc, char *argv[], appl_args_t *appl_args) appl_args->payload = 56; appl_args->timeout = -1; appl_args->interval = DEFAULT_PKT_INTERVAL; - appl_args->udp_tx_burst = 16; + appl_args->udp_tx_burst = DEFAULT_UDP_TX_BURST; appl_args->srcport = 0; appl_args->dstport = 0; From patchwork Thu Dec 7 13:00:05 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Github ODP bot X-Patchwork-Id: 120966 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp8323729qgn; Thu, 7 Dec 2017 05:02:04 -0800 (PST) X-Google-Smtp-Source: AGs4zMbgROfPJZDtaSge/0KUYv+oG2yvMsSuQwupFP56hkWH4qn6+TCRv9jkcJnfs5P3nu6buIFt X-Received: by 10.55.12.135 with SMTP id 129mr8440133qkm.137.1512651724803; Thu, 07 Dec 2017 05:02:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1512651724; cv=none; d=google.com; s=arc-20160816; b=iL5e2OIS2DEV/aiOM25ciaYqrSmhH9ZfaNJDI+reVyMGZiip6B4E5iGr0RUFVVSQ9m xLSOBioFHoagJZGRUSSUrl4Nz+5B5xoZg0YjU7oIGRa3z8OKd+Ta6rMBB92xmpsjZ+st ZnXaUjc1RAulFrA6MeMiwe3AwQa4k2ylbHy13BHhJeC+2v6zYdw5T+KO2w5wQeePwEV4 KTSYRLE2YF3V0iD8er1HWbcCTBOqQIswtZb0wCxCvYSyrHJJPsZ5YQbEeWiIvLohza5T B7+LVxPLl1Ed/HnWMxQzQpYcmovRzMd/yEY0qZh7wBWhDxziEp7f/059t1WsSyG7hShW QOPw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:github-pr-num :references:in-reply-to:message-id:date:to:from:delivered-to :arc-authentication-results; bh=izRUukjXYyiE7eddvaUqOqd0rfEZLinAS2yRsYoyAlo=; b=IBG1y8fLPfLro6umHDCUVM13zfNtRDvZd9PHFbhYZQVdK4vROdMqH6owIRGnQGKmSV PEE6anGxgqAQ0hqkjdruH/077u9E0qTlkJaIiQ4WRasxYfM/nyFaPKumuixl7DfNtMIy MZBBTLaqccvu47iXCcx2v55o5idxRz2y8CQzuJTTWJvD9BPFHcihyPQpOERUXbYXul5r yq32QSeUpK9ulOU68dpjb/DnsNEo9i4SVoi4ob4I0gmq70CwUSNBXhm+61zsaLzbawsR 87wL44LLDi/g8PyiEGXbKVE/IuGDpWhMlG8MNz2cekmF9RD72IVqFNfrcjR9GrsrlT8r 529Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Return-Path: Received: from lists.linaro.org (ec2-54-197-127-237.compute-1.amazonaws.com. [54.197.127.237]) by mx.google.com with ESMTP id g27si3444263qtb.187.2017.12.07.05.02.04; Thu, 07 Dec 2017 05:02:04 -0800 (PST) Received-SPF: pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) client-ip=54.197.127.237; Authentication-Results: mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Received: by lists.linaro.org (Postfix, from userid 109) id 69E7B6091D; Thu, 7 Dec 2017 13:02:04 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on ip-10-142-244-252 X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,URIBL_BLOCKED autolearn=disabled version=3.4.0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by lists.linaro.org (Postfix) with ESMTP id 2487F60926; Thu, 7 Dec 2017 13:00:30 +0000 (UTC) X-Original-To: lng-odp@lists.linaro.org Delivered-To: lng-odp@lists.linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id A80596091D; Thu, 7 Dec 2017 13:00:18 +0000 (UTC) Received: from forward100o.mail.yandex.net (forward100o.mail.yandex.net [37.140.190.180]) by lists.linaro.org (Postfix) with ESMTPS id 154EA6065D for ; Thu, 7 Dec 2017 13:00:14 +0000 (UTC) Received: from mxback8j.mail.yandex.net (mxback8j.mail.yandex.net [IPv6:2a02:6b8:0:1619::111]) by forward100o.mail.yandex.net (Yandex) with ESMTP id A91742A24227 for ; Thu, 7 Dec 2017 16:00:12 +0300 (MSK) Received: from smtp2o.mail.yandex.net (smtp2o.mail.yandex.net [2a02:6b8:0:1a2d::26]) by mxback8j.mail.yandex.net (nwsmtp/Yandex) with ESMTP id 3shDH6gVPk-0CXKdtOI; Thu, 07 Dec 2017 16:00:12 +0300 Received: by smtp2o.mail.yandex.net (nwsmtp/Yandex) with ESMTPSA id 5HyJRBoKQy-0BQmlNSN; Thu, 07 Dec 2017 16:00:11 +0300 (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (Client certificate not present) From: Github ODP bot To: lng-odp@lists.linaro.org Date: Thu, 7 Dec 2017 16:00:05 +0300 Message-Id: <1512651606-28483-4-git-send-email-odpbot@yandex.ru> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1512651606-28483-1-git-send-email-odpbot@yandex.ru> References: <1512651606-28483-1-git-send-email-odpbot@yandex.ru> Github-pr-num: 327 Subject: [lng-odp] [PATCH v1 3/4] example: generator: add configuration option for csum support X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "The OpenDataPlane \(ODP\) List" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: lng-odp-bounces@lists.linaro.org Sender: "lng-odp" From: Bogdan Pricope Add configuration option to enable platform checksum support (if available) for calculation and validation. By default, checksum calculation is performed in software and validation is disabled. Signed-off-by: Bogdan Pricope --- /** Email created from pull request 327 (bogdanPricope:master_update_generator_pr) ** https://github.com/Linaro/odp/pull/327 ** Patch: https://github.com/Linaro/odp/pull/327.patch ** Base sha: 811281a22b6274b7f41b926a9cfbe09e48a366bd ** Merge commit sha: 9edce40a148dd5654384464f71ff62c58d5105fa **/ example/generator/odp_generator.c | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/example/generator/odp_generator.c b/example/generator/odp_generator.c index 47b91d6ef..0a81cdeb3 100644 --- a/example/generator/odp_generator.c +++ b/example/generator/odp_generator.c @@ -76,6 +76,7 @@ typedef struct { each packet */ int udp_tx_burst; /**< number of udp packets to send with one API call */ + odp_bool_t csum; /**< use platform csum support if available */ } appl_args_t; /** @@ -516,14 +517,26 @@ static int create_pktio(const char *dev, odp_pool_t pool, return -1; } odp_pktio_config_init(&itf->config); - itf->config.pktin.bit.ipv4_chksum = capa.config.pktin.bit.ipv4_chksum; - itf->config.pktin.bit.udp_chksum = capa.config.pktin.bit.udp_chksum; - itf->config.pktin.bit.drop_ipv4_err = - capa.config.pktin.bit.drop_ipv4_err; - itf->config.pktin.bit.drop_udp_err = capa.config.pktin.bit.drop_udp_err; - - itf->config.pktout.bit.ipv4_chksum = capa.config.pktout.bit.ipv4_chksum; - itf->config.pktout.bit.udp_chksum = capa.config.pktout.bit.udp_chksum; + if (args->appl.csum) { + itf->config.pktin.bit.ipv4_chksum = + capa.config.pktin.bit.ipv4_chksum; + itf->config.pktin.bit.udp_chksum = + capa.config.pktin.bit.udp_chksum; + itf->config.pktin.bit.drop_ipv4_err = + capa.config.pktin.bit.drop_ipv4_err; + itf->config.pktin.bit.drop_udp_err = + capa.config.pktin.bit.drop_udp_err; + + itf->config.pktout.bit.ipv4_chksum = + capa.config.pktout.bit.ipv4_chksum; + itf->config.pktout.bit.udp_chksum = + capa.config.pktout.bit.udp_chksum; + } else { /* explicit disable */ + itf->config.pktin.bit.ipv4_chksum = 0; + itf->config.pktin.bit.udp_chksum = 0; + itf->config.pktout.bit.ipv4_chksum = 0; + itf->config.pktout.bit.udp_chksum = 0; + } if (odp_pktio_config(itf->pktio, &itf->config)) { EXAMPLE_ERR("Error: Failed to set interface configuration %s\n", @@ -1299,10 +1312,11 @@ static void parse_args(int argc, char *argv[], appl_args_t *appl_args) {"interval", required_argument, NULL, 'i'}, {"help", no_argument, NULL, 'h'}, {"udp_tx_burst", required_argument, NULL, 'x'}, + {"csum", no_argument, NULL, 'y'}, {NULL, 0, NULL, 0} }; - static const char *shortopts = "+I:a:b:s:d:p:i:m:n:t:w:c:x:he:f:"; + static const char *shortopts = "+I:a:b:s:d:p:i:m:n:t:w:c:x:he:f:y"; /* let helper collect its own arguments (e.g. --odph_proc) */ odph_parse_options(argc, argv, shortopts, longopts); @@ -1315,6 +1329,7 @@ static void parse_args(int argc, char *argv[], appl_args_t *appl_args) appl_args->udp_tx_burst = DEFAULT_UDP_TX_BURST; appl_args->srcport = 0; appl_args->dstport = 0; + appl_args->csum = 0; opterr = 0; /* do not issue errors on helper options */ @@ -1455,6 +1470,9 @@ static void parse_args(int argc, char *argv[], appl_args_t *appl_args) } break; + case 'y': + appl_args->csum = 1; + break; case 'h': usage(argv[0]); exit(EXIT_SUCCESS); @@ -1541,6 +1559,8 @@ static void usage(char *progname) " -n, --count the number of packets to be send\n" " -c, --cpumask to set on cores\n" " -x, --udp_tx_burst size of UDP TX burst\n" + " -y, --csum use platform checksum support if available\n" + " default is disabled\n" "\n", NO_PATH(progname), NO_PATH(progname) ); } From patchwork Thu Dec 7 13:00:06 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Github ODP bot X-Patchwork-Id: 120968 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp8326956qgn; Thu, 7 Dec 2017 05:04:05 -0800 (PST) X-Google-Smtp-Source: AGs4zMaPK7WG/zDLBMm5EOTSFshF6FHeDMmFlUATZYsQrJoYTL/zuOtgboZtwtyrP2+tPkgM9XSY X-Received: by 10.200.50.176 with SMTP id z45mr9421675qta.167.1512651844895; Thu, 07 Dec 2017 05:04:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1512651844; cv=none; d=google.com; s=arc-20160816; b=NPmDzDdSVEN7WehqPX2KvTatNMsxx6fLXWhSBPWLGXOZXYb7QGsM1QIEiG/LMhnqND TKMJVCDjQ1rbfqAUKCjVWKx+7fQtGxBl7o75Av7Ob5+6we94U1+aZh7RhzRaV0OuuOUq Mf9fvZZmGwxTUxkJRQkVjHpUlA+NT5Qil/jhdWEfl7/wUx8kR2bfPZalKe4r4Adksykb UlVjIbdaQYw66+y3lBjtuuMWuZNUVPuD38sjHCSabG8dMzaYn55h6VFR8xxLUEhsMk5L xX058ELrOWL8a5Mwkn/gmobIBdQ24d3jjQL0pSh3p4/c49eKU0NSwXtZBF7WgVInZEdL 3jwg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:github-pr-num :references:in-reply-to:message-id:date:to:from:delivered-to :arc-authentication-results; bh=+N73GgVtsNXFczrO5RTE21aYaY/sSkFpKD/UC8ZGGyE=; b=CcODNCAdVWVpABfXad1k7WhvexiTocd8d5eEYVmakqY87SevV9lntap/LqiqS6EwNe qFqTDFRNjNqrVWsdH6eJrghrnsINedFnZ6Zcf61som4A6Y3+2eN7Kxy3zDe9DVR0hq0L PDm+hz+G2N4VZ/Q4B7OIikHMHsD4V+o9BA07zf//WzblM0Uj2rT0fAa+Y7YJ1scCLvsW A1tL4V/GugVsABwnVPnc8HHEVow9E7w7ef04jGH1lA+FQmGsHeEmJzjGiWq2dSb1Zgfh y5NODVGCiI+CIWZpqlSRP5Xrs0mKXSNAw2CQogrwM91smvMuFtzrq57wIJ/EqAxX6oga CkVw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Return-Path: Received: from lists.linaro.org (ec2-54-197-127-237.compute-1.amazonaws.com. [54.197.127.237]) by mx.google.com with ESMTP id q63si3244645qtd.356.2017.12.07.05.04.04; Thu, 07 Dec 2017 05:04:04 -0800 (PST) Received-SPF: pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) client-ip=54.197.127.237; Authentication-Results: mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Received: by lists.linaro.org (Postfix, from userid 109) id 8795360953; Thu, 7 Dec 2017 13:04:04 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on ip-10-142-244-252 X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,URIBL_BLOCKED autolearn=disabled version=3.4.0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by lists.linaro.org (Postfix) with ESMTP id 095F06094A; Thu, 7 Dec 2017 13:00:54 +0000 (UTC) X-Original-To: lng-odp@lists.linaro.org Delivered-To: lng-odp@lists.linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id B3B9E6091B; Thu, 7 Dec 2017 13:00:24 +0000 (UTC) Received: from forward100o.mail.yandex.net (forward100o.mail.yandex.net [37.140.190.180]) by lists.linaro.org (Postfix) with ESMTPS id B6BAB60830 for ; Thu, 7 Dec 2017 13:00:15 +0000 (UTC) Received: from mxback5g.mail.yandex.net (mxback5g.mail.yandex.net [IPv6:2a02:6b8:0:1472:2741:0:8b7:166]) by forward100o.mail.yandex.net (Yandex) with ESMTP id EA4542A24257 for ; Thu, 7 Dec 2017 16:00:13 +0300 (MSK) Received: from smtp2o.mail.yandex.net (smtp2o.mail.yandex.net [2a02:6b8:0:1a2d::26]) by mxback5g.mail.yandex.net (nwsmtp/Yandex) with ESMTP id uCKAojPJAI-0D38lH54; Thu, 07 Dec 2017 16:00:13 +0300 Received: by smtp2o.mail.yandex.net (nwsmtp/Yandex) with ESMTPSA id 5HyJRBoKQy-0CQOP5cb; Thu, 07 Dec 2017 16:00:12 +0300 (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (Client certificate not present) From: Github ODP bot To: lng-odp@lists.linaro.org Date: Thu, 7 Dec 2017 16:00:06 +0300 Message-Id: <1512651606-28483-5-git-send-email-odpbot@yandex.ru> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1512651606-28483-1-git-send-email-odpbot@yandex.ru> References: <1512651606-28483-1-git-send-email-odpbot@yandex.ru> Github-pr-num: 327 Subject: [lng-odp] [PATCH v1 4/4] example: generator: replace atomic counter with per worker counters X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "The OpenDataPlane \(ODP\) List" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: lng-odp-bounces@lists.linaro.org Sender: "lng-odp" From: Bogdan Pricope Use of atomic counters reduces total packet throughput. Signed-off-by: Bogdan Pricope --- /** Email created from pull request 327 (bogdanPricope:master_update_generator_pr) ** https://github.com/Linaro/odp/pull/327 ** Patch: https://github.com/Linaro/odp/pull/327.patch ** Base sha: 811281a22b6274b7f41b926a9cfbe09e48a366bd ** Merge commit sha: 9edce40a148dd5654384464f71ff62c58d5105fa **/ example/generator/odp_generator.c | 266 +++++++++++++++++++++++--------------- 1 file changed, 165 insertions(+), 101 deletions(-) diff --git a/example/generator/odp_generator.c b/example/generator/odp_generator.c index 0a81cdeb3..861e98369 100644 --- a/example/generator/odp_generator.c +++ b/example/generator/odp_generator.c @@ -34,6 +34,9 @@ #define APPL_MODE_PING 1 /**< ping mode */ #define APPL_MODE_RCV 2 /**< receive mode */ +#define PING_THR_TX 0 +#define PING_THR_RX 1 + /** print appl mode */ #define PRINT_APPL_MODE(x) printf("%s(%i)\n", #x, (x)) @@ -82,18 +85,21 @@ typedef struct { /** * counters */ -static struct { - odp_atomic_u64_t seq; /**< ip seq to be send */ - odp_atomic_u64_t ip; /**< ip packets */ - odp_atomic_u64_t udp; /**< udp packets */ - odp_atomic_u64_t icmp; /**< icmp packets */ - odp_atomic_u64_t cnt; /**< sent packets*/ - odp_atomic_u64_t tx_drops; /**< packets dropped in transmit */ -} counters; +typedef struct { + uint64_t ctr_pkt_snd; /**< sent packets*/ + uint64_t ctr_pkt_snd_drop; /**< packets dropped in transmit */ + + uint64_t ctr_pkt_rcv; /**< recv packets */ + uint64_t ctr_seq; /**< ip seq to be send */ + uint64_t ctr_udp_rcv; /**< udp packets */ + uint64_t ctr_icmp_reply_rcv; /**< icmp reply packets */ +} counters_t; /** * Thread specific arguments */ typedef struct { + counters_t counters; /**< Packet conters */ + odp_bool_t stop; /**< Stop packet processing */ union { struct { odp_pktout_queue_t pktout; /**< Packet output queue */ @@ -120,6 +126,9 @@ typedef struct { appl_args_t appl; /** Thread specific arguments */ thread_args_t thread[MAX_WORKERS]; + /** Global arguments */ + int thread_cnt; + int tx_burst_size; } args_t; /** Global pointer to args */ @@ -131,7 +140,8 @@ static odp_barrier_t barrier; /** Packet processing function types */ typedef odp_packet_t (*setup_pkt_ref_fn_t)(odp_pool_t, odp_pktout_config_opt_t *); -typedef int (*setup_pkt_fn_t)(odp_packet_t, odp_pktout_config_opt_t *); +typedef int (*setup_pkt_fn_t)(odp_packet_t, odp_pktout_config_opt_t *, + counters_t *); /* helper funcs */ static void parse_args(int argc, char *argv[], appl_args_t *appl_args); @@ -245,6 +255,7 @@ static int setup_pkt_ref_array(odp_pool_t pool, * @return 0 success, -1 failed */ static int setup_pkt_array(odp_pktout_config_opt_t *pktout_cfg, + counters_t *counters, odp_packet_t *pkt_ref_array, odp_packet_t *pkt_array, int pkt_array_size, @@ -253,7 +264,7 @@ static int setup_pkt_array(odp_pktout_config_opt_t *pktout_cfg, int i; for (i = 0; i < pkt_array_size; i++) { - if ((*setup_pkt)(pkt_ref_array[i], pktout_cfg)) + if ((*setup_pkt)(pkt_ref_array[i], pktout_cfg, counters)) break; pkt_array[i] = odp_packet_ref_static(pkt_ref_array[i]); @@ -342,7 +353,8 @@ static odp_packet_t setup_udp_pkt_ref(odp_pool_t pool, * @return Success/Failed * @retval 0 on success, -1 on fail */ -static int setup_udp_pkt(odp_packet_t pkt, odp_pktout_config_opt_t *pktout_cfg) +static int setup_udp_pkt(odp_packet_t pkt, odp_pktout_config_opt_t *pktout_cfg, + counters_t *counters) { char *buf; odph_ipv4hdr_t *ip; @@ -352,7 +364,8 @@ static int setup_udp_pkt(odp_packet_t pkt, odp_pktout_config_opt_t *pktout_cfg) /*Update IP ID and checksum*/ ip = (odph_ipv4hdr_t *)(buf + ODPH_ETHHDR_LEN); - seq = odp_atomic_fetch_add_u64(&counters.seq, 1) % 0xFFFF; + seq = counters->ctr_seq % 0xFFFF; + counters->ctr_seq++; ip->id = odp_cpu_to_be_16(seq); if (!pktout_cfg->bit.ipv4_chksum) { ip->chksum = 0; @@ -437,7 +450,8 @@ static odp_packet_t setup_icmp_pkt_ref(odp_pool_t pool, * @retval 0 on success, -1 on fail */ static int setup_icmp_pkt(odp_packet_t pkt, - odp_pktout_config_opt_t *pktout_cfg) + odp_pktout_config_opt_t *pktout_cfg, + counters_t *counters) { char *buf; odph_ipv4hdr_t *ip; @@ -450,7 +464,8 @@ static int setup_icmp_pkt(odp_packet_t pkt, /* ip */ ip = (odph_ipv4hdr_t *)(buf + ODPH_ETHHDR_LEN); - seq = odp_atomic_fetch_add_u64(&counters.seq, 1) % 0xffff; + seq = counters->ctr_seq % 0xffff; + counters->ctr_seq++; ip->id = odp_cpu_to_be_16(seq); if (!pktout_cfg->bit.ipv4_chksum) { ip->chksum = 0; @@ -607,30 +622,39 @@ static int gen_send_thread(void *arg) odp_pktout_config_opt_t *pktout_cfg; odp_packet_t pkt_ref_array[MAX_UDP_TX_BURST]; odp_packet_t pkt_array[MAX_UDP_TX_BURST]; - int pkt_array_size; + int pkt_array_size, seq_step; int burst_start, burst_size; setup_pkt_ref_fn_t setup_pkt_ref = NULL; setup_pkt_fn_t setup_pkt = NULL; + counters_t *counters; + uint64_t pkt_count_max = 0; thr = odp_thread_id(); thr_args = arg; pktout = thr_args->tx.pktout; pktout_cfg = thr_args->tx.pktout_cfg; + counters = &thr_args->counters; /* Create reference packets*/ if (args->appl.mode == APPL_MODE_UDP) { - pkt_array_size = args->appl.udp_tx_burst; setup_pkt_ref = setup_udp_pkt_ref; setup_pkt = setup_udp_pkt; + seq_step = args->tx_burst_size * (args->thread_cnt - 1); + if (args->appl.number != -1) + pkt_count_max = args->appl.number / args->thread_cnt + + (args->appl.number % args->thread_cnt ? 1 : 0); } else if (args->appl.mode == APPL_MODE_PING) { - pkt_array_size = 1; setup_pkt_ref = setup_icmp_pkt_ref; setup_pkt = setup_icmp_pkt; + seq_step = 0; + if (args->appl.number != -1) + pkt_count_max = args->appl.number; } else { EXAMPLE_ERR(" [%02i] Error: invalid processing mode %d\n", thr, args->appl.mode); return -1; } + pkt_array_size = args->tx_burst_size; if (setup_pkt_ref_array(thr_args->pool, pktout_cfg, pkt_ref_array, pkt_array_size, @@ -645,13 +669,17 @@ static int gen_send_thread(void *arg) odp_barrier_wait(&barrier); for (;;) { - if (args->appl.number != -1 && - odp_atomic_fetch_add_u64(&counters.cnt, pkt_array_size) >= - (unsigned int)args->appl.number) + if (thr_args->stop) break; + if (pkt_count_max && counters->ctr_pkt_snd > pkt_count_max) { + sleep(1); /* wait for stop command */ + continue; + } + /* Setup TX burst*/ - if (setup_pkt_array(pktout_cfg, pkt_ref_array, pkt_array, + if (setup_pkt_array(pktout_cfg, counters, + pkt_ref_array, pkt_array, pkt_array_size, setup_pkt)) { EXAMPLE_ERR("[%02i] Error: failed to setup packets\n", thr); @@ -663,10 +691,12 @@ static int gen_send_thread(void *arg) ret = odp_pktout_send(pktout, &pkt_array[burst_start], burst_size); if (ret == burst_size) { + burst_size = 0; break; } else if (ret >= 0 && ret < burst_size) { - odp_atomic_add_u64(&counters.tx_drops, - burst_size - ret); + thr_args->counters.ctr_pkt_snd_drop += + burst_size - ret; + burst_start += ret; burst_size -= ret; continue; @@ -677,32 +707,20 @@ static int gen_send_thread(void *arg) break; } + counters->ctr_pkt_snd += pkt_array_size - burst_size; + if (args->appl.interval != 0) { printf(" [%02i] send pkt no:%ju seq %ju\n", thr, - odp_atomic_load_u64(&counters.seq), - odp_atomic_load_u64(&counters.seq)%0xffff); + counters->ctr_seq, + counters->ctr_seq % 0xffff); millisleep(args->appl.interval, thr_args->tp, thr_args->tim, thr_args->tq, thr_args->tmo_ev); } - } - - /* receive number of reply pks until timeout */ - if (args->appl.mode == APPL_MODE_PING && args->appl.number > 0) { - while (args->appl.timeout >= 0) { - if (odp_atomic_load_u64(&counters.icmp) >= - (unsigned int)args->appl.number) - break; - millisleep(DEFAULT_PKT_INTERVAL, - thr_args->tp, - thr_args->tim, - thr_args->tq, - thr_args->tmo_ev); - args->appl.timeout--; - } + counters->ctr_seq += seq_step; } odp_packet_free_multi(pkt_ref_array, pkt_array_size); @@ -717,7 +735,8 @@ static int gen_send_thread(void *arg) * @param msg output buffer */ -static void process_icmp_pkt(odph_icmphdr_t *icmp, char *msg) +static void process_icmp_pkt(thread_args_t *thr_args, + odph_icmphdr_t *icmp, char *msg) { uint64_t trecv; uint64_t tsend; @@ -726,7 +745,7 @@ static void process_icmp_pkt(odph_icmphdr_t *icmp, char *msg) msg[0] = 0; if (icmp->type == ICMP_ECHOREPLY) { - odp_atomic_inc_u64(&counters.icmp); + thr_args->counters.ctr_icmp_reply_rcv++; memcpy(&tsend, (uint8_t *)icmp + ODPH_ICMPHDR_LEN, sizeof(uint64_t)); @@ -751,7 +770,8 @@ static void process_icmp_pkt(odph_icmphdr_t *icmp, char *msg) * @param pkt_tbl packets to be print * @param len packet number */ -static void print_pkts(int thr, odp_packet_t pkt_tbl[], unsigned len) +static void print_pkts(int thr, thread_args_t *thr_args, + odp_packet_t pkt_tbl[], unsigned len) { odp_packet_t pkt; char *buf; @@ -768,21 +788,20 @@ static void print_pkts(int thr, odp_packet_t pkt_tbl[], unsigned len) if (!odp_packet_has_ipv4(pkt)) continue; - odp_atomic_inc_u64(&counters.ip); + thr_args->counters.ctr_pkt_rcv++; buf = odp_packet_data(pkt); ip = (odph_ipv4hdr_t *)(buf + odp_packet_l3_offset(pkt)); offset = odp_packet_l4_offset(pkt); /* udp */ - if (ip->proto == ODPH_IPPROTO_UDP) { - odp_atomic_inc_u64(&counters.udp); - } + if (ip->proto == ODPH_IPPROTO_UDP) + thr_args->counters.ctr_udp_rcv++; /* icmp */ if (ip->proto == ODPH_IPPROTO_ICMPv4) { icmp = (odph_icmphdr_t *)(buf + offset); - process_icmp_pkt(icmp, msg); + process_icmp_pkt(thr_args, icmp, msg); printf(" [%02i] %s\n", thr, msg); } } @@ -810,14 +829,11 @@ static int gen_recv_thread(void *arg) odp_barrier_wait(&barrier); for (;;) { - if (args->appl.number != -1 && - odp_atomic_load_u64(&counters.icmp) >= - (unsigned int)args->appl.number) { + if (thr_args->stop) break; - } /* Use schedule to get buf from any input queue */ - ev_cnt = odp_schedule_multi(NULL, ODP_SCHED_WAIT, + ev_cnt = odp_schedule_multi(NULL, ODP_SCHED_NO_WAIT, events, MAX_RX_BURST); if (ev_cnt == 0) continue; @@ -848,7 +864,7 @@ static int gen_recv_thread(void *arg) } if (pkt_cnt) { - print_pkts(thr, pkts, pkt_cnt); + print_pkts(thr, thr_args, pkts, pkt_cnt); odp_packet_free_multi(pkts, pkt_cnt); } @@ -857,6 +873,35 @@ static int gen_recv_thread(void *arg) return 0; } +#define COUNTER_SUM(_c, _nw) \ +({ \ + int _itr; \ + uint64_t _result = 0; \ + \ + for (_itr = 0; _itr < _nw; _itr++) \ + _result += args->thread[_itr].counters.ctr_ ## _c; \ + \ + _result; \ +}) + +static void garceful_stop_ping(void) +{ + uint64_t snd, rcv; + + if (args->appl.mode != APPL_MODE_PING) + return; + + while (args->appl.timeout >= 0) { + snd = COUNTER_SUM(pkt_snd, 2); + rcv = COUNTER_SUM(icmp_reply_rcv, 2); + if (rcv >= snd) + break; + + sleep(1); + args->appl.timeout--; + } +} + /** * printing verbose statistics * @@ -868,8 +913,8 @@ static void print_global_stats(int num_workers) uint64_t pps_snd = 0, maximum_pps_snd = 0; uint64_t pkts_rcv = 0, pkts_rcv_prev = 0; uint64_t pps_rcv = 0, maximum_pps_rcv = 0; - uint64_t stall; - int verbose_interval = 20; + uint64_t stall, pkts_snd_drop; + int verbose_interval = 20, i; odp_thrmask_t thrd_mask; odp_barrier_wait(&barrier); @@ -878,12 +923,15 @@ static void print_global_stats(int num_workers) next = odp_time_sum(odp_time_local(), wait); while (odp_thrmask_worker(&thrd_mask) == num_workers) { - if (args->appl.number != -1 && - odp_atomic_load_u64(&counters.cnt) >= - (unsigned int)args->appl.number) { - break; - } + if (args->appl.mode != APPL_MODE_RCV && + args->appl.number != -1) { + uint64_t cnt = COUNTER_SUM(pkt_snd, num_workers); + if (cnt >= (unsigned int)args->appl.number) { + garceful_stop_ping(); + break; + } + } cur = odp_time_local(); if (odp_time_cmp(next, cur) > 0) { left = odp_time_diff(next, cur); @@ -894,18 +942,22 @@ static void print_global_stats(int num_workers) usleep(stall / ODP_TIME_USEC_IN_NS); continue; } - next = odp_time_sum(cur, wait); + switch (args->appl.mode) { case APPL_MODE_RCV: - pkts_rcv = odp_atomic_load_u64(&counters.ip); + pkts_rcv = COUNTER_SUM(pkt_rcv, num_workers); + pkts_snd = 0; + pkts_snd_drop = 0; break; case APPL_MODE_PING: - pkts_snd = odp_atomic_load_u64(&counters.seq); - pkts_rcv = odp_atomic_load_u64(&counters.icmp); + pkts_snd = COUNTER_SUM(pkt_snd, num_workers); + pkts_snd_drop = COUNTER_SUM(pkt_snd_drop, num_workers); + pkts_rcv = COUNTER_SUM(icmp_reply_rcv, num_workers); break; case APPL_MODE_UDP: - pkts_snd = odp_atomic_load_u64(&counters.seq); + pkts_snd = COUNTER_SUM(pkt_snd, num_workers); + pkts_snd_drop = COUNTER_SUM(pkt_snd_drop, num_workers); break; default: continue; @@ -927,11 +979,14 @@ static void print_global_stats(int num_workers) "rcv: %" PRIu64 ", " "recv rate: %" PRIu64 " pps, " "max recv rate: %" PRIu64 " pps\n", - pkts_snd, odp_atomic_load_u64(&counters.tx_drops), + pkts_snd, pkts_snd_drop, pps_snd, maximum_pps_snd, pkts_rcv, pps_rcv, maximum_pps_rcv); fflush(NULL); } + + for (i = 0; i < num_workers; i++) + args->thread[i].stop = 1; } /** @@ -968,14 +1023,6 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } - /* init counters */ - odp_atomic_init_u64(&counters.seq, 0); - odp_atomic_init_u64(&counters.ip, 0); - odp_atomic_init_u64(&counters.udp, 0); - odp_atomic_init_u64(&counters.icmp, 0); - odp_atomic_init_u64(&counters.cnt, 0); - odp_atomic_init_u64(&counters.tx_drops, 0); - /* Reserve memory for args from shared mem */ shm = odp_shm_reserve("shm_args", sizeof(args_t), ODP_CACHE_LINE_SIZE, 0); @@ -1024,6 +1071,15 @@ int main(int argc, char *argv[]) num_workers = 2; } } + args->thread_cnt = num_workers; + + /* Burst size */ + if (args->appl.mode == APPL_MODE_PING) + args->tx_burst_size = 1; + else if (args->appl.mode == APPL_MODE_UDP) + args->tx_burst_size = args->appl.udp_tx_burst; + else + args->tx_burst_size = 0; /* Create packet pool */ odp_pool_param_init(¶ms); @@ -1104,6 +1160,7 @@ int main(int argc, char *argv[]) if (args->appl.mode == APPL_MODE_PING) { odp_cpumask_t cpu_mask; int cpu_first, cpu_next; + thread_args_t *thr_args; odp_cpumask_zero(&cpu_mask); cpu_first = odp_cpumask_first(&cpumask); @@ -1114,60 +1171,64 @@ int main(int argc, char *argv[]) EXAMPLE_ERR("queue_create failed\n"); abort(); } - args->thread[1].rx.ifs = ifs; - args->thread[1].rx.ifs_count = args->appl.if_count; - args->thread[1].pool = pool; - args->thread[1].tp = tp; - args->thread[1].tq = tq; - args->thread[1].tim = odp_timer_alloc(tp, tq, NULL); - if (args->thread[1].tim == ODP_TIMER_INVALID) { + thr_args = &args->thread[PING_THR_RX]; + thr_args->rx.ifs = ifs; + thr_args->rx.ifs_count = args->appl.if_count; + thr_args->pool = pool; + thr_args->tp = tp; + thr_args->tq = tq; + thr_args->tim = odp_timer_alloc(tp, tq, NULL); + if (thr_args->tim == ODP_TIMER_INVALID) { EXAMPLE_ERR("timer_alloc failed\n"); abort(); } - args->thread[1].tmo_ev = odp_timeout_alloc(tmop); - if (args->thread[1].tmo_ev == ODP_TIMEOUT_INVALID) { + thr_args->tmo_ev = odp_timeout_alloc(tmop); + if (thr_args->tmo_ev == ODP_TIMEOUT_INVALID) { EXAMPLE_ERR("timeout_alloc failed\n"); abort(); } - args->thread[1].mode = args->appl.mode; + thr_args->mode = args->appl.mode; memset(&thr_params, 0, sizeof(thr_params)); thr_params.start = gen_recv_thread; - thr_params.arg = &args->thread[1]; + thr_params.arg = thr_args; thr_params.thr_type = ODP_THREAD_WORKER; thr_params.instance = instance; - odph_odpthreads_create(&thread_tbl[1], &cpu_mask, &thr_params); + odph_odpthreads_create(&thread_tbl[PING_THR_RX], + &cpu_mask, &thr_params); tq = odp_queue_create("", NULL); if (tq == ODP_QUEUE_INVALID) { EXAMPLE_ERR("queue_create failed\n"); abort(); } - args->thread[0].tx.pktout = ifs[0].pktout[0]; - args->thread[0].tx.pktout_cfg = &ifs[0].config.pktout; - args->thread[0].pool = pool; - args->thread[0].tp = tp; - args->thread[0].tq = tq; - args->thread[0].tim = odp_timer_alloc(tp, tq, NULL); - if (args->thread[0].tim == ODP_TIMER_INVALID) { + thr_args = &args->thread[PING_THR_TX]; + thr_args->tx.pktout = ifs[0].pktout[0]; + thr_args->tx.pktout_cfg = &ifs[0].config.pktout; + thr_args->pool = pool; + thr_args->tp = tp; + thr_args->tq = tq; + thr_args->tim = odp_timer_alloc(tp, tq, NULL); + if (thr_args->tim == ODP_TIMER_INVALID) { EXAMPLE_ERR("timer_alloc failed\n"); abort(); } - args->thread[0].tmo_ev = odp_timeout_alloc(tmop); - if (args->thread[0].tmo_ev == ODP_TIMEOUT_INVALID) { + thr_args->tmo_ev = odp_timeout_alloc(tmop); + if (thr_args->tmo_ev == ODP_TIMEOUT_INVALID) { EXAMPLE_ERR("timeout_alloc failed\n"); abort(); } - args->thread[0].mode = args->appl.mode; + thr_args->mode = args->appl.mode; cpu_next = odp_cpumask_next(&cpumask, cpu_first); odp_cpumask_zero(&cpu_mask); odp_cpumask_set(&cpu_mask, cpu_next); thr_params.start = gen_send_thread; - thr_params.arg = &args->thread[0]; + thr_params.arg = thr_args; - odph_odpthreads_create(&thread_tbl[0], &cpu_mask, &thr_params); + odph_odpthreads_create(&thread_tbl[PING_THR_TX], + &cpu_mask, &thr_params); } else { int cpu = odp_cpumask_first(&cpumask); @@ -1176,6 +1237,7 @@ int main(int argc, char *argv[]) odp_cpumask_t thd_mask; int (*thr_run_func)(void *); int if_idx, pktout_idx; + uint64_t start_seq; if (args->appl.mode == APPL_MODE_RCV) { args->thread[i].rx.ifs = ifs; @@ -1185,11 +1247,13 @@ int main(int argc, char *argv[]) if_idx = i % args->appl.if_count; pktout_idx = (i / args->appl.if_count) % ifs[if_idx].pktout_count; + start_seq = i * args->tx_burst_size; args->thread[i].tx.pktout = ifs[if_idx].pktout[pktout_idx]; args->thread[i].tx.pktout_cfg = &ifs[if_idx].config.pktout; + args->thread[i].counters.ctr_seq = start_seq; } tq = odp_queue_create("", NULL); if (tq == ODP_QUEUE_INVALID) { @@ -1531,9 +1595,9 @@ static void usage(char *progname) "OpenDataPlane example application.\n" "\n" " Work mode:\n" - " 1.send udp packets\n" + " 1.send ipv4 udp packets\n" " odp_generator -I eth0 --srcmac fe:0f:97:c9:e0:44 --dstmac 32:cb:9b:27:2f:1a --srcip 192.168.0.1 --dstip 192.168.0.2 -m u\n" - " 2.receive udp packets\n" + " 2.receive ipv4 packets\n" " odp_generator -I eth0 -m r\n" " 3.work likes ping\n" " odp_generator -I eth0 --srcmac fe:0f:97:c9:e0:44 --dstmac 32:cb:9b:27:2f:1a --srcip 192.168.0.1 --dstip 192.168.0.2 --cpumask 0xc -m p\n"