From patchwork Tue Mar 17 19:25:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jian Yang X-Patchwork-Id: 222372 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 950DCC5ACD6 for ; Tue, 17 Mar 2020 19:26:56 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 707CE20752 for ; Tue, 17 Mar 2020 19:26:56 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="txwINJA5" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726769AbgCQT04 (ORCPT ); Tue, 17 Mar 2020 15:26:56 -0400 Received: from mail-pf1-f179.google.com ([209.85.210.179]:37637 "EHLO mail-pf1-f179.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726491AbgCQT0z (ORCPT ); Tue, 17 Mar 2020 15:26:55 -0400 Received: by mail-pf1-f179.google.com with SMTP id 3so4644885pff.4 for ; Tue, 17 Mar 2020 12:26:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=2reD+WzuFntenfuCZSYCGTYO1H0IaVOzbA7ZHt1jCvs=; b=txwINJA5/Gtj5AiUcMjOeQ47u5jLmZOBHggVlyiIC5h88UwBlHmYEHKgHA0EsTrOyP SqMMRBdFEX1QCv8qPG8CLGFY3SuF/ACOgVWOTeE4iXJl/MrV35360ybvoKaUXwBoX5fq 2WPB6uu0s+tWBZ/CHq8N9cEFVHlxH29DeLYMSS3vyIotdtxSJ4rbGzLuXuEK2esnKTLx iSiRiGV09VviRgHEAGakc7O/Ig2Tsg3dX38xoGefkbkzysJBZk2vy1Vl7NJ3OqF5e5r1 aOtM6EXKwYSBKG1OEvNtg4PSSUOI+NPeJJ9Jh5L9D/f4ott+SRNpIwJFHLf+57751o5f ZMMw== 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=2reD+WzuFntenfuCZSYCGTYO1H0IaVOzbA7ZHt1jCvs=; b=XS+Ny+2We3Y83d8ND63NuJ6Y/3wvIcv3MV50ziIfUio46gOSD/vhByIJAeMhGN9oJY gT0yr7zJxT4oER9nvWY665FWaHucC8597aQ5R0XOlWoa04cKBhrLQ4IAB43kpMqx+yUg KHfias3sEEUdd4kIfszARxSd5bavsbrseAIOjxUyir3eQmDJam3Iw5PfYdddXwLTNZKM 8Hqyeu+22puSnZGhEW4wUpLdu3Qj4tsdE+YvUXy9C/hVpSqx1NuBC2MWgmPOuB6mocI1 GnPohjdRRYPHOzVy7KbZcnAd+WYKbao772e9jQLD/iWu31q7KpqdfcZPDOWkoRXrQeQ1 HRRQ== X-Gm-Message-State: ANhLgQ0L4+69RBS6NkpGyeLMt77Aad3T6G0e1sSq2rFMyfwqA1edEpue rG4dgDvyE/A3q5bL1DZXhVMIdx9U X-Google-Smtp-Source: ADFU+vvoKOtwjB8qCx89cDd7lZIQZoFsNvJBI3Ex+7m500KXqSiyrMjcUQcQy2VbUTqSZnVhEhOpqg== X-Received: by 2002:a62:1dd0:: with SMTP id d199mr334393pfd.9.1584473214361; Tue, 17 Mar 2020 12:26:54 -0700 (PDT) Received: from jian-dev.svl.corp.google.com ([2620:15c:2c4:201:83ec:eccf:6871:57]) by smtp.gmail.com with ESMTPSA id gn11sm173209pjb.42.2020.03.17.12.26.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Mar 2020 12:26:54 -0700 (PDT) From: Jian Yang To: davem@davemloft.net, netdev@vger.kernel.org Cc: Soheil Hassas Yeganeh , Willem de Bruijn , Jian Yang Subject: [PATCH net-next 1/5] selftests: txtimestamp: allow individual txtimestamp tests. Date: Tue, 17 Mar 2020 12:25:05 -0700 Message-Id: <20200317192509.150725-2-jianyang.kernel@gmail.com> X-Mailer: git-send-email 2.25.1.481.gfbce0eb801-goog In-Reply-To: <20200317192509.150725-1-jianyang.kernel@gmail.com> References: <20200317192509.150725-1-jianyang.kernel@gmail.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jian Yang The wrapper script txtimestamp.sh executes a pre-defined list of testcases sequentially without configuration options available. Add an option (-r/--run) to setup the test namespace and pass remaining arguments to txtimestamp binary. The script still runs all tests when no argument is passed. Signed-off-by: Jian Yang Acked-by: Willem de Bruijn Acked-by: Soheil Hassas Yeganeh --- .../networking/timestamping/txtimestamp.sh | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/networking/timestamping/txtimestamp.sh b/tools/testing/selftests/networking/timestamping/txtimestamp.sh index df0d86ca72b7..70a8cda7fd53 100755 --- a/tools/testing/selftests/networking/timestamping/txtimestamp.sh +++ b/tools/testing/selftests/networking/timestamping/txtimestamp.sh @@ -43,15 +43,40 @@ run_test_tcpudpraw() { } run_test_all() { + setup run_test_tcpudpraw # setsockopt run_test_tcpudpraw -C # cmsg run_test_tcpudpraw -n # timestamp w/o data + echo "OK. All tests passed" +} + +run_test_one() { + setup + ./txtimestamp $@ +} + +usage() { + echo "Usage: $0 [ -r | --run ] | [ -h | --help ]" + echo " (no args) Run all tests" + echo " -r|--run Run an individual test with arguments" + echo " -h|--help Help" +} + +main() { + if [[ $# -eq 0 ]]; then + run_test_all + else + if [[ "$1" = "-r" || "$1" == "--run" ]]; then + shift + run_test_one $@ + else + usage + fi + fi } if [[ "$(ip netns identify)" == "root" ]]; then ../../net/in_netns.sh $0 $@ else - setup - run_test_all - echo "OK. All tests passed" + main $@ fi From patchwork Tue Mar 17 19:25:08 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jian Yang X-Patchwork-Id: 222371 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id BEBF9C1975A for ; Tue, 17 Mar 2020 19:27:00 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 9B85B20752 for ; Tue, 17 Mar 2020 19:27:00 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="mjSk8MFD" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726795AbgCQT07 (ORCPT ); Tue, 17 Mar 2020 15:26:59 -0400 Received: from mail-pf1-f194.google.com ([209.85.210.194]:34918 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726774AbgCQT06 (ORCPT ); Tue, 17 Mar 2020 15:26:58 -0400 Received: by mail-pf1-f194.google.com with SMTP id u68so12498298pfb.2 for ; Tue, 17 Mar 2020 12:26:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=dgvl+d5OB6JH2bQkj3Pmn34fP6zWWhSechufApclfgc=; b=mjSk8MFDOFTXDiCOiwky6fP3o5wmdckp5icG7u9Si49zdeEW/mRK7/kYPMjWyuJ68Q 4TTTNKHPlKD76Iv4NTVIcSHRXDJ8CSbTtHF0YEsC8rYFqRCjn8PG/ogzcXcGlEtYxU7n eusGgTfBfT/TYdaD+Pq8I6yjswUH2u458Qu/OOBUjmluDIdAZMUhJz1MdmJj3N5fZkaQ aaLN1KolDORZPBzAQeH61Qz2iDaqa7LvZVOuFwWJuOH9gHet5oTB/NRocsvi8H2ONuNG m0RCS0wWPMis15rR7FP8HBhaEimOOu4dG99haG6v0g4RVUlu38eegr0/texSiX7lC9TX 7M/A== 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=dgvl+d5OB6JH2bQkj3Pmn34fP6zWWhSechufApclfgc=; b=KDEJwrO6IxqiCAvLuU/W/eO+IPXn4jQmcjP/yKXrXcPtuhNDNVsCJx2QH/KEhX9FkO qespiJXVf6fwHefOtgqSQBNUiM7raA6t9pz9KQoCGrXOZ/DaU0PTskQf8WgCWYPSfGZU e2CQ5ydwAyJ11+pJ7TcP3Ix4PXb1nnuQY08cmy3lBNVlJt3OuMTMKffNQcIoAbUGo6NS Ug+4Q8IIB3+2sycfpHnJTYqdV1KNqjWW/johWyZxEsidhQNPy1vtsb/h+hMRMDNBDE1e 0FCvFzOCmnsUTK3CmrE3E+upgEqdUWQogSjePAOgJ0ob0FSwRNwhznTyy9Nh7BC+XTts /i/A== X-Gm-Message-State: ANhLgQ0jOjmkT7FNTCIeao1FEWGkqfQ8UaYm9f4rjt4XOk06FVc17Fsn Jt2u9Po2OXB4wJfkNpZ6C2I= X-Google-Smtp-Source: ADFU+vtJO+pkRwNqZH5ETh1tP5SqF5/rfDG8JCn5ZQJGYKofNNk9CLbAekf7nT9CxuIQki9LIKGPEw== X-Received: by 2002:a62:6dc2:: with SMTP id i185mr293508pfc.195.1584473216903; Tue, 17 Mar 2020 12:26:56 -0700 (PDT) Received: from jian-dev.svl.corp.google.com ([2620:15c:2c4:201:83ec:eccf:6871:57]) by smtp.gmail.com with ESMTPSA id gn11sm173209pjb.42.2020.03.17.12.26.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Mar 2020 12:26:56 -0700 (PDT) From: Jian Yang To: davem@davemloft.net, netdev@vger.kernel.org Cc: Soheil Hassas Yeganeh , Willem de Bruijn , Jian Yang Subject: [PATCH net-next 4/5] selftests: txtimestamp: add support for epoll(). Date: Tue, 17 Mar 2020 12:25:08 -0700 Message-Id: <20200317192509.150725-5-jianyang.kernel@gmail.com> X-Mailer: git-send-email 2.25.1.481.gfbce0eb801-goog In-Reply-To: <20200317192509.150725-1-jianyang.kernel@gmail.com> References: <20200317192509.150725-1-jianyang.kernel@gmail.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jian Yang Add the following new flags: -e: use level-triggered epoll() instead of poll(). -E: use event-triggered epoll() instead of poll(). Signed-off-by: Jian Yang Acked-by: Willem de Bruijn Acked-by: Soheil Hassas Yeganeh --- .../networking/timestamping/txtimestamp.c | 53 +++++++++++++++++-- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/tools/testing/selftests/networking/timestamping/txtimestamp.c b/tools/testing/selftests/networking/timestamping/txtimestamp.c index ee060ae3d44f..f915f24db3fa 100644 --- a/tools/testing/selftests/networking/timestamping/txtimestamp.c +++ b/tools/testing/selftests/networking/timestamping/txtimestamp.c @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include @@ -70,6 +71,8 @@ static int cfg_sleep_usec = 50 * 1000; static bool cfg_loop_nodata; static bool cfg_use_cmsg; static bool cfg_use_pf_packet; +static bool cfg_use_epoll; +static bool cfg_epollet; static bool cfg_do_listen; static uint16_t dest_port = 9000; static bool cfg_print_nsec; @@ -227,6 +230,17 @@ static void print_pktinfo(int family, int ifindex, void *saddr, void *daddr) daddr ? inet_ntop(family, daddr, da, sizeof(da)) : "unknown"); } +static void __epoll(int epfd) +{ + struct epoll_event events; + int ret; + + memset(&events, 0, sizeof(events)); + ret = epoll_wait(epfd, &events, 1, cfg_poll_timeout); + if (ret != 1) + error(1, errno, "epoll_wait"); +} + static void __poll(int fd) { struct pollfd pollfd; @@ -420,7 +434,7 @@ static void do_test(int family, unsigned int report_opt) struct msghdr msg; struct iovec iov; char *buf; - int fd, i, val = 1, total_len; + int fd, i, val = 1, total_len, epfd = 0; total_len = cfg_payload_len; if (cfg_use_pf_packet || cfg_proto == SOCK_RAW) { @@ -447,6 +461,20 @@ static void do_test(int family, unsigned int report_opt) if (fd < 0) error(1, errno, "socket"); + if (cfg_use_epoll) { + struct epoll_event ev; + + memset(&ev, 0, sizeof(ev)); + ev.data.fd = fd; + if (cfg_epollet) + ev.events |= EPOLLET; + epfd = epoll_create(1); + if (epfd <= 0) + error(1, errno, "epoll_create"); + if (epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev)) + error(1, errno, "epoll_ctl"); + } + /* reset expected key on each new socket */ saved_tskey = -1; @@ -557,8 +585,12 @@ static void do_test(int family, unsigned int report_opt) if (cfg_sleep_usec) usleep(cfg_sleep_usec); - if (!cfg_busy_poll) - __poll(fd); + if (!cfg_busy_poll) { + if (cfg_use_epoll) + __epoll(epfd); + else + __poll(fd); + } while (!recv_errmsg(fd)) {} } @@ -580,7 +612,9 @@ static void __attribute__((noreturn)) usage(const char *filepath) " -b: busy poll to read from error queue\n" " -c N: number of packets for each test\n" " -C: use cmsg to set tstamp recording options\n" - " -F: poll() waits forever for an event\n" + " -e: use level-triggered epoll() instead of poll()\n" + " -E: use event-triggered epoll() instead of poll()\n" + " -F: poll()/epoll() waits forever for an event\n" " -I: request PKTINFO\n" " -l N: send N bytes at a time\n" " -L listen on hostname and port\n" @@ -604,7 +638,8 @@ static void parse_opt(int argc, char **argv) int proto_count = 0; int c; - while ((c = getopt(argc, argv, "46bc:CFhIl:LnNp:PrRS:uv:V:x")) != -1) { + while ((c = getopt(argc, argv, + "46bc:CeEFhIl:LnNp:PrRS:uv:V:x")) != -1) { switch (c) { case '4': do_ipv6 = 0; @@ -621,6 +656,12 @@ static void parse_opt(int argc, char **argv) case 'C': cfg_use_cmsg = true; break; + case 'e': + cfg_use_epoll = true; + break; + case 'E': + cfg_use_epoll = true; + cfg_epollet = true; case 'F': cfg_poll_timeout = -1; break; @@ -691,6 +732,8 @@ static void parse_opt(int argc, char **argv) error(1, 0, "pass -P, -r, -R or -u, not multiple"); if (cfg_do_pktinfo && cfg_use_pf_packet) error(1, 0, "cannot ask for pktinfo over pf_packet"); + if (cfg_busy_poll && cfg_use_epoll) + error(1, 0, "pass epoll or busy_poll, not both"); if (optind != argc - 1) error(1, 0, "missing required hostname argument"); From patchwork Tue Mar 17 19:25:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jian Yang X-Patchwork-Id: 222370 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS, UNWANTED_LANGUAGE_BODY, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9C956C1975A for ; Tue, 17 Mar 2020 19:27:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 77F0120752 for ; Tue, 17 Mar 2020 19:27:04 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="JbCimMAG" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726820AbgCQT1D (ORCPT ); Tue, 17 Mar 2020 15:27:03 -0400 Received: from mail-pf1-f194.google.com ([209.85.210.194]:38000 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726294AbgCQT07 (ORCPT ); Tue, 17 Mar 2020 15:26:59 -0400 Received: by mail-pf1-f194.google.com with SMTP id z5so12500077pfn.5 for ; Tue, 17 Mar 2020 12:26:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=5Wv4yd6kR1QRFXmj2NzM07bN147FOh0EzFD89nDLwIg=; b=JbCimMAGYjEZ0zc+C4XcbauR6gn4y+fhcwZ36n+F9lR3NE7grLLeK4jW17f1cDHuvA uNYw6v/6rQIJkWO7z5BFAL3DjDBjXEPjbzmFku0JIhtUHJfiUkUpL0aRmNSe/TCcPkPi 83I9syJIxdiHqnWg8pTJFbddKuuth0xQSrLMF2Q6PtSd5lfEZ2Hdz06UH8GBYKZEB/m+ lV1QkWIUQal7U5bSiDgYNSUUPRcy5WelwP9nNQgNLz7Vgz/UVmc2SoryBjkcS/azCPz2 SzJN1w/WwY9rleOcAuwAx6jn0Jb+dmqxPcX9hCBKQNEgGe46aFo16dphsdW6BfopgIV9 lfhg== 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=5Wv4yd6kR1QRFXmj2NzM07bN147FOh0EzFD89nDLwIg=; b=XVGceNQIZEvsX9+GEwd/O67NNL7zzLenC5ulTQi/rt/6UHJnMumJljst3skKrwOnai 9r18Sg63TfPpuIVp07BxhuN53XdanRxos/uz4GqlDmkTZ4MxWXLIKthrtNA1BwM8bKdv MDk3mSuzDSfHdCvBzfabg3R+dRLYXRhFHhv7VVd7kUqf5fydbD2alkhYVLWHHcqKD4TO qKxiYzly98iAV8KNU1ezNCKVbVmG7TxmjA6zFc35LGPbfaufvHpCtVu0wQhB9ew0MVA9 FR7+RaIEQFrBDHstREt3RwNKuqfCt0rGZ3hGDf5ARM3pvkaP2XNDJTVtiDYD0FoKrDVK MFRw== X-Gm-Message-State: ANhLgQ0knGnxT1i+ON59xzsoCcTcg1rD0VzbhK7wz/SmP+Gqzf9nQimM NEunBt6mlCJXx7S3ytsBsX0= X-Google-Smtp-Source: ADFU+vu5MqXVG3sKiPSGLMIM6ccxiO2hIUIrFnK657jFPN+C662Qtk5zsBKUVpS+wQOQT5M44vOQBw== X-Received: by 2002:a62:f20d:: with SMTP id m13mr320045pfh.314.1584473217801; Tue, 17 Mar 2020 12:26:57 -0700 (PDT) Received: from jian-dev.svl.corp.google.com ([2620:15c:2c4:201:83ec:eccf:6871:57]) by smtp.gmail.com with ESMTPSA id gn11sm173209pjb.42.2020.03.17.12.26.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Mar 2020 12:26:57 -0700 (PDT) From: Jian Yang To: davem@davemloft.net, netdev@vger.kernel.org Cc: Soheil Hassas Yeganeh , Willem de Bruijn , Jian Yang Subject: [PATCH net-next 5/5] selftests: txtimestamp: print statistics for timestamp events. Date: Tue, 17 Mar 2020 12:25:09 -0700 Message-Id: <20200317192509.150725-6-jianyang.kernel@gmail.com> X-Mailer: git-send-email 2.25.1.481.gfbce0eb801-goog In-Reply-To: <20200317192509.150725-1-jianyang.kernel@gmail.com> References: <20200317192509.150725-1-jianyang.kernel@gmail.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jian Yang Statistics on timestamps is useful to quantify average and tail latency. Print timestamp statistics in count/avg/min/max format. Signed-off-by: Jian Yang Acked-by: Willem de Bruijn Acked-by: Soheil Hassas Yeganeh --- .../networking/timestamping/txtimestamp.c | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/tools/testing/selftests/networking/timestamping/txtimestamp.c b/tools/testing/selftests/networking/timestamping/txtimestamp.c index f915f24db3fa..011b0da6b033 100644 --- a/tools/testing/selftests/networking/timestamping/txtimestamp.c +++ b/tools/testing/selftests/networking/timestamping/txtimestamp.c @@ -84,6 +84,17 @@ static struct timespec ts_usr; static int saved_tskey = -1; static int saved_tskey_type = -1; +struct timing_event { + int64_t min; + int64_t max; + int64_t total; + int count; +}; + +static struct timing_event usr_enq; +static struct timing_event usr_snd; +static struct timing_event usr_ack; + static bool test_failed; static int64_t timespec_to_ns64(struct timespec *ts) @@ -96,6 +107,27 @@ static int64_t timespec_to_us64(struct timespec *ts) return ts->tv_sec * USEC_PER_SEC + ts->tv_nsec / NSEC_PER_USEC; } +static void init_timing_event(struct timing_event *te) +{ + te->min = INT64_MAX; + te->max = 0; + te->total = 0; + te->count = 0; +} + +static void add_timing_event(struct timing_event *te, + struct timespec *t_start, struct timespec *t_end) +{ + int64_t ts_delta = timespec_to_ns64(t_end) - timespec_to_ns64(t_start); + + te->count++; + if (ts_delta < te->min) + te->min = ts_delta; + if (ts_delta > te->max) + te->max = ts_delta; + te->total += ts_delta; +} + static void validate_key(int tskey, int tstype) { int stepsize; @@ -187,14 +219,17 @@ static void print_timestamp(struct scm_timestamping *tss, int tstype, case SCM_TSTAMP_SCHED: tsname = " ENQ"; validate_timestamp(&tss->ts[0], 0); + add_timing_event(&usr_enq, &ts_usr, &tss->ts[0]); break; case SCM_TSTAMP_SND: tsname = " SND"; validate_timestamp(&tss->ts[0], cfg_delay_snd); + add_timing_event(&usr_snd, &ts_usr, &tss->ts[0]); break; case SCM_TSTAMP_ACK: tsname = " ACK"; validate_timestamp(&tss->ts[0], cfg_delay_ack); + add_timing_event(&usr_ack, &ts_usr, &tss->ts[0]); break; default: error(1, 0, "unknown timestamp type: %u", @@ -203,6 +238,21 @@ static void print_timestamp(struct scm_timestamping *tss, int tstype, __print_timestamp(tsname, &tss->ts[0], tskey, payload_len); } +static void print_timing_event(char *name, struct timing_event *te) +{ + if (!te->count) + return; + + fprintf(stderr, " %s: count=%d", name, te->count); + fprintf(stderr, ", avg="); + __print_ts_delta_formatted((int64_t)(te->total / te->count)); + fprintf(stderr, ", min="); + __print_ts_delta_formatted(te->min); + fprintf(stderr, ", max="); + __print_ts_delta_formatted(te->max); + fprintf(stderr, "\n"); +} + /* TODO: convert to check_and_print payload once API is stable */ static void print_payload(char *data, int len) { @@ -436,6 +486,10 @@ static void do_test(int family, unsigned int report_opt) char *buf; int fd, i, val = 1, total_len, epfd = 0; + init_timing_event(&usr_enq); + init_timing_event(&usr_snd); + init_timing_event(&usr_ack); + total_len = cfg_payload_len; if (cfg_use_pf_packet || cfg_proto == SOCK_RAW) { total_len += sizeof(struct udphdr); @@ -595,6 +649,10 @@ static void do_test(int family, unsigned int report_opt) while (!recv_errmsg(fd)) {} } + print_timing_event("USR-ENQ", &usr_enq); + print_timing_event("USR-SND", &usr_snd); + print_timing_event("USR-ACK", &usr_ack); + if (close(fd)) error(1, errno, "close");