From patchwork Wed Mar 25 21:44:42 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: William Tu X-Patchwork-Id: 1261671 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.136; helo=silver.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=tqeVTxqp; dkim-atps=neutral Received: from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48nhWF168dz9sQt for ; Thu, 26 Mar 2020 08:45:42 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id DCE6E23735; Wed, 25 Mar 2020 21:45:39 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from silver.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id tyeQrkj8Ql08; Wed, 25 Mar 2020 21:45:36 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id D5DF8214E6; Wed, 25 Mar 2020 21:45:36 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id AEB3BC1D7C; Wed, 25 Mar 2020 21:45:36 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138]) by lists.linuxfoundation.org (Postfix) with ESMTP id 0E0FAC0177 for ; Wed, 25 Mar 2020 21:45:35 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id F417F86C7E for ; Wed, 25 Mar 2020 21:45:34 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id bhz6piZf1Elr for ; Wed, 25 Mar 2020 21:45:34 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mail-pj1-f66.google.com (mail-pj1-f66.google.com [209.85.216.66]) by whitealder.osuosl.org (Postfix) with ESMTPS id 48FC886C7B for ; Wed, 25 Mar 2020 21:45:34 +0000 (UTC) Received: by mail-pj1-f66.google.com with SMTP id mj6so1594943pjb.5 for ; Wed, 25 Mar 2020 14:45:34 -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; bh=yC9rw1O/i/do04/AOTB4gkfVaAy+2Elrl8Hs/aAsGAw=; b=tqeVTxqpaJ4P7GFAoHMpp9490s4h3cA3W0sr1NAu9CU7O1/1GC4RjGFPbEJ5lwmApk d4tLLAHBRdqRkx+3a2UmF/zwYdENDuVem11Bz2qRvS3GHM3qjFL9lOgoJSR/CuQJ9iNz LGI7GR0zFG45weBhQJ5Az/9lSkSXV9javkLMFphVi52nfrR5Ac6vN5xrf1BtC23tH3C+ fgh5RoD1+tQnei3HbeyVEni9JYEJRaze8bTOU+2OsEP4FsUkC/W4donGZbZXfa9mJ2n3 4f/KbQ2LPSDD6T0FQHUzCPdKU4LGcQHdSwFd24zoVITng0jszZMCaIJLS2fB4gR8mgm4 a3uw== 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; bh=yC9rw1O/i/do04/AOTB4gkfVaAy+2Elrl8Hs/aAsGAw=; b=LapSsB5354Yje2GueRaHiOMdy4qKr8Lmq9IKwu2aswc87EadfmQsYQxWlnzlZiymeM H0TJVMnxAwnnWaVs/YjcROYRwpS9Rj1QhrQkBdkI4hW3jZ/a5qAjM/rLGVXUGNVXImjR us9V9dXQzRyaOW15eU/Q/QYrvLthPxSFCWLJXbvhYwcBuRPhFlIYQFGMXYjgFLN5OOwe hrqdP55F1QwN8LcMZpbDIOEeVLD/MaaTGXo9fuP0riATbQFY1Xtbx2Ge3smqzDed94tI 1wGh9bXAT7FZPFJ0AnYOLeRGLcv3fU9Mq3awTkk5BwKsFhCzQroQ23jhcOwkLEtgKsLn l01A== X-Gm-Message-State: ANhLgQ04AOUiH0z/9J8hsMx25BkZnk5U5YZHFgc4JUqBr8cSq/GewrFL 6yBBeb7nTBPSI6IRKT7IkyI8cMRB X-Google-Smtp-Source: ADFU+vt48Aj8cDVCwiBhK2MwHlh1+ZVQcdyF8uTzcSrHouVTWd1PZCHGUagNgM9hN+vBX1ZodKRbRw== X-Received: by 2002:a17:902:7593:: with SMTP id j19mr5286912pll.55.1585172733438; Wed, 25 Mar 2020 14:45:33 -0700 (PDT) Received: from sc9-mailhost2.vmware.com (c-76-21-95-192.hsd1.ca.comcast.net. [76.21.95.192]) by smtp.gmail.com with ESMTPSA id k1sm88497pgg.56.2020.03.25.14.45.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 25 Mar 2020 14:45:32 -0700 (PDT) From: William Tu To: dev@openvswitch.org Date: Wed, 25 Mar 2020 14:44:42 -0700 Message-Id: <1585172682-14891-1-git-send-email-u9012063@gmail.com> X-Mailer: git-send-email 2.7.4 Cc: i.maximets@ovn.org Subject: [ovs-dev] [PATCHv4] netdev-afxdp: Add interrupt mode netdev class. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" The patch adds a new netdev class 'afxdp-nonpmd' to enable afxdp interrupt mode. This is similar to 'type=afxdp', except that the is_pmd field is set to false. As a result, the packet processing is handled by main thread, not pmd thread. This avoids burning the CPU to always 100% when there is no traffic. Tested-at: https://travis-ci.org/github/williamtu/ovs-travis/builds/666980138 Signed-off-by: William Tu --- v4: - Previously crash and fix it with qid = qid % netdev_n_txq(netdev) Now remove it because Ilya's fix: "dpif-netdev: Force port reconfiguration to change dynamic_txqs." --- NEWS | 3 +++ lib/netdev-linux.c | 20 ++++++++++++++++++++ lib/netdev-provider.h | 1 + lib/netdev.c | 1 + tests/system-afxdp.at | 23 +++++++++++++++++++++++ 5 files changed, 48 insertions(+) diff --git a/NEWS b/NEWS index 32ca2e0c6642..2ca8f6266145 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,9 @@ Post-v2.13.0 * Deprecated DPDK ring ports (dpdkr) are no longer supported. - Linux datapath: * Support for kernel versions up to 5.5.x. + - AF_XDP: + * New netdev class 'afxdp-nonpmd' for netdev-afxdp to save CPU cycles + by enabling interrupt mode. v2.13.0 - 14 Feb 2020 diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index c6e46f1885aa..bcc28869516e 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -3624,6 +3624,26 @@ const struct netdev_class netdev_afxdp_class = { .rxq_destruct = netdev_afxdp_rxq_destruct, .rxq_recv = netdev_afxdp_rxq_recv, }; + +const struct netdev_class netdev_afxdp_nonpmd_class = { + NETDEV_LINUX_CLASS_COMMON, + .type = "afxdp-nonpmd", + .is_pmd = false, + .init = netdev_afxdp_init, + .construct = netdev_afxdp_construct, + .destruct = netdev_afxdp_destruct, + .get_stats = netdev_afxdp_get_stats, + .get_custom_stats = netdev_afxdp_get_custom_stats, + .get_status = netdev_linux_get_status, + .set_config = netdev_afxdp_set_config, + .get_config = netdev_afxdp_get_config, + .reconfigure = netdev_afxdp_reconfigure, + .get_numa_id = netdev_linux_get_numa_id, + .send = netdev_afxdp_batch_send, + .rxq_construct = netdev_afxdp_rxq_construct, + .rxq_destruct = netdev_afxdp_rxq_destruct, + .rxq_recv = netdev_afxdp_rxq_recv, +}; #endif diff --git a/lib/netdev-provider.h b/lib/netdev-provider.h index 6f509424bc81..d9503adb0fb6 100644 --- a/lib/netdev-provider.h +++ b/lib/netdev-provider.h @@ -850,6 +850,7 @@ extern const struct netdev_class netdev_tap_class; #ifdef HAVE_AF_XDP extern const struct netdev_class netdev_afxdp_class; +extern const struct netdev_class netdev_afxdp_nonpmd_class; #endif #ifdef __cplusplus } diff --git a/lib/netdev.c b/lib/netdev.c index 8c44eee8e98a..90962eec66cf 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -154,6 +154,7 @@ netdev_initialize(void) netdev_register_flow_api_provider(&netdev_offload_tc); #ifdef HAVE_AF_XDP netdev_register_provider(&netdev_afxdp_class); + netdev_register_provider(&netdev_afxdp_nonpmd_class); #endif #endif #if defined(__FreeBSD__) || defined(__NetBSD__) diff --git a/tests/system-afxdp.at b/tests/system-afxdp.at index e4451624f882..0d09906fb6c8 100644 --- a/tests/system-afxdp.at +++ b/tests/system-afxdp.at @@ -22,3 +22,26 @@ AT_CHECK([grep "ovs-p0: could not set configuration" ovs-vswitchd.log | wc -l], OVS_TRAFFIC_VSWITCHD_STOP(["/ovs-p0: Too big 'n_rxq'/d /ovs-p0: could not set configuration/d"]) AT_CLEANUP + + +AT_SETUP([AF_XDP - ping between pmd and non-pmd ports]) +AT_KEYWORDS([afxdp nonpmd]) +OVS_TRAFFIC_VSWITCHD_START() + +AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"]) + +ADD_NAMESPACES(at_ns0, at_ns1) +ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24") +ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24") + +AT_CHECK([ovs-vsctl del-port ovs-p0]) +AT_CHECK([ovs-vsctl add-port br0 ovs-p0 -- \ + set interface ovs-p0 type=afxdp-nonpmd options:n_rxq=1], + [0], [], [stderr]) + +NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl +3 packets transmitted, 3 received, 0% packet loss, time 0ms +]) + +OVS_TRAFFIC_VSWITCHD_STOP +AT_CLEANUP