From patchwork Tue May 28 20:12:44 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: William Tu X-Patchwork-Id: 1106528 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.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.b="acff49l/"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45D4ng2HwPz9s4V for ; Wed, 29 May 2019 06:14:45 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id D977F230F; Tue, 28 May 2019 20:14:41 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 8D0A92307 for ; Tue, 28 May 2019 20:13:11 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pl1-f195.google.com (mail-pl1-f195.google.com [209.85.214.195]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 2B915EC for ; Tue, 28 May 2019 20:13:11 +0000 (UTC) Received: by mail-pl1-f195.google.com with SMTP id f97so8803647plb.5 for ; Tue, 28 May 2019 13:13:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=W20t98UwA0bnt7Xw2z5bnTexemVxRH++jM9x+KVzvDo=; b=acff49l/T1yW0iAbvY+LaBgRWlvNHA+VH+Dr+HWHOqH7zzjvWjwlZn8eQ5CwR4hNlD eKCam2OhCj3+P28J88GvZ/AMOaOYmLs4kO20iFSQBDnzKpyLwpUU7SHWvErEfIOLzC5+ 25rLsAr+AJPlmy7Ag17mX84nUj2vl0LqzwtDopLABc0JILavrKlICigVvkhQV6NpR35+ jRQ1yd2a1+uQDejU8WfEMiLDMHu0HQ+EsjVOXPAOSkt4dk6H/o+Tp+7kQG/wvvWc8PHM l1R9r8nzN1eiAyAXYY3JkerF1OLc17azG8fqBlPVZwaCmWngYSsjDLAAE9yfpcpORLFg /B5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=W20t98UwA0bnt7Xw2z5bnTexemVxRH++jM9x+KVzvDo=; b=gDH0APeVIyuHC8dQIkvC0X2nWp1vqYCRXBkkvIDa+zV4nyaTU07SSJpAUgMxBhtR30 J53QIZ30yUY0wBBWEqsMX5tloDUbKoYS+6s/G/Zd0+hfERwZ/bPthoW+sviFdYR/YTEm LKKlwEVOoC9HCjIybzkfHWVXr2WZHDEer7pOnys0yUvOZdJuLhTx0QngWRtLdzlgY16c qsP96gM5rtfT4jy8bRfhQNmTTcCzley6A4AmYdKlOO/ZeJ/jGConvxSQdoayJ+OeHtp7 dwGPN52k9ritpgdt/nplLsTNX1x+doBN81fVmCW8ipue3YmME/ApbHnyWMycx07++Dsz R5hg== X-Gm-Message-State: APjAAAX/DeXqQMNAjWjOUD+b7KQC5OiwAY4H+CS1fvFrOwffc7bdZqI5 ZKKezdf4N/kZQC81VHLgZ8/jcl3/ X-Google-Smtp-Source: APXvYqzj3PCONUnjf989+XP0VpmEvSWzsQafP21vn9OlpxAIGgA92W+4ZRJqs/0F2who2O174RFy1w== X-Received: by 2002:a17:902:e30b:: with SMTP id cg11mr137154723plb.3.1559074389933; Tue, 28 May 2019 13:13:09 -0700 (PDT) Received: from sc9-mailhost2.vmware.com ([66.170.99.2]) by smtp.gmail.com with ESMTPSA id z7sm19305313pfr.23.2019.05.28.13.13.08 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 28 May 2019 13:13:08 -0700 (PDT) From: William Tu To: dev@openvswitch.org Date: Tue, 28 May 2019 13:12:44 -0700 Message-Id: <1559074364-7635-1-git-send-email-u9012063@gmail.com> X-Mailer: git-send-email 2.7.4 X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [PATCH RFC] netdev-dpdk: add af_xdp support. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org The patch adds support for using DPDK's AF_XDP PMD. Base on DPDK 19.08-rc0: commit c6a53a6bcd0ae52afe0a6d58b059af577c9408b3 Author: Thomas Monjalon Date: Tue May 14 18:04:37 2019 +0200 version: 19.08-rc0 An AF_XDP PMD can be created by: $ ovs-vsctl add-port br0 afxdp-p0 -- set int afxdp-p0 type=dpdk \ options:dpdk-devargs=net_af_xdp,iface=enp2s0,queue=0 $ ovs-vsctl show Port "afxdp-p0" Interface "afxdp-p0" type: dpdk options: {dpdk-devargs="net_af_xdp,iface=enp2s0,queue=0"} The performance of physical device loopback shows around 7Mpps with 64B pkt. $ ovs-ofctl add-flow br0 "in_port=afxdp-p0, \ actions=set_field:14->in_port,set_field:a0:36:9f:33:b1:40->dl_src,afxdp-p0" Note: I have to set e_RTE_METER_GREEN to 0 to pass compile. Signed-off-by: William Tu --- lib/netdev-dpdk.c | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 47153dc60148..99697bc896ca 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -380,6 +380,8 @@ struct netdev_dpdk { /* If true, device was attached by rte_eth_dev_attach(). */ bool attached; + /* If true, device was hop plugged by rte_eal_hotplug_add(). */ + bool hotplugged; /* If true, rte_eth_dev_start() was successfully called */ bool started; struct eth_addr hwaddr; @@ -1376,6 +1378,14 @@ netdev_dpdk_destruct(struct netdev *netdev) rte_eth_dev_stop(dev->port_id); dev->started = false; + if (dev->hotplugged) { + int ret; + ret = rte_eal_hotplug_remove("vdev", "net_af_xdp"); + if (ret) { + VLOG_ERR("%s unplugged error %d", __func__, ret); + } + } + if (dev->attached) { /* Retrieve eth device data before closing it. * FIXME: avoid direct access to DPDK internal array rte_eth_devices. @@ -1648,6 +1658,26 @@ netdev_dpdk_lookup_by_port_id(dpdk_port_t port_id) } static dpdk_port_t +netdev_dpdk_get_af_xdp_port(const char *vdev_args) +{ + const char vdev_name[] = "net_af_xdp"; + dpdk_port_t port_id; + + if (rte_eal_hotplug_add("vdev", vdev_name, vdev_args) < 0) { + VLOG_WARN("Cannot hotplug AF_XDP device: %s\n", vdev_args); + return DPDK_ETH_PORT_ID_INVALID; + } + + if (rte_eth_dev_get_port_by_name(vdev_name, &port_id) != 0) { + rte_eal_hotplug_remove("vdev", vdev_name); + VLOG_WARN("Cannot get AF_XDP port_id, device: %s\n", vdev_args); + return DPDK_ETH_PORT_ID_INVALID; + } + + return port_id; +} + +static dpdk_port_t netdev_dpdk_get_port_by_mac(const char *mac_str) { dpdk_port_t port_id; @@ -1705,7 +1735,11 @@ netdev_dpdk_process_devargs(struct netdev_dpdk *dev, { dpdk_port_t new_port_id; - if (strncmp(devargs, "class=eth,mac=", 14) == 0) { + if (strncmp(devargs, "net_af_xdp", 10) == 0) { + new_port_id = netdev_dpdk_get_af_xdp_port(&devargs[11]); + dev->hotplugged = true; + VLOG_INFO("Device '%s' hotplugged to DPDK", devargs); + } else if (strncmp(devargs, "class=eth,mac=", 14) == 0) { new_port_id = netdev_dpdk_get_port_by_mac(&devargs[14]); } else { new_port_id = netdev_dpdk_get_port_by_devargs(devargs); @@ -2031,7 +2065,7 @@ netdev_dpdk_policer_pkt_handle(struct rte_meter_srtcm *meter, uint32_t pkt_len = rte_pktmbuf_pkt_len(pkt) - sizeof(struct ether_hdr); return rte_meter_srtcm_color_blind_check(meter, profile, time, pkt_len) == - e_RTE_METER_GREEN; + 0; /* e_RTE_METER_GREEN */ } static int