From patchwork Wed Jan 10 12:25:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Quentin Monnet X-Patchwork-Id: 858242 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="uzIQLglk"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zGpDS1dW7z9t0m for ; Wed, 10 Jan 2018 23:27:20 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934429AbeAJM1S (ORCPT ); Wed, 10 Jan 2018 07:27:18 -0500 Received: from mail-wr0-f195.google.com ([209.85.128.195]:38267 "EHLO mail-wr0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934421AbeAJM1P (ORCPT ); Wed, 10 Jan 2018 07:27:15 -0500 Received: by mail-wr0-f195.google.com with SMTP id 60so8107747wrl.5 for ; Wed, 10 Jan 2018 04:27:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=TgzZ4Q0KoLRgo9yDBNAGY0ekM/vzVKPrrNDKpcsoeow=; b=uzIQLglkGh2AL+Pg8H6IMgjvO1Yntj8FP+YjRBQOylWqCM0Q8P8ffJ2afqtP6EZ3jD eaWiA+jbGOXO1ZqWBE8c3M9MO2EWxdFgrkCkwnXl7zhB3roElpcCj2X8pw6c1YrBAVJ6 k8mcIFl0GX4m53etP8pvwwk/PMdcA3AooFMtpLM73/MWHvDUMdvzbHLcG6HC+FqFYlvs uimjxeFjjCfrdG5zVUKBbXg3xdufNuqSseBu0tVPDWochESI0GnD0SFqDEhjEvgu+DZB kNzdZYR/DqzyLD0km8b6GE7ccI/w0NuVTO+Dscl7Ew8+bDjlp+BWpeTr3Umv27VaG67c UXHw== 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; bh=TgzZ4Q0KoLRgo9yDBNAGY0ekM/vzVKPrrNDKpcsoeow=; b=alffrkS3opgrwgJG3BS+gwgzXmcTtNSqloPCKmPMkxKRKs6pCPoJOp2Bh3eE+bmQwp 15uqQNvBEFaNvsYfOXFd34q6/p95c1Mqxs0JQq8qocnXUlnzFQwbq/oR0AI9e77ZyCal 9HGOCK6uQahUA1ZBINLRIn7NNCSoOWG3WIaceNmzUaOtehFpz3rH6jLX3BxBNW37YJiR 5gw/NM8f2/ZSux8wLUa+rSvWx/u6/JqsBTmGQKv7S3+sGneQpozcOaInt67XcRfTRHv5 nTl+C60UedaWAxCs9OzwqcbGKuUWKT16OmUt5S8WHE52k58Z+j7WfTm9ICrDqS71EGrp FxMQ== X-Gm-Message-State: AKGB3mKZJ63Mb6dNH2ZmvrXufYLjWCr5izvmU3bR41QnjxuUhzqIayvL yQmIutYDJ836LU8ijlXIdhBhBqcq X-Google-Smtp-Source: ACJfBoskk3PVox+dQuLjsvAVCEMVmbdWXEWEhAd2sauQUoqp5ZR+unTvMPMcCdW/PiTRV4/dyU8c0A== X-Received: by 10.223.160.139 with SMTP id m11mr16373613wrm.119.1515587234148; Wed, 10 Jan 2018 04:27:14 -0800 (PST) Received: from cbtest8.netronome.com (host-79-78-33-110.static.as9105.net. [79.78.33.110]) by smtp.gmail.com with ESMTPSA id q186sm16907279wmb.6.2018.01.10.04.27.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 10 Jan 2018 04:27:13 -0800 (PST) From: Quentin Monnet To: daniel@iogearbox.net, alexei.starovoitov@gmail.com, netdev@vger.kernel.org Cc: oss-drivers@netronome.com, jakub.kicinski@netronome.com Subject: [PATCH bpf-next v2 01/14] nfp: don't try to register XDP rxq structures on control queues Date: Wed, 10 Jan 2018 12:25:54 +0000 Message-Id: <1515587167-1959-2-git-send-email-quentin.monnet@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> References: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jakub Kicinski Some RX rings are used for control messages, those will not have a netdev pointer in dp. Skip XDP rxq handling on those rings. Fixes: 7f1c684a8966 ("nfp: setup xdp_rxq_info") Signed-off-by: Jakub Kicinski Reviewed-by: Dirk van der Merwe --- drivers/net/ethernet/netronome/nfp/nfp_net_common.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c index 05e071b3dc5b..104d6c520a52 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c @@ -2253,7 +2253,8 @@ static void nfp_net_rx_ring_free(struct nfp_net_rx_ring *rx_ring) struct nfp_net_r_vector *r_vec = rx_ring->r_vec; struct nfp_net_dp *dp = &r_vec->nfp_net->dp; - xdp_rxq_info_unreg(&rx_ring->xdp_rxq); + if (dp->netdev) + xdp_rxq_info_unreg(&rx_ring->xdp_rxq); kfree(rx_ring->rxbufs); if (rx_ring->rxds) @@ -2279,9 +2280,12 @@ nfp_net_rx_ring_alloc(struct nfp_net_dp *dp, struct nfp_net_rx_ring *rx_ring) { int sz, err; - err = xdp_rxq_info_reg(&rx_ring->xdp_rxq, dp->netdev, rx_ring->idx); - if (err < 0) - return err; + if (dp->netdev) { + err = xdp_rxq_info_reg(&rx_ring->xdp_rxq, dp->netdev, + rx_ring->idx); + if (err < 0) + return err; + } rx_ring->cnt = dp->rxd_cnt; rx_ring->size = sizeof(*rx_ring->rxds) * rx_ring->cnt; From patchwork Wed Jan 10 12:25:55 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Quentin Monnet X-Patchwork-Id: 858243 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="iKhP7jTM"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zGpDb3rJDz9t0m for ; Wed, 10 Jan 2018 23:27:27 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934445AbeAJM1X (ORCPT ); Wed, 10 Jan 2018 07:27:23 -0500 Received: from mail-wm0-f49.google.com ([74.125.82.49]:38923 "EHLO mail-wm0-f49.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934430AbeAJM1V (ORCPT ); Wed, 10 Jan 2018 07:27:21 -0500 Received: by mail-wm0-f49.google.com with SMTP id i11so26661162wmf.4 for ; Wed, 10 Jan 2018 04:27:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=i5RZqq8M/GO+ATiVBcSqEvdyWLZm2qElVWIYXCMF45A=; b=iKhP7jTMEdyXOaKJhgs+ZF1HAG5X7zLeNnQXY2r8zROTbIteua6ktrrJRMI/WW1AW3 7NcEMNZdiwU6yzR+JcANjGYob7zBdomyMqDFEosqRLpEgeoXI5hbRnCHGeS563Fl/wvd 7gI7dBdBE8DKNIEUYwO7dy4pM1BtWiDAMeTQeH0k9nC27Mxrui3M30WyfVpxFX+onvvI tQQY1+Ua5lS80Us/ydXTl0LFq3G0K4KloVA3V6jcqFZuOnv2cB/m/+DS2KPpSyiqG4N8 6rEHWJSwS7BvTxMMc8J7kubmhIXtSSaqe3ProkH61AnhGhtptrLDi791oETriyj6NxSm q/aQ== 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; bh=i5RZqq8M/GO+ATiVBcSqEvdyWLZm2qElVWIYXCMF45A=; b=P8Hyqry3Q9gbjPyAWHeZvPDeWCrau6XoBixlPRj37ngMH0sNOL+CQQQO9vKbQyI/0X PMxdNCvnBdUULxhpxJYu6YGYBfiRjYfPkCbPww6DzOEqTM6ttmCJe5bmcUrWdI8YW2AI p+VA5WeSE2q7McwuNAF5F9m//6yUv9Hv9WbJYHXaWfF67riFlA+gAachKmu6LQfTiwKD oytTqwgETehAQF6k8NmNbHhGNEauLO7gpMRzED1Rx2sWyeH02+0e+2BjR0LfOpREKDck PIQtCS26Npz4j3Jw0mqhr7gNo+Wj0Kkl00aNzPvznrNZQT/mFap7078YU/CbHgEPHmKM pOMA== X-Gm-Message-State: AKwxyteqswdcsASjdzHFWbAUE2J0erFnxak2qy3x/7VvdnB+TEsv1v4W wfHxlu7lZ/MHD/g/VCq7mIs+Mg== X-Google-Smtp-Source: ACJfBouTnDnQc80exmXkZSgGUb2sHXfW/p4eCxI37+Z46ihV398nQHxBJbqTmxWVsZBfruzWQE4amA== X-Received: by 10.28.65.6 with SMTP id o6mr965846wma.145.1515587239639; Wed, 10 Jan 2018 04:27:19 -0800 (PST) Received: from cbtest8.netronome.com (host-79-78-33-110.static.as9105.net. [79.78.33.110]) by smtp.gmail.com with ESMTPSA id q186sm16907279wmb.6.2018.01.10.04.27.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 10 Jan 2018 04:27:19 -0800 (PST) From: Quentin Monnet To: daniel@iogearbox.net, alexei.starovoitov@gmail.com, netdev@vger.kernel.org Cc: oss-drivers@netronome.com, jakub.kicinski@netronome.com Subject: [PATCH bpf-next v2 02/14] nfp: fix incumbent kdoc warnings Date: Wed, 10 Jan 2018 12:25:55 +0000 Message-Id: <1515587167-1959-3-git-send-email-quentin.monnet@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> References: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jakub Kicinski We should use % instead of @ for documenting preprocessor defines. Add missing documentation of __NFP_REPR_TYPE_MAX. This gets rid of all remaining kdoc warnings in the driver. Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/netronome/nfp/nfp_net_ctrl.h | 111 +++++++++++----------- drivers/net/ethernet/netronome/nfp/nfp_net_repr.h | 1 + 2 files changed, 57 insertions(+), 55 deletions(-) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_ctrl.h b/drivers/net/ethernet/netronome/nfp/nfp_net_ctrl.h index 782d452e0fc2..25c36001bffa 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_ctrl.h +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_ctrl.h @@ -91,23 +91,24 @@ #define NFP_NET_RSS_IPV6_EX_UDP 9 /** - * @NFP_NET_TXR_MAX: Maximum number of TX rings - * @NFP_NET_RXR_MAX: Maximum number of RX rings + * Ring counts + * %NFP_NET_TXR_MAX: Maximum number of TX rings + * %NFP_NET_RXR_MAX: Maximum number of RX rings */ #define NFP_NET_TXR_MAX 64 #define NFP_NET_RXR_MAX 64 /** * Read/Write config words (0x0000 - 0x002c) - * @NFP_NET_CFG_CTRL: Global control - * @NFP_NET_CFG_UPDATE: Indicate which fields are updated - * @NFP_NET_CFG_TXRS_ENABLE: Bitmask of enabled TX rings - * @NFP_NET_CFG_RXRS_ENABLE: Bitmask of enabled RX rings - * @NFP_NET_CFG_MTU: Set MTU size - * @NFP_NET_CFG_FLBUFSZ: Set freelist buffer size (must be larger than MTU) - * @NFP_NET_CFG_EXN: MSI-X table entry for exceptions - * @NFP_NET_CFG_LSC: MSI-X table entry for link state changes - * @NFP_NET_CFG_MACADDR: MAC address + * %NFP_NET_CFG_CTRL: Global control + * %NFP_NET_CFG_UPDATE: Indicate which fields are updated + * %NFP_NET_CFG_TXRS_ENABLE: Bitmask of enabled TX rings + * %NFP_NET_CFG_RXRS_ENABLE: Bitmask of enabled RX rings + * %NFP_NET_CFG_MTU: Set MTU size + * %NFP_NET_CFG_FLBUFSZ: Set freelist buffer size (must be larger than MTU) + * %NFP_NET_CFG_EXN: MSI-X table entry for exceptions + * %NFP_NET_CFG_LSC: MSI-X table entry for link state changes + * %NFP_NET_CFG_MACADDR: MAC address * * TODO: * - define Error details in UPDATE @@ -176,14 +177,14 @@ /** * Read-only words (0x0030 - 0x0050): - * @NFP_NET_CFG_VERSION: Firmware version number - * @NFP_NET_CFG_STS: Status - * @NFP_NET_CFG_CAP: Capabilities (same bits as @NFP_NET_CFG_CTRL) - * @NFP_NET_CFG_MAX_TXRINGS: Maximum number of TX rings - * @NFP_NET_CFG_MAX_RXRINGS: Maximum number of RX rings - * @NFP_NET_CFG_MAX_MTU: Maximum support MTU - * @NFP_NET_CFG_START_TXQ: Start Queue Control Queue to use for TX (PF only) - * @NFP_NET_CFG_START_RXQ: Start Queue Control Queue to use for RX (PF only) + * %NFP_NET_CFG_VERSION: Firmware version number + * %NFP_NET_CFG_STS: Status + * %NFP_NET_CFG_CAP: Capabilities (same bits as %NFP_NET_CFG_CTRL) + * %NFP_NET_CFG_MAX_TXRINGS: Maximum number of TX rings + * %NFP_NET_CFG_MAX_RXRINGS: Maximum number of RX rings + * %NFP_NET_CFG_MAX_MTU: Maximum support MTU + * %NFP_NET_CFG_START_TXQ: Start Queue Control Queue to use for TX (PF only) + * %NFP_NET_CFG_START_RXQ: Start Queue Control Queue to use for RX (PF only) * * TODO: * - define more STS bits @@ -228,31 +229,31 @@ /** * RSS capabilities - * @NFP_NET_CFG_RSS_CAP_HFUNC: supported hash functions (same bits as - * @NFP_NET_CFG_RSS_HFUNC) + * %NFP_NET_CFG_RSS_CAP_HFUNC: supported hash functions (same bits as + * %NFP_NET_CFG_RSS_HFUNC) */ #define NFP_NET_CFG_RSS_CAP 0x0054 #define NFP_NET_CFG_RSS_CAP_HFUNC 0xff000000 /** * VXLAN/UDP encap configuration - * @NFP_NET_CFG_VXLAN_PORT: Base address of table of tunnels' UDP dst ports - * @NFP_NET_CFG_VXLAN_SZ: Size of the UDP port table in bytes + * %NFP_NET_CFG_VXLAN_PORT: Base address of table of tunnels' UDP dst ports + * %NFP_NET_CFG_VXLAN_SZ: Size of the UDP port table in bytes */ #define NFP_NET_CFG_VXLAN_PORT 0x0060 #define NFP_NET_CFG_VXLAN_SZ 0x0008 /** * BPF section - * @NFP_NET_CFG_BPF_ABI: BPF ABI version - * @NFP_NET_CFG_BPF_CAP: BPF capabilities - * @NFP_NET_CFG_BPF_MAX_LEN: Maximum size of JITed BPF code in bytes - * @NFP_NET_CFG_BPF_START: Offset at which BPF will be loaded - * @NFP_NET_CFG_BPF_DONE: Offset to jump to on exit - * @NFP_NET_CFG_BPF_STACK_SZ: Total size of stack area in 64B chunks - * @NFP_NET_CFG_BPF_INL_MTU: Packet data split offset in 64B chunks - * @NFP_NET_CFG_BPF_SIZE: Size of the JITed BPF code in instructions - * @NFP_NET_CFG_BPF_ADDR: DMA address of the buffer with JITed BPF code + * %NFP_NET_CFG_BPF_ABI: BPF ABI version + * %NFP_NET_CFG_BPF_CAP: BPF capabilities + * %NFP_NET_CFG_BPF_MAX_LEN: Maximum size of JITed BPF code in bytes + * %NFP_NET_CFG_BPF_START: Offset at which BPF will be loaded + * %NFP_NET_CFG_BPF_DONE: Offset to jump to on exit + * %NFP_NET_CFG_BPF_STACK_SZ: Total size of stack area in 64B chunks + * %NFP_NET_CFG_BPF_INL_MTU: Packet data split offset in 64B chunks + * %NFP_NET_CFG_BPF_SIZE: Size of the JITed BPF code in instructions + * %NFP_NET_CFG_BPF_ADDR: DMA address of the buffer with JITed BPF code */ #define NFP_NET_CFG_BPF_ABI 0x0080 #define NFP_NET_BPF_ABI 2 @@ -278,9 +279,9 @@ /** * RSS configuration (0x0100 - 0x01ac): * Used only when NFP_NET_CFG_CTRL_RSS is enabled - * @NFP_NET_CFG_RSS_CFG: RSS configuration word - * @NFP_NET_CFG_RSS_KEY: RSS "secret" key - * @NFP_NET_CFG_RSS_ITBL: RSS indirection table + * %NFP_NET_CFG_RSS_CFG: RSS configuration word + * %NFP_NET_CFG_RSS_KEY: RSS "secret" key + * %NFP_NET_CFG_RSS_ITBL: RSS indirection table */ #define NFP_NET_CFG_RSS_BASE 0x0100 #define NFP_NET_CFG_RSS_CTRL NFP_NET_CFG_RSS_BASE @@ -305,13 +306,13 @@ /** * TX ring configuration (0x200 - 0x800) - * @NFP_NET_CFG_TXR_BASE: Base offset for TX ring configuration - * @NFP_NET_CFG_TXR_ADDR: Per TX ring DMA address (8B entries) - * @NFP_NET_CFG_TXR_WB_ADDR: Per TX ring write back DMA address (8B entries) - * @NFP_NET_CFG_TXR_SZ: Per TX ring ring size (1B entries) - * @NFP_NET_CFG_TXR_VEC: Per TX ring MSI-X table entry (1B entries) - * @NFP_NET_CFG_TXR_PRIO: Per TX ring priority (1B entries) - * @NFP_NET_CFG_TXR_IRQ_MOD: Per TX ring interrupt moderation packet + * %NFP_NET_CFG_TXR_BASE: Base offset for TX ring configuration + * %NFP_NET_CFG_TXR_ADDR: Per TX ring DMA address (8B entries) + * %NFP_NET_CFG_TXR_WB_ADDR: Per TX ring write back DMA address (8B entries) + * %NFP_NET_CFG_TXR_SZ: Per TX ring ring size (1B entries) + * %NFP_NET_CFG_TXR_VEC: Per TX ring MSI-X table entry (1B entries) + * %NFP_NET_CFG_TXR_PRIO: Per TX ring priority (1B entries) + * %NFP_NET_CFG_TXR_IRQ_MOD: Per TX ring interrupt moderation packet */ #define NFP_NET_CFG_TXR_BASE 0x0200 #define NFP_NET_CFG_TXR_ADDR(_x) (NFP_NET_CFG_TXR_BASE + ((_x) * 0x8)) @@ -325,12 +326,12 @@ /** * RX ring configuration (0x0800 - 0x0c00) - * @NFP_NET_CFG_RXR_BASE: Base offset for RX ring configuration - * @NFP_NET_CFG_RXR_ADDR: Per RX ring DMA address (8B entries) - * @NFP_NET_CFG_RXR_SZ: Per RX ring ring size (1B entries) - * @NFP_NET_CFG_RXR_VEC: Per RX ring MSI-X table entry (1B entries) - * @NFP_NET_CFG_RXR_PRIO: Per RX ring priority (1B entries) - * @NFP_NET_CFG_RXR_IRQ_MOD: Per RX ring interrupt moderation (4B entries) + * %NFP_NET_CFG_RXR_BASE: Base offset for RX ring configuration + * %NFP_NET_CFG_RXR_ADDR: Per RX ring DMA address (8B entries) + * %NFP_NET_CFG_RXR_SZ: Per RX ring ring size (1B entries) + * %NFP_NET_CFG_RXR_VEC: Per RX ring MSI-X table entry (1B entries) + * %NFP_NET_CFG_RXR_PRIO: Per RX ring priority (1B entries) + * %NFP_NET_CFG_RXR_IRQ_MOD: Per RX ring interrupt moderation (4B entries) */ #define NFP_NET_CFG_RXR_BASE 0x0800 #define NFP_NET_CFG_RXR_ADDR(_x) (NFP_NET_CFG_RXR_BASE + ((_x) * 0x8)) @@ -343,7 +344,7 @@ /** * Interrupt Control/Cause registers (0x0c00 - 0x0d00) * These registers are only used when MSI-X auto-masking is not - * enabled (@NFP_NET_CFG_CTRL_MSIXAUTO not set). The array is index + * enabled (%NFP_NET_CFG_CTRL_MSIXAUTO not set). The array is index * by MSI-X entry and are 1B in size. If an entry is zero, the * corresponding entry is enabled. If the FW generates an interrupt, * it writes a cause into the corresponding field. This also masks @@ -393,8 +394,8 @@ /** * Per ring stats (0x1000 - 0x1800) * options, 64bit per entry - * @NFP_NET_CFG_TXR_STATS: TX ring statistics (Packet and Byte count) - * @NFP_NET_CFG_RXR_STATS: RX ring statistics (Packet and Byte count) + * %NFP_NET_CFG_TXR_STATS: TX ring statistics (Packet and Byte count) + * %NFP_NET_CFG_RXR_STATS: RX ring statistics (Packet and Byte count) */ #define NFP_NET_CFG_TXR_STATS_BASE 0x1000 #define NFP_NET_CFG_TXR_STATS(_x) (NFP_NET_CFG_TXR_STATS_BASE + \ @@ -418,10 +419,10 @@ /** * VLAN filtering using general use mailbox - * @NFP_NET_CFG_VLAN_FILTER: Base address of VLAN filter mailbox - * @NFP_NET_CFG_VLAN_FILTER_VID: VLAN ID to filter - * @NFP_NET_CFG_VLAN_FILTER_PROTO: VLAN proto to filter - * @NFP_NET_CFG_VXLAN_SZ: Size of the VLAN filter mailbox in bytes + * %NFP_NET_CFG_VLAN_FILTER: Base address of VLAN filter mailbox + * %NFP_NET_CFG_VLAN_FILTER_VID: VLAN ID to filter + * %NFP_NET_CFG_VLAN_FILTER_PROTO: VLAN proto to filter + * %NFP_NET_CFG_VXLAN_SZ: Size of the VLAN filter mailbox in bytes */ #define NFP_NET_CFG_VLAN_FILTER NFP_NET_CFG_MBOX_VAL #define NFP_NET_CFG_VLAN_FILTER_VID NFP_NET_CFG_VLAN_FILTER diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_repr.h b/drivers/net/ethernet/netronome/nfp/nfp_net_repr.h index 5d4d897bc9c6..cbc7badf40a0 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_repr.h +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_repr.h @@ -89,6 +89,7 @@ struct nfp_repr { * @NFP_REPR_TYPE_PHYS_PORT: external NIC port * @NFP_REPR_TYPE_PF: physical function * @NFP_REPR_TYPE_VF: virtual function + * @__NFP_REPR_TYPE_MAX: number of representor types */ enum nfp_repr_type { NFP_REPR_TYPE_PHYS_PORT, From patchwork Wed Jan 10 12:25:56 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Quentin Monnet X-Patchwork-Id: 858244 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="YGUqPpPz"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zGpDg1l4Cz9t45 for ; Wed, 10 Jan 2018 23:27:31 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934453AbeAJM10 (ORCPT ); Wed, 10 Jan 2018 07:27:26 -0500 Received: from mail-wm0-f67.google.com ([74.125.82.67]:36069 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934432AbeAJM1X (ORCPT ); Wed, 10 Jan 2018 07:27:23 -0500 Received: by mail-wm0-f67.google.com with SMTP id b76so26936910wmg.1 for ; Wed, 10 Jan 2018 04:27:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Ria32NtWZX8I6vMPPRuMs+HFFo4wb+nZF2AvlZQkCfs=; b=YGUqPpPzG8bi/J8Bv4NYqGSUwTof+Ahg6w3bLFKeFhn85jgYsGFBHS909PRdOwmKBS jQzhWlmvV6kijWOKQxHoFMZ3azEKeIn2R2eDewDI2iGK+Sal+mdESx2v/pPapR9z5TSx LTh7iTAvD7k4Fysa+5eT1Fpf3JEOfJmbudiKBm9b7QKAQ/VcWKBJ0Ev3GenHKGgxB8+b xZB/d4QXVAJ/iTpT4RG5klmpaG4HWTQhCjVtbvnAwlXMvkX22bphXoIL04eRV5MFwWQm M2lSZdIxUR/NHg9tefsmCdAgM+9HqMXQYY3wO1irrH2+r0BvRLburKHVW189QsHwlsKn AUUg== 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; bh=Ria32NtWZX8I6vMPPRuMs+HFFo4wb+nZF2AvlZQkCfs=; b=ueL4Ti3ZHKi3ApyAp4Pzniisbhbnv09G7iYjqKCIsPbNws4tpE8YqMlzOlduFkGiOx xyaiy8Ptlccophz28TI8A/1ClLpIpZv6RWALE60nTZzYtAa9OZYzQKSBaOPm7cg7oFHl +HshhoDD3wszdlkteoo5xNAdNsvBtsjwj3y4f0Dgwms8xVxCrF0R9piGGpfoXxW7bqX4 0qd6FpjBUmolWsSTZaGIeXIRbtwAskz3VPF1hAi6EH716Gfo/A2HISH34jgZAcd35Tym OE2LotHE65p51mm9WBDy76DeA1wXVl5bnm3DxXhdEnbD6DGGpHa40L+QkFH8IM1Rrj+O +tFA== X-Gm-Message-State: AKwxytfrO/1IKEaJhKjHlwEKSt+wtqT3+8YsVpv7+ZS0rhy7V1QDwFAD 5Bf/BU47VUG/9N/deCS12df+WBI0 X-Google-Smtp-Source: ACJfBov/U1cgU8rrQk7tnEliXJGqH7ONjizIqM4kHSvN7E/Jh0tugz4XUSsGX2NPba2kpvga//GNgQ== X-Received: by 10.28.99.9 with SMTP id x9mr4607886wmb.70.1515587242210; Wed, 10 Jan 2018 04:27:22 -0800 (PST) Received: from cbtest8.netronome.com (host-79-78-33-110.static.as9105.net. [79.78.33.110]) by smtp.gmail.com with ESMTPSA id q186sm16907279wmb.6.2018.01.10.04.27.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 10 Jan 2018 04:27:21 -0800 (PST) From: Quentin Monnet To: daniel@iogearbox.net, alexei.starovoitov@gmail.com, netdev@vger.kernel.org Cc: oss-drivers@netronome.com, jakub.kicinski@netronome.com Subject: [PATCH bpf-next v2 03/14] nfp: bpf: round up the size of the stack Date: Wed, 10 Jan 2018 12:25:56 +0000 Message-Id: <1515587167-1959-4-git-send-email-quentin.monnet@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> References: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jakub Kicinski Kernel enforces the alignment of the bottom of the stack, NFP deals with positive offsets better so we should align the top of the stack. Round the stack size to NFP word size (4B). Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/netronome/nfp/bpf/offload.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/netronome/nfp/bpf/offload.c b/drivers/net/ethernet/netronome/nfp/bpf/offload.c index fa2905e67b07..8dbf13450bab 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/offload.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/offload.c @@ -147,7 +147,7 @@ int nfp_bpf_translate(struct nfp_app *app, struct nfp_net *nn, return -EOPNOTSUPP; } - nfp_prog->stack_depth = prog->aux->stack_depth; + nfp_prog->stack_depth = round_up(prog->aux->stack_depth, 4); nfp_prog->start_off = nn_readw(nn, NFP_NET_CFG_BPF_START); nfp_prog->tgt_done = nn_readw(nn, NFP_NET_CFG_BPF_DONE); From patchwork Wed Jan 10 12:25:57 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Quentin Monnet X-Patchwork-Id: 858255 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="rP5k9MnP"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zGpJz524qz9sPk for ; Wed, 10 Jan 2018 23:31:15 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965683AbeAJMbN (ORCPT ); Wed, 10 Jan 2018 07:31:13 -0500 Received: from mail-wr0-f194.google.com ([209.85.128.194]:46114 "EHLO mail-wr0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934430AbeAJM1Y (ORCPT ); Wed, 10 Jan 2018 07:27:24 -0500 Received: by mail-wr0-f194.google.com with SMTP id g21so11357357wrb.13 for ; Wed, 10 Jan 2018 04:27:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=lp/SYZvbWNua/XUSWlPG23VGGJO19KtI2FcvR+Xe8j4=; b=rP5k9MnP3fNfHv3IB2uUIbtFUjDVxNjKuBrayKZAzbdUfUByUsWufMKyQ0oa4kWafl LF2+De8NqjgcnAvzxqo8P56D51MDU/b8X7kPw1rIgJpfMUtLppFC3BtZAyXyDegSApyE UQtaqjQNb6fpLwJjAzYF0XgPOMJREjcGQ1ILg9xTSqF1m6Xi7q4PVJBut8uz0i+ceEZY yFUh4jGSWVn2PEtSjzb2eRZoZdKDLivX3WQ7FCNIm5EGpZgtPfir/cBelmivnHrMRZM8 BXgrrNAk+EIRBkluDPtEdQdoL1bTJTHlgreE6mFEsSWGj+Y4euG9xW1ow4P4lJ1X/rbB uCvQ== 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; bh=lp/SYZvbWNua/XUSWlPG23VGGJO19KtI2FcvR+Xe8j4=; b=MKcQORGKH6EOOAtGqYCpQ+12cCs9+CpKEwQsEq6GdMMBTbQ6mw73JztzCKvXKPmqOg 662vTslFeS7if0iPhSwwkaZomQYXXeRG/QhWxGPSxR+Yv5sPrqZiAwlkiPP4W3gyzKcb UI2NV3RB5kXdT94mD+/0QDYtbo4SrRh6etdmUOdzyYqjZMiX4KdHPsOUSk/jUE1J3FLt vfJliHFtWppc9EGz/vSEnvWdLobFSSmPzrw9ZsfLZlXKv+t12RauputGQZ5leGPgr4gu NatTFtqW1BLPZlkn/5+l5DX0nxDYH8AR6Kd/zSCqaLmNeo+ntM8j+8SLHC/yuMnoX9MC wxlQ== X-Gm-Message-State: AKGB3mJx7xlWm8YfgoCcIPRIsJheNrZjGxXIfOXjqFfNgXT0DQzvz1QW mdpUZrrqv+RVM1PnC0jUtWUzHA== X-Google-Smtp-Source: ACJfBovfPfowQUz1qcMe3ADV1btU3wO7+7fn317enJ2guPMo8Bokl5nJwvmNY8JXetynd7cXNhPTXw== X-Received: by 10.223.199.205 with SMTP id y13mr9904438wrg.114.1515587243582; Wed, 10 Jan 2018 04:27:23 -0800 (PST) Received: from cbtest8.netronome.com (host-79-78-33-110.static.as9105.net. [79.78.33.110]) by smtp.gmail.com with ESMTPSA id q186sm16907279wmb.6.2018.01.10.04.27.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 10 Jan 2018 04:27:22 -0800 (PST) From: Quentin Monnet To: daniel@iogearbox.net, alexei.starovoitov@gmail.com, netdev@vger.kernel.org Cc: oss-drivers@netronome.com, jakub.kicinski@netronome.com Subject: [PATCH bpf-next v2 04/14] nfp: bpf: don't allow changing MTU above BPF offload limit when active Date: Wed, 10 Jan 2018 12:25:57 +0000 Message-Id: <1515587167-1959-5-git-send-email-quentin.monnet@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> References: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jakub Kicinski When BPF offload is active we need may need to restrict the MTU changes more than just to the limitation of the kernel XDP datapath. Allow the BPF code to veto a MTU change. Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/netronome/nfp/bpf/main.c | 20 ++++++++++++++++++++ drivers/net/ethernet/netronome/nfp/nfp_app.h | 13 +++++++++++++ drivers/net/ethernet/netronome/nfp/nfp_net_common.c | 5 +++++ drivers/net/ethernet/netronome/nfp/nfp_net_repr.c | 8 ++++++++ 4 files changed, 46 insertions(+) diff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.c b/drivers/net/ethernet/netronome/nfp/bpf/main.c index 4b63167906ca..978086580ca0 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/main.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/main.c @@ -195,6 +195,24 @@ static bool nfp_bpf_tc_busy(struct nfp_app *app, struct nfp_net *nn) } static int +nfp_bpf_change_mtu(struct nfp_app *app, struct net_device *netdev, int new_mtu) +{ + struct nfp_net *nn = netdev_priv(netdev); + unsigned int max_mtu; + + if (~nn->dp.ctrl & NFP_NET_CFG_CTRL_BPF) + return 0; + + max_mtu = nn_readb(nn, NFP_NET_CFG_BPF_INL_MTU) * 64 - 32; + if (new_mtu > max_mtu) { + nn_info(nn, "BPF offload active, MTU over %u not supported\n", + max_mtu); + return -EBUSY; + } + return 0; +} + +static int nfp_bpf_parse_cap_adjust_head(struct nfp_app_bpf *bpf, void __iomem *value, u32 length) { @@ -311,6 +329,8 @@ const struct nfp_app_type app_bpf = { .init = nfp_bpf_init, .clean = nfp_bpf_clean, + .change_mtu = nfp_bpf_change_mtu, + .extra_cap = nfp_bpf_extra_cap, .vnic_alloc = nfp_bpf_vnic_alloc, diff --git a/drivers/net/ethernet/netronome/nfp/nfp_app.h b/drivers/net/ethernet/netronome/nfp/nfp_app.h index 3af1943a8521..e6b59c28c4ca 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_app.h +++ b/drivers/net/ethernet/netronome/nfp/nfp_app.h @@ -82,6 +82,8 @@ extern const struct nfp_app_type app_flower; * @repr_clean: representor about to be unregistered * @repr_open: representor netdev open callback * @repr_stop: representor netdev stop callback + * @change_mtu: MTU change on a netdev has been requested (veto-only, change + * is not guaranteed to be committed) * @start: start application logic * @stop: stop application logic * @ctrl_msg_rx: control message handler @@ -120,6 +122,9 @@ struct nfp_app_type { int (*repr_open)(struct nfp_app *app, struct nfp_repr *repr); int (*repr_stop)(struct nfp_app *app, struct nfp_repr *repr); + int (*change_mtu)(struct nfp_app *app, struct net_device *netdev, + int new_mtu); + int (*start)(struct nfp_app *app); void (*stop)(struct nfp_app *app); @@ -242,6 +247,14 @@ nfp_app_repr_clean(struct nfp_app *app, struct net_device *netdev) app->type->repr_clean(app, netdev); } +static inline int +nfp_app_change_mtu(struct nfp_app *app, struct net_device *netdev, int new_mtu) +{ + if (!app || !app->type->change_mtu) + return 0; + return app->type->change_mtu(app, netdev, new_mtu); +} + static inline int nfp_app_start(struct nfp_app *app, struct nfp_net *ctrl) { app->ctrl = ctrl; diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c index 104d6c520a52..33cbb9b35e68 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c @@ -3049,6 +3049,11 @@ static int nfp_net_change_mtu(struct net_device *netdev, int new_mtu) { struct nfp_net *nn = netdev_priv(netdev); struct nfp_net_dp *dp; + int err; + + err = nfp_app_change_mtu(nn->app, netdev, new_mtu); + if (err) + return err; dp = nfp_net_clone_dp(nn); if (!dp) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c b/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c index f50aa119570a..317f87cc3cc6 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c @@ -186,6 +186,13 @@ nfp_repr_get_offload_stats(int attr_id, const struct net_device *dev, return -EINVAL; } +static int nfp_repr_change_mtu(struct net_device *netdev, int new_mtu) +{ + struct nfp_repr *repr = netdev_priv(netdev); + + return nfp_app_change_mtu(repr->app, netdev, new_mtu); +} + static netdev_tx_t nfp_repr_xmit(struct sk_buff *skb, struct net_device *netdev) { struct nfp_repr *repr = netdev_priv(netdev); @@ -240,6 +247,7 @@ const struct net_device_ops nfp_repr_netdev_ops = { .ndo_open = nfp_repr_open, .ndo_stop = nfp_repr_stop, .ndo_start_xmit = nfp_repr_xmit, + .ndo_change_mtu = nfp_repr_change_mtu, .ndo_get_stats64 = nfp_repr_get_stats64, .ndo_has_offload_stats = nfp_repr_has_offload_stats, .ndo_get_offload_stats = nfp_repr_get_offload_stats, From patchwork Wed Jan 10 12:25:58 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Quentin Monnet X-Patchwork-Id: 858247 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="yERadaf6"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zGpF063nQz9t0m for ; Wed, 10 Jan 2018 23:27:48 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934491AbeAJM1h (ORCPT ); Wed, 10 Jan 2018 07:27:37 -0500 Received: from mail-wr0-f196.google.com ([209.85.128.196]:39657 "EHLO mail-wr0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934446AbeAJM1Z (ORCPT ); Wed, 10 Jan 2018 07:27:25 -0500 Received: by mail-wr0-f196.google.com with SMTP id z48so11432710wrz.6 for ; Wed, 10 Jan 2018 04:27:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Bsaov3jufOYFm3auBxoFWXgtIl6PDbZz+YPQaxLz7Rk=; b=yERadaf6+4BP/xt4IqK4E+JDvO07FkETJiNuEdD8/NRfgpKN932A7W+ExCKiezMGFX WCNKphoJRWBRuSivIq6dbEH+1qi4qz9lPN7qMGHvQ7ze+OOlAw41noErrPze7dK79p8c OE10z/lJ9gZzadq8mMqrmF8Yt7v0RaeMJkdLtiSrXVy2ITMUf/Taz/0g/WGfJU6AW3Hx ZHZtUFDyki53Qx6X0zDyaMouyyyyEh/S7rFK3XqWi7XzweYdds3xXBElL01+B0nXxnm9 uOmhBNbNv3w9DWhjGvnLMOBKiFo0kK34riiSZ8EULoqFDDxt/X1z8Bh4dEHQwNpktbfc utaQ== 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; bh=Bsaov3jufOYFm3auBxoFWXgtIl6PDbZz+YPQaxLz7Rk=; b=I7s8iAVbwJ4XR1b59IEIn5QHiBnqupS/J8RIfuYRqsbUGli5H788M/qb9/RViyHYbx gvXLkv3c6IhNRwP+vVBNsOHnlKNzSXgmehdA0UyJoZADhgkbTiD7nunFIz9O/QlndANz DX4qtbU1sL7rwyqBJFzkOX62wxhzxnG0seFmHX6HUWgTAjC92I2Bu4sYiP5cw2TOJ7Iz M/m8j8Ip04W/iAXkL8DsAXEd0J/x4SPKL3yJmEC21T1amhe1makNozGaF/FUSFl/2TNf Hs/HKGeKW0M0dMbp9bq05Fzu8zJrG0OEz9egTQ40A1BDAWdphp8kLeUXE/vUrEkc/VZY 993Q== X-Gm-Message-State: AKwxytfOKQWgxsDRj9yBsCf2LrBRqKz2TbwNxuSiWYj7vkenk/S5ei2X UA3/PBmNdjvjjBF7IlkCWppGQQ== X-Google-Smtp-Source: ACJfBovWbhgWnphNzeza0MIr7ZinrdaKw/Xlv1ITNlcQk7rrfDjKEtfHUeJ1d2xQAfUo5VGrr0ujXg== X-Received: by 10.223.160.55 with SMTP id k52mr1592847wrk.5.1515587244781; Wed, 10 Jan 2018 04:27:24 -0800 (PST) Received: from cbtest8.netronome.com (host-79-78-33-110.static.as9105.net. [79.78.33.110]) by smtp.gmail.com with ESMTPSA id q186sm16907279wmb.6.2018.01.10.04.27.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 10 Jan 2018 04:27:24 -0800 (PST) From: Quentin Monnet To: daniel@iogearbox.net, alexei.starovoitov@gmail.com, netdev@vger.kernel.org Cc: oss-drivers@netronome.com, jakub.kicinski@netronome.com Subject: [PATCH bpf-next v2 05/14] nfp: bpf: allow disabling TC offloads when XDP active Date: Wed, 10 Jan 2018 12:25:58 +0000 Message-Id: <1515587167-1959-6-git-send-email-quentin.monnet@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> References: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jakub Kicinski TC BPF offload was added first, so we used to assume that the ethtool TC HW offload flag cannot be touched whenever any BPF program is loaded on the NIC. This unncessarily limits changes to the TC flag when offloaded program is XDP. Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/netronome/nfp/bpf/main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.c b/drivers/net/ethernet/netronome/nfp/bpf/main.c index 978086580ca0..50b16b6cad0b 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/main.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/main.c @@ -191,7 +191,9 @@ static int nfp_bpf_setup_tc(struct nfp_app *app, struct net_device *netdev, static bool nfp_bpf_tc_busy(struct nfp_app *app, struct nfp_net *nn) { - return nn->dp.ctrl & NFP_NET_CFG_CTRL_BPF; + struct nfp_bpf_vnic *bv = nn->app_priv; + + return !!bv->tc_prog; } static int From patchwork Wed Jan 10 12:25:59 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Quentin Monnet X-Patchwork-Id: 858245 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="m8KBOpr4"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zGpDn2qmDz9s7M for ; Wed, 10 Jan 2018 23:27:37 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934479AbeAJM1f (ORCPT ); Wed, 10 Jan 2018 07:27:35 -0500 Received: from mail-wr0-f194.google.com ([209.85.128.194]:34989 "EHLO mail-wr0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934455AbeAJM11 (ORCPT ); Wed, 10 Jan 2018 07:27:27 -0500 Received: by mail-wr0-f194.google.com with SMTP id n9so7278545wrg.2 for ; Wed, 10 Jan 2018 04:27:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=dzoCeDJ4Hus/XIXNYCngzATPOGGJ3vjKYDCH/nrfoeI=; b=m8KBOpr4b0uG4QQ/gf2vQi8bNrNDwY1P/kYq6ZRNMq/mAXhis4l8xzcKwbB0TNNBiQ BaIOkKWjB0bS4X+fe13VEUAvdy2NuEu4OQlF14IVwVji0jv6wzs0pVz7VVF3H00AfYCe 9YZsDY9p01J33aOec8XUiH7R7kncUZBc9YaEq4EFnS556HDYdQNSe+7m6yt6Pa7TFhDV vAoP4mmWXPmEXoK9detzckuMFH+HE0vg8reCfUMFj1nxfK368aExVNtDT9mDJ/W7vmUy eXWo15ollMEFnzZT6lydvMtdY/gE6yZyotwGt9nR6kwcw9RGgg4CKbh8Z8qq6C4Hk7dg ON6w== 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; bh=dzoCeDJ4Hus/XIXNYCngzATPOGGJ3vjKYDCH/nrfoeI=; b=MP2bQBKCq4FKGxjxwyF7z9AzK/kwbfvJjYSPQBqmNelkjdtT5OghSBIOzGXtiZ5izB h10RQKLbEt4v26eBS4bm26CrgzquiSxMx7fK9XvNM7DZNvM6vq3mz6tVFg1wesixyxqv zsdbx3hNZCuzn5MZ7J+KZNPFPUQ6awJYtZ8n5OxhOmcpmYd37uVN6ugOrzIvYuCTfpd9 /iP2z0nistBs0YBggeKyC1HL/TceYqF3k/Po8YBXJ6hQHqnczlrHB313TmhjP3x+k9Bw yWM1eS18uNCWzpWe1WAmwqmO9y5d4qQMgyxPBdpI5sJ7J73BZiD1Vm+Rw7WJmfVHfo9d 5yNA== X-Gm-Message-State: AKGB3mKHZ0DdPwhYQyU/MPXkLKZn+qtrTRvORMRKQwszbOJ0uQZBqU5k zqgeOb2eDMPHY6ywEsxx8SW+2Hl5 X-Google-Smtp-Source: ACJfBossp0rnMRRKVzGtOwyWbT87kdqv22LvZq0ACKu3jXqo4oMZoOnocF3+ZA8h7bbs4ZvPQughGw== X-Received: by 10.223.136.110 with SMTP id e43mr6795807wre.98.1515587245875; Wed, 10 Jan 2018 04:27:25 -0800 (PST) Received: from cbtest8.netronome.com (host-79-78-33-110.static.as9105.net. [79.78.33.110]) by smtp.gmail.com with ESMTPSA id q186sm16907279wmb.6.2018.01.10.04.27.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 10 Jan 2018 04:27:25 -0800 (PST) From: Quentin Monnet To: daniel@iogearbox.net, alexei.starovoitov@gmail.com, netdev@vger.kernel.org Cc: oss-drivers@netronome.com, jakub.kicinski@netronome.com Subject: [PATCH bpf-next v2 06/14] nfp: bpf: move jump resolution to jit.c Date: Wed, 10 Jan 2018 12:25:59 +0000 Message-Id: <1515587167-1959-7-git-send-email-quentin.monnet@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> References: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jakub Kicinski Jump target resolution should be in jit.c not offload.c. No functional changes. Signed-off-by: Jakub Kicinski Reviewed-by: Jiong Wang --- drivers/net/ethernet/netronome/nfp/bpf/jit.c | 23 +++++++++++++++++++++++ drivers/net/ethernet/netronome/nfp/bpf/main.h | 1 + drivers/net/ethernet/netronome/nfp/bpf/offload.c | 18 +----------------- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/drivers/net/ethernet/netronome/nfp/bpf/jit.c b/drivers/net/ethernet/netronome/nfp/bpf/jit.c index 0de59f04da84..9caff3a7505a 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/jit.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/jit.c @@ -2742,3 +2742,26 @@ int nfp_bpf_jit(struct nfp_prog *nfp_prog) return nfp_bpf_ustore_calc(nfp_prog, (__force __le64 *)nfp_prog->prog); } + +void nfp_bpf_jit_prepare(struct nfp_prog *nfp_prog, unsigned int cnt) +{ + struct nfp_insn_meta *meta; + + /* Another pass to record jump information. */ + list_for_each_entry(meta, &nfp_prog->insns, l) { + u64 code = meta->insn.code; + + if (BPF_CLASS(code) == BPF_JMP && BPF_OP(code) != BPF_EXIT && + BPF_OP(code) != BPF_CALL) { + struct nfp_insn_meta *dst_meta; + unsigned short dst_indx; + + dst_indx = meta->n + 1 + meta->insn.off; + dst_meta = nfp_bpf_goto_meta(nfp_prog, meta, dst_indx, + cnt); + + meta->jmp_dst = dst_meta; + dst_meta->flags |= FLAG_INSN_IS_JUMP_DST; + } + } +} diff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.h b/drivers/net/ethernet/netronome/nfp/bpf/main.h index 89a9b6393882..0b1347f2afd1 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/main.h +++ b/drivers/net/ethernet/netronome/nfp/bpf/main.h @@ -236,6 +236,7 @@ struct nfp_bpf_vnic { struct bpf_prog *tc_prog; }; +void nfp_bpf_jit_prepare(struct nfp_prog *nfp_prog, unsigned int cnt); int nfp_bpf_jit(struct nfp_prog *prog); extern const struct bpf_prog_offload_ops nfp_bpf_analyzer_ops; diff --git a/drivers/net/ethernet/netronome/nfp/bpf/offload.c b/drivers/net/ethernet/netronome/nfp/bpf/offload.c index 8dbf13450bab..0ca6faaacc58 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/offload.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/offload.c @@ -70,23 +70,7 @@ nfp_prog_prepare(struct nfp_prog *nfp_prog, const struct bpf_insn *prog, list_add_tail(&meta->l, &nfp_prog->insns); } - /* Another pass to record jump information. */ - list_for_each_entry(meta, &nfp_prog->insns, l) { - u64 code = meta->insn.code; - - if (BPF_CLASS(code) == BPF_JMP && BPF_OP(code) != BPF_EXIT && - BPF_OP(code) != BPF_CALL) { - struct nfp_insn_meta *dst_meta; - unsigned short dst_indx; - - dst_indx = meta->n + 1 + meta->insn.off; - dst_meta = nfp_bpf_goto_meta(nfp_prog, meta, dst_indx, - cnt); - - meta->jmp_dst = dst_meta; - dst_meta->flags |= FLAG_INSN_IS_JUMP_DST; - } - } + nfp_bpf_jit_prepare(nfp_prog, cnt); return 0; } From patchwork Wed Jan 10 12:26:00 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Quentin Monnet X-Patchwork-Id: 858252 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="NnoYIGjr"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zGpJp0P1Fz9t0m for ; Wed, 10 Jan 2018 23:31:06 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934472AbeAJM1d (ORCPT ); Wed, 10 Jan 2018 07:27:33 -0500 Received: from mail-wr0-f194.google.com ([209.85.128.194]:37884 "EHLO mail-wr0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934456AbeAJM12 (ORCPT ); Wed, 10 Jan 2018 07:27:28 -0500 Received: by mail-wr0-f194.google.com with SMTP id f8so17165721wre.4 for ; Wed, 10 Jan 2018 04:27:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=S1OvWlsoLcU6YlGnsBIJsTwhQMBFW9h40UcSjfZcBtk=; b=NnoYIGjrX1zf6SxywGTodyUgNs2G+CC3d4vYk82DlsRfpKkFS2mf6RI6sJpFKw8nqi GDIZ7GmQxeZqNp5b5NdKof5eNKGv1YGIJEVKIevBYqN793vZ6khw7SAIFXGhFyPV9ikf 9xps/GLsj5dn/LOXxlcbpKB/NBNbp7tzpK0oeCtObEMORIwr4rGo6ibIJKZX2KgRodjz RU+nS+II3uD67vcHBTu2UvyfhlyP9ou212qDqDEzpH5S4Iml35xbriwHTQE5IcsYQbc4 iBEYU0vfVThpHzOouPsa72oTmvYr2wW61zInrgts/HO0cSw+oKzq+OJrpSGiyL9RNfj0 4m8g== 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; bh=S1OvWlsoLcU6YlGnsBIJsTwhQMBFW9h40UcSjfZcBtk=; b=iun21enFpNbVjpgF3IkAbxOb1WBHPo9D/I3bLiSBuafeQOzrotfDwanTlZKm0npsl7 TWwjBB8SQ7Z8FnwjHwnejb6fSNUd6t5/FlUFMtkBPTi1tyu7PZYF1mcSTcrIefGp33va VZn5SMwLkWPh/+yxio4vZ+SVQk1mFmx5xhJAm/5mywyCHgCBcRo8Jhc7OiyynAMD39p/ U/M/syG3GpaIPqO1dRNwkIEiWRUr6ImacjmY29RwnkUfNiSSfh9DvDwrcpVG9wfJF4Dn JHXsZKZSK3VBRBhEWcuc3eoqdVzxCpBdbG7ZDu0aDbWv1e1fcUb5x3dIPYL+NEF+B8Ul bKRw== X-Gm-Message-State: AKGB3mL7kHxpPGy37ORzS7t1A04hTEZ0bJkGZVbpfh1SX4WLDQF1/bia Yjd2HHOlE8ytSa7nvVYWCnrjGQ== X-Google-Smtp-Source: ACJfBosSKfsi7rxfOGskJqPyhAaWbAQO4WEmuAxy0oJM7T1asp9fMH5ofGYjoa7SBQWogeDu6u6xVA== X-Received: by 10.223.193.11 with SMTP id r11mr9362745wre.175.1515587247071; Wed, 10 Jan 2018 04:27:27 -0800 (PST) Received: from cbtest8.netronome.com (host-79-78-33-110.static.as9105.net. [79.78.33.110]) by smtp.gmail.com with ESMTPSA id q186sm16907279wmb.6.2018.01.10.04.27.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 10 Jan 2018 04:27:26 -0800 (PST) From: Quentin Monnet To: daniel@iogearbox.net, alexei.starovoitov@gmail.com, netdev@vger.kernel.org Cc: oss-drivers@netronome.com, jakub.kicinski@netronome.com Subject: [PATCH bpf-next v2 07/14] nfp: bpf: add helpers for modifying branch addresses Date: Wed, 10 Jan 2018 12:26:00 +0000 Message-Id: <1515587167-1959-8-git-send-email-quentin.monnet@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> References: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jakub Kicinski In preparation for better handling of relocations move existing helper for setting branch offset to nfp_asm.c and add two more. Signed-off-by: Jakub Kicinski Reviewed-by: Jiong Wang --- drivers/net/ethernet/netronome/nfp/bpf/jit.c | 12 ----------- drivers/net/ethernet/netronome/nfp/nfp_asm.c | 30 ++++++++++++++++++++++++++++ drivers/net/ethernet/netronome/nfp/nfp_asm.h | 4 ++++ 3 files changed, 34 insertions(+), 12 deletions(-) diff --git a/drivers/net/ethernet/netronome/nfp/bpf/jit.c b/drivers/net/ethernet/netronome/nfp/bpf/jit.c index 9caff3a7505a..c5d1628a5414 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/jit.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/jit.c @@ -2110,18 +2110,6 @@ static const instr_cb_t instr_cb[256] = { [BPF_JMP | BPF_EXIT] = goto_out, }; -/* --- Misc code --- */ -static void br_set_offset(u64 *instr, u16 offset) -{ - u16 addr_lo, addr_hi; - - addr_lo = offset & (OP_BR_ADDR_LO >> __bf_shf(OP_BR_ADDR_LO)); - addr_hi = offset != addr_lo; - *instr &= ~(OP_BR_ADDR_HI | OP_BR_ADDR_LO); - *instr |= FIELD_PREP(OP_BR_ADDR_HI, addr_hi); - *instr |= FIELD_PREP(OP_BR_ADDR_LO, addr_lo); -} - /* --- Assembler logic --- */ static int nfp_fixup_branches(struct nfp_prog *nfp_prog) { diff --git a/drivers/net/ethernet/netronome/nfp/nfp_asm.c b/drivers/net/ethernet/netronome/nfp/nfp_asm.c index d3610987fb07..9ee3a3f60cc7 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_asm.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_asm.c @@ -50,6 +50,36 @@ const struct cmd_tgt_act cmd_tgt_act[__CMD_TGT_MAP_SIZE] = { [CMD_TGT_READ_SWAP_LE] = { 0x03, 0x40 }, }; +u16 br_get_offset(u64 instr) +{ + u16 addr_lo, addr_hi; + + addr_lo = FIELD_GET(OP_BR_ADDR_LO, instr); + addr_hi = FIELD_GET(OP_BR_ADDR_HI, instr); + + return (addr_hi * ((OP_BR_ADDR_LO >> __bf_shf(OP_BR_ADDR_LO)) + 1)) | + addr_lo; +} + +void br_set_offset(u64 *instr, u16 offset) +{ + u16 addr_lo, addr_hi; + + addr_lo = offset & (OP_BR_ADDR_LO >> __bf_shf(OP_BR_ADDR_LO)); + addr_hi = offset != addr_lo; + *instr &= ~(OP_BR_ADDR_HI | OP_BR_ADDR_LO); + *instr |= FIELD_PREP(OP_BR_ADDR_HI, addr_hi); + *instr |= FIELD_PREP(OP_BR_ADDR_LO, addr_lo); +} + +void br_add_offset(u64 *instr, u16 offset) +{ + u16 addr; + + addr = br_get_offset(*instr); + br_set_offset(instr, addr + offset); +} + static u16 nfp_swreg_to_unreg(swreg reg, bool is_dst) { bool lm_id, lm_dec = false; diff --git a/drivers/net/ethernet/netronome/nfp/nfp_asm.h b/drivers/net/ethernet/netronome/nfp/nfp_asm.h index a24daeab1a77..a50240ab0ce2 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_asm.h +++ b/drivers/net/ethernet/netronome/nfp/nfp_asm.h @@ -93,6 +93,10 @@ enum br_ctx_signal_state { BR_CSS_NONE = 2, }; +u16 br_get_offset(u64 instr); +void br_set_offset(u64 *instr, u16 offset); +void br_add_offset(u64 *instr, u16 offset); + #define OP_BBYTE_BASE 0x0c800000000ULL #define OP_BB_A_SRC 0x000000000ffULL #define OP_BB_BYTE 0x00000000300ULL From patchwork Wed Jan 10 12:26:01 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Quentin Monnet X-Patchwork-Id: 858248 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="OM2TYcdH"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zGpFk0680z9s9Y for ; Wed, 10 Jan 2018 23:28:26 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934486AbeAJM1g (ORCPT ); Wed, 10 Jan 2018 07:27:36 -0500 Received: from mail-wr0-f195.google.com ([209.85.128.195]:46125 "EHLO mail-wr0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934464AbeAJM1a (ORCPT ); Wed, 10 Jan 2018 07:27:30 -0500 Received: by mail-wr0-f195.google.com with SMTP id g21so11357624wrb.13 for ; Wed, 10 Jan 2018 04:27:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=vtBSzeSwqG1nBB1O84EDFN1f79vJSMJNcehzRlKGCv0=; b=OM2TYcdHDf5ZGuDgpsprHtHk2cGMUaqxkKUoqhb72FDDGpPQDGmQ8rC7RO05kCxM5C k1c1OfjwaE8hfxuGEPHBR/S8CCMybC+WzST/MANvRIrtEtjIBc/z+i9MJVATe9CccNQd xn60vUPQk0MSuUZCljQrKoeTKphBc2GvIWjGsLxHTUsodSTl1e18iIkArVHIXMX5YVhN ROqJ3LlLw57Fjq0FHSehVcVD4W4W7hp8npdzqmz1uhSMuzK0zFr4QGy5vkt1kXOr8/a/ IRhP5lvkoA/03fy0LcqEw/+G7jaXnzNjDa13eSxt4LFKu7yBhU8YnMLA+2tbtw5PlTPW 6jfg== 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; bh=vtBSzeSwqG1nBB1O84EDFN1f79vJSMJNcehzRlKGCv0=; b=sOt7DSDk/ZTY5XU+TdJm51b1R9oDXNSCR9JQVg29/zlmxN36nyO6/iXvTb7HrT4vsz NCyM6mYCTHxugCig38je01S1LRmKggH/ggsnW6xBoEgAK6CVcXYoymJKbrILmS90EWxA zm3jMJvfx/DoC8cYZXmRb85kj5/YhYXmezmWfPLUXkfs6AOEKsQvYkTgXHISSfNOn7p0 472eL+vQKO90HDnyxTHDvEZ0bglZ+fpAHON6qbHEf7aTW+4cGI9YhHQ0CmbcFxrzS84B yjfHsLh5FR/1v0WgY3jPjHg1mVR6d1+VUp0MCgTMdOjPLTYlHByCRWXe/GOjVTPFeGNF qAQA== X-Gm-Message-State: AKGB3mLgYAMKgPaVJ0TsSSRyWWoudtBHWVH0Eb2rkkqS8Y5PQD88ttSa hf/hgzIfHxvm/UvEe4xcmZ6LN2lB X-Google-Smtp-Source: ACJfBouazext69XdzAhvmFFqRuNcF9/FBqdkje7y6VWzbBZwljNC5rcSGuWHT6RIlusImKQqRw3lCA== X-Received: by 10.223.160.149 with SMTP id m21mr15871088wrm.112.1515587249024; Wed, 10 Jan 2018 04:27:29 -0800 (PST) Received: from cbtest8.netronome.com (host-79-78-33-110.static.as9105.net. [79.78.33.110]) by smtp.gmail.com with ESMTPSA id q186sm16907279wmb.6.2018.01.10.04.27.27 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 10 Jan 2018 04:27:28 -0800 (PST) From: Quentin Monnet To: daniel@iogearbox.net, alexei.starovoitov@gmail.com, netdev@vger.kernel.org Cc: oss-drivers@netronome.com, jakub.kicinski@netronome.com Subject: [PATCH bpf-next v2 08/14] nfp: bpf: relocate jump targets just before the load Date: Wed, 10 Jan 2018 12:26:01 +0000 Message-Id: <1515587167-1959-9-git-send-email-quentin.monnet@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> References: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jakub Kicinski Don't translate the program assuming it will be loaded at a given address. This will be required for sharing programs between ports of the same NIC, tail calls and subprograms. It will also make the jump targets easier to understand when dumping the program to user space. Translate the program as if it was going to be loaded at address zero. When load happens add the load offset in and set addresses of special branches. Signed-off-by: Jakub Kicinski Reviewed-by: Jiong Wang --- drivers/net/ethernet/netronome/nfp/bpf/jit.c | 149 ++++++++++++----------- drivers/net/ethernet/netronome/nfp/bpf/main.c | 9 +- drivers/net/ethernet/netronome/nfp/bpf/main.h | 29 +++-- drivers/net/ethernet/netronome/nfp/bpf/offload.c | 15 ++- 4 files changed, 115 insertions(+), 87 deletions(-) diff --git a/drivers/net/ethernet/netronome/nfp/bpf/jit.c b/drivers/net/ethernet/netronome/nfp/bpf/jit.c index c5d1628a5414..3a5c747fd12b 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/jit.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/jit.c @@ -85,7 +85,7 @@ static void nfp_prog_push(struct nfp_prog *nfp_prog, u64 insn) static unsigned int nfp_prog_current_offset(struct nfp_prog *nfp_prog) { - return nfp_prog->start_off + nfp_prog->prog_len; + return nfp_prog->prog_len; } static bool @@ -100,12 +100,6 @@ nfp_prog_confirm_current_offset(struct nfp_prog *nfp_prog, unsigned int off) return !WARN_ON_ONCE(nfp_prog_current_offset(nfp_prog) != off); } -static unsigned int -nfp_prog_offset_to_index(struct nfp_prog *nfp_prog, unsigned int offset) -{ - return offset - nfp_prog->start_off; -} - /* --- Emitters --- */ static void __emit_cmd(struct nfp_prog *nfp_prog, enum cmd_tgt_map op, @@ -195,22 +189,28 @@ __emit_br(struct nfp_prog *nfp_prog, enum br_mask mask, enum br_ev_pip ev_pip, nfp_prog_push(nfp_prog, insn); } -static void emit_br_def(struct nfp_prog *nfp_prog, u16 addr, u8 defer) +static void +emit_br_relo(struct nfp_prog *nfp_prog, enum br_mask mask, u16 addr, u8 defer, + enum nfp_relo_type relo) { - if (defer > 2) { + if (mask == BR_UNC && defer > 2) { pr_err("BUG: branch defer out of bounds %d\n", defer); nfp_prog->error = -EFAULT; return; } - __emit_br(nfp_prog, BR_UNC, BR_EV_PIP_UNCOND, BR_CSS_NONE, addr, defer); + + __emit_br(nfp_prog, mask, + mask != BR_UNC ? BR_EV_PIP_COND : BR_EV_PIP_UNCOND, + BR_CSS_NONE, addr, defer); + + nfp_prog->prog[nfp_prog->prog_len - 1] |= + FIELD_PREP(OP_RELO_TYPE, relo); } static void emit_br(struct nfp_prog *nfp_prog, enum br_mask mask, u16 addr, u8 defer) { - __emit_br(nfp_prog, mask, - mask != BR_UNC ? BR_EV_PIP_COND : BR_EV_PIP_UNCOND, - BR_CSS_NONE, addr, defer); + emit_br_relo(nfp_prog, mask, addr, defer, RELO_BR_REL); } static void @@ -515,16 +515,6 @@ static void wrp_nops(struct nfp_prog *nfp_prog, unsigned int count) emit_nop(nfp_prog); } -static void -wrp_br_special(struct nfp_prog *nfp_prog, enum br_mask mask, - enum br_special special) -{ - emit_br(nfp_prog, mask, 0, 0); - - nfp_prog->prog[nfp_prog->prog_len - 1] |= - FIELD_PREP(OP_BR_SPECIAL, special); -} - static void wrp_mov(struct nfp_prog *nfp_prog, swreg dst, swreg src) { emit_alu(nfp_prog, dst, reg_none(), ALU_OP_NONE, src); @@ -749,7 +739,7 @@ construct_data_ind_ld(struct nfp_prog *nfp_prog, u16 offset, u16 src, u8 size) imm_a(nfp_prog), ALU_OP_ADD, reg_imm(size)); emit_alu(nfp_prog, reg_none(), plen_reg(nfp_prog), ALU_OP_SUB, imm_a(nfp_prog)); - wrp_br_special(nfp_prog, BR_BLO, OP_BR_GO_ABORT); + emit_br_relo(nfp_prog, BR_BLO, 0, 0, RELO_BR_GO_ABORT); /* Load data */ return data_ld(nfp_prog, imm_b(nfp_prog), 0, size); @@ -762,7 +752,7 @@ static int construct_data_ld(struct nfp_prog *nfp_prog, u16 offset, u8 size) /* Check packet length */ tmp_reg = ur_load_imm_any(nfp_prog, offset + size, imm_a(nfp_prog)); emit_alu(nfp_prog, reg_none(), plen_reg(nfp_prog), ALU_OP_SUB, tmp_reg); - wrp_br_special(nfp_prog, BR_BLO, OP_BR_GO_ABORT); + emit_br_relo(nfp_prog, BR_BLO, 0, 0, RELO_BR_GO_ABORT); /* Load data */ tmp_reg = re_load_imm_any(nfp_prog, offset, imm_b(nfp_prog)); @@ -1269,7 +1259,7 @@ static int adjust_head(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) emit_ld_field(nfp_prog, pptr_reg(nfp_prog), 0x3, tmp, SHF_SC_NONE, 0); /* Skip over the -EINVAL ret code (defer 2) */ - emit_br_def(nfp_prog, end, 2); + emit_br(nfp_prog, BR_UNC, end, 2); emit_alu(nfp_prog, plen_reg(nfp_prog), plen_reg(nfp_prog), ALU_OP_SUB, reg_a(2 * 2)); @@ -2036,7 +2026,7 @@ static int call(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) static int goto_out(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) { - wrp_br_special(nfp_prog, BR_UNC, OP_BR_GO_OUT); + emit_br_relo(nfp_prog, BR_UNC, 0, 0, RELO_BR_GO_OUT); return 0; } @@ -2125,11 +2115,9 @@ static int nfp_fixup_branches(struct nfp_prog *nfp_prog) continue; if (list_is_last(&meta->l, &nfp_prog->insns)) - idx = nfp_prog->last_bpf_off; + br_idx = nfp_prog->last_bpf_off; else - idx = list_next_entry(meta, l)->off - 1; - - br_idx = nfp_prog_offset_to_index(nfp_prog, idx); + br_idx = list_next_entry(meta, l)->off - 1; if (!nfp_is_br(nfp_prog->prog[br_idx])) { pr_err("Fixup found block not ending in branch %d %02x %016llx!!\n", @@ -2137,7 +2125,8 @@ static int nfp_fixup_branches(struct nfp_prog *nfp_prog) return -ELOOP; } /* Leave special branches for later */ - if (FIELD_GET(OP_BR_SPECIAL, nfp_prog->prog[br_idx])) + if (FIELD_GET(OP_RELO_TYPE, nfp_prog->prog[br_idx]) != + RELO_BR_REL) continue; if (!meta->jmp_dst) { @@ -2152,38 +2141,13 @@ static int nfp_fixup_branches(struct nfp_prog *nfp_prog) return -ELOOP; } - for (idx = nfp_prog_offset_to_index(nfp_prog, meta->off); - idx <= br_idx; idx++) { + for (idx = meta->off; idx <= br_idx; idx++) { if (!nfp_is_br(nfp_prog->prog[idx])) continue; br_set_offset(&nfp_prog->prog[idx], jmp_dst->off); } } - /* Fixup 'goto out's separately, they can be scattered around */ - for (br_idx = 0; br_idx < nfp_prog->prog_len; br_idx++) { - enum br_special special; - - if ((nfp_prog->prog[br_idx] & OP_BR_BASE_MASK) != OP_BR_BASE) - continue; - - special = FIELD_GET(OP_BR_SPECIAL, nfp_prog->prog[br_idx]); - switch (special) { - case OP_BR_NORMAL: - break; - case OP_BR_GO_OUT: - br_set_offset(&nfp_prog->prog[br_idx], - nfp_prog->tgt_out); - break; - case OP_BR_GO_ABORT: - br_set_offset(&nfp_prog->prog[br_idx], - nfp_prog->tgt_abort); - break; - } - - nfp_prog->prog[br_idx] &= ~OP_BR_SPECIAL; - } - return 0; } @@ -2211,7 +2175,7 @@ static void nfp_outro_tc_da(struct nfp_prog *nfp_prog) /* Target for aborts */ nfp_prog->tgt_abort = nfp_prog_current_offset(nfp_prog); - emit_br_def(nfp_prog, nfp_prog->tgt_done, 2); + emit_br_relo(nfp_prog, BR_UNC, 0, 2, RELO_BR_NEXT_PKT); wrp_mov(nfp_prog, reg_a(0), NFP_BPF_ABI_FLAGS); emit_ld_field(nfp_prog, reg_a(0), 0xc, reg_imm(0x11), SHF_SC_L_SHF, 16); @@ -2238,7 +2202,7 @@ static void nfp_outro_tc_da(struct nfp_prog *nfp_prog) emit_shf(nfp_prog, reg_b(2), reg_imm(0xf), SHF_OP_AND, reg_b(3), SHF_SC_R_SHF, 0); - emit_br_def(nfp_prog, nfp_prog->tgt_done, 2); + emit_br_relo(nfp_prog, BR_UNC, 0, 2, RELO_BR_NEXT_PKT); emit_shf(nfp_prog, reg_b(2), reg_a(2), SHF_OP_OR, reg_b(2), SHF_SC_L_SHF, 4); @@ -2257,7 +2221,7 @@ static void nfp_outro_xdp(struct nfp_prog *nfp_prog) /* Target for aborts */ nfp_prog->tgt_abort = nfp_prog_current_offset(nfp_prog); - emit_br_def(nfp_prog, nfp_prog->tgt_done, 2); + emit_br_relo(nfp_prog, BR_UNC, 0, 2, RELO_BR_NEXT_PKT); wrp_mov(nfp_prog, reg_a(0), NFP_BPF_ABI_FLAGS); emit_ld_field(nfp_prog, reg_a(0), 0xc, reg_imm(0x82), SHF_SC_L_SHF, 16); @@ -2278,7 +2242,7 @@ static void nfp_outro_xdp(struct nfp_prog *nfp_prog) emit_shf(nfp_prog, reg_b(2), reg_imm(0xff), SHF_OP_AND, reg_b(2), SHF_SC_R_SHF, 0); - emit_br_def(nfp_prog, nfp_prog->tgt_done, 2); + emit_br_relo(nfp_prog, BR_UNC, 0, 2, RELO_BR_NEXT_PKT); wrp_mov(nfp_prog, reg_a(0), NFP_BPF_ABI_FLAGS); emit_ld_field(nfp_prog, reg_a(0), 0xc, reg_b(2), SHF_SC_L_SHF, 16); @@ -2694,20 +2658,19 @@ static int nfp_bpf_optimize(struct nfp_prog *nfp_prog) return 0; } -static int nfp_bpf_ustore_calc(struct nfp_prog *nfp_prog, __le64 *ustore) +static int nfp_bpf_ustore_calc(u64 *prog, unsigned int len) { + __le64 *ustore = (__force __le64 *)prog; int i; - for (i = 0; i < nfp_prog->prog_len; i++) { + for (i = 0; i < len; i++) { int err; - err = nfp_ustore_check_valid_no_ecc(nfp_prog->prog[i]); + err = nfp_ustore_check_valid_no_ecc(prog[i]); if (err) return err; - nfp_prog->prog[i] = nfp_ustore_calc_ecc_insn(nfp_prog->prog[i]); - - ustore[i] = cpu_to_le64(nfp_prog->prog[i]); + ustore[i] = cpu_to_le64(nfp_ustore_calc_ecc_insn(prog[i])); } return 0; @@ -2728,7 +2691,7 @@ int nfp_bpf_jit(struct nfp_prog *nfp_prog) return -EINVAL; } - return nfp_bpf_ustore_calc(nfp_prog, (__force __le64 *)nfp_prog->prog); + return ret; } void nfp_bpf_jit_prepare(struct nfp_prog *nfp_prog, unsigned int cnt) @@ -2753,3 +2716,51 @@ void nfp_bpf_jit_prepare(struct nfp_prog *nfp_prog, unsigned int cnt) } } } + +void *nfp_bpf_relo_for_vnic(struct nfp_prog *nfp_prog, struct nfp_bpf_vnic *bv) +{ + unsigned int i; + u64 *prog; + int err; + + prog = kmemdup(nfp_prog->prog, nfp_prog->prog_len * sizeof(u64), + GFP_KERNEL); + if (!prog) + return ERR_PTR(-ENOMEM); + + for (i = 0; i < nfp_prog->prog_len; i++) { + enum nfp_relo_type special; + + special = FIELD_GET(OP_RELO_TYPE, prog[i]); + switch (special) { + case RELO_NONE: + continue; + case RELO_BR_REL: + br_add_offset(&prog[i], bv->start_off); + break; + case RELO_BR_GO_OUT: + br_set_offset(&prog[i], + nfp_prog->tgt_out + bv->start_off); + break; + case RELO_BR_GO_ABORT: + br_set_offset(&prog[i], + nfp_prog->tgt_abort + bv->start_off); + break; + case RELO_BR_NEXT_PKT: + br_set_offset(&prog[i], bv->tgt_done); + break; + } + + prog[i] &= ~OP_RELO_TYPE; + } + + err = nfp_bpf_ustore_calc(prog, nfp_prog->prog_len); + if (err) + goto err_free_prog; + + return prog; + +err_free_prog: + kfree(prog); + return ERR_PTR(err); +} diff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.c b/drivers/net/ethernet/netronome/nfp/bpf/main.c index 50b16b6cad0b..9ed76ccdd3c1 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/main.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/main.c @@ -87,16 +87,21 @@ static const char *nfp_bpf_extra_cap(struct nfp_app *app, struct nfp_net *nn) static int nfp_bpf_vnic_alloc(struct nfp_app *app, struct nfp_net *nn, unsigned int id) { + struct nfp_bpf_vnic *bv; int err; - nn->app_priv = kzalloc(sizeof(struct nfp_bpf_vnic), GFP_KERNEL); - if (!nn->app_priv) + bv = kzalloc(sizeof(*bv), GFP_KERNEL); + if (!bv) return -ENOMEM; + nn->app_priv = bv; err = nfp_app_nic_vnic_alloc(app, nn, id); if (err) goto err_free_priv; + bv->start_off = nn_readw(nn, NFP_NET_CFG_BPF_START); + bv->tgt_done = nn_readw(nn, NFP_NET_CFG_BPF_DONE); + return 0; err_free_priv: kfree(nn->app_priv); diff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.h b/drivers/net/ethernet/netronome/nfp/bpf/main.h index 0b1347f2afd1..5deba5099618 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/main.h +++ b/drivers/net/ethernet/netronome/nfp/bpf/main.h @@ -42,15 +42,20 @@ #include "../nfp_asm.h" -/* For branch fixup logic use up-most byte of branch instruction as scratch +/* For relocation logic use up-most byte of branch instruction as scratch * area. Remember to clear this before sending instructions to HW! */ -#define OP_BR_SPECIAL 0xff00000000000000ULL - -enum br_special { - OP_BR_NORMAL = 0, - OP_BR_GO_OUT, - OP_BR_GO_ABORT, +#define OP_RELO_TYPE 0xff00000000000000ULL + +enum nfp_relo_type { + RELO_NONE = 0, + /* standard internal jumps */ + RELO_BR_REL, + /* internal jumps to parts of the outro */ + RELO_BR_GO_OUT, + RELO_BR_GO_ABORT, + /* external jumps to fixed addresses */ + RELO_BR_NEXT_PKT, }; enum static_regs { @@ -191,11 +196,9 @@ static inline bool is_mbpf_store(const struct nfp_insn_meta *meta) * @__prog_alloc_len: alloc size of @prog array * @verifier_meta: temporary storage for verifier's insn meta * @type: BPF program type - * @start_off: address of the first instruction in the memory * @last_bpf_off: address of the last instruction translated from BPF * @tgt_out: jump target for normal exit * @tgt_abort: jump target for abort (e.g. access outside of packet buffer) - * @tgt_done: jump target to get the next packet * @n_translated: number of successfully translated instructions (for errors) * @error: error code if something went wrong * @stack_depth: max stack depth from the verifier @@ -213,11 +216,9 @@ struct nfp_prog { enum bpf_prog_type type; - unsigned int start_off; unsigned int last_bpf_off; unsigned int tgt_out; unsigned int tgt_abort; - unsigned int tgt_done; unsigned int n_translated; int error; @@ -231,9 +232,13 @@ struct nfp_prog { /** * struct nfp_bpf_vnic - per-vNIC BPF priv structure * @tc_prog: currently loaded cls_bpf program + * @start_off: address of the first instruction in the memory + * @tgt_done: jump target to get the next packet */ struct nfp_bpf_vnic { struct bpf_prog *tc_prog; + unsigned int start_off; + unsigned int tgt_done; }; void nfp_bpf_jit_prepare(struct nfp_prog *nfp_prog, unsigned int cnt); @@ -257,4 +262,6 @@ int nfp_bpf_destroy(struct nfp_app *app, struct nfp_net *nn, struct nfp_insn_meta * nfp_bpf_goto_meta(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta, unsigned int insn_idx, unsigned int n_insns); + +void *nfp_bpf_relo_for_vnic(struct nfp_prog *nfp_prog, struct nfp_bpf_vnic *bv); #endif diff --git a/drivers/net/ethernet/netronome/nfp/bpf/offload.c b/drivers/net/ethernet/netronome/nfp/bpf/offload.c index 0ca6faaacc58..5f165e1d7648 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/offload.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/offload.c @@ -130,10 +130,7 @@ int nfp_bpf_translate(struct nfp_app *app, struct nfp_net *nn, prog->aux->stack_depth, stack_size); return -EOPNOTSUPP; } - nfp_prog->stack_depth = round_up(prog->aux->stack_depth, 4); - nfp_prog->start_off = nn_readw(nn, NFP_NET_CFG_BPF_START); - nfp_prog->tgt_done = nn_readw(nn, NFP_NET_CFG_BPF_DONE); max_instr = nn_readw(nn, NFP_NET_CFG_BPF_MAX_LEN); nfp_prog->__prog_alloc_len = max_instr * sizeof(u64); @@ -161,6 +158,7 @@ static int nfp_net_bpf_load(struct nfp_net *nn, struct bpf_prog *prog) struct nfp_prog *nfp_prog = prog->aux->offload->dev_priv; unsigned int max_mtu; dma_addr_t dma_addr; + void *img; int err; max_mtu = nn_readb(nn, NFP_NET_CFG_BPF_INL_MTU) * 64 - 32; @@ -169,11 +167,17 @@ static int nfp_net_bpf_load(struct nfp_net *nn, struct bpf_prog *prog) return -EOPNOTSUPP; } - dma_addr = dma_map_single(nn->dp.dev, nfp_prog->prog, + img = nfp_bpf_relo_for_vnic(nfp_prog, nn->app_priv); + if (IS_ERR(img)) + return PTR_ERR(img); + + dma_addr = dma_map_single(nn->dp.dev, img, nfp_prog->prog_len * sizeof(u64), DMA_TO_DEVICE); - if (dma_mapping_error(nn->dp.dev, dma_addr)) + if (dma_mapping_error(nn->dp.dev, dma_addr)) { + kfree(img); return -ENOMEM; + } nn_writew(nn, NFP_NET_CFG_BPF_SIZE, nfp_prog->prog_len); nn_writeq(nn, NFP_NET_CFG_BPF_ADDR, dma_addr); @@ -185,6 +189,7 @@ static int nfp_net_bpf_load(struct nfp_net *nn, struct bpf_prog *prog) dma_unmap_single(nn->dp.dev, dma_addr, nfp_prog->prog_len * sizeof(u64), DMA_TO_DEVICE); + kfree(img); return err; } From patchwork Wed Jan 10 12:26:02 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Quentin Monnet X-Patchwork-Id: 858254 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="Pt9rvbp7"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zGpJr2MPdz9t1t for ; Wed, 10 Jan 2018 23:31:08 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965682AbeAJMbD (ORCPT ); Wed, 10 Jan 2018 07:31:03 -0500 Received: from mail-wm0-f66.google.com ([74.125.82.66]:40136 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934432AbeAJM1b (ORCPT ); Wed, 10 Jan 2018 07:27:31 -0500 Received: by mail-wm0-f66.google.com with SMTP id f206so26681229wmf.5 for ; Wed, 10 Jan 2018 04:27:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=EWf4q8qLFsZACH0AI5ZhG7yM1TbYLd8HI1pZOhnba8s=; b=Pt9rvbp7ZowQvdwWF6jjxUwmST/H7tXHjhIPEVCe6SjNFxSAOM9T9Ux3nzRK8E0iin edhS/Eyhp+I1BHiqbYa2KYTXmCCkI8ghln61abiFdiPAFnK3EPU3d1BXAnrjmvmnwWOK /6IrM+OvDrlBWK7YkAmomq+h03ON5N1SyA/S7f+P6m4APuMaWYdVnGimG5PW214iDFIm qixTUxKWjSnNMmcONMzdjg+kyvblbhQWhvu1rCOX1hhLdVtqRMMVBZKCFeWMq6yxZxlX whT6g8HUUTKmcVaR+DjI4KWdOctfgN4FChpcVlPG0AiRfBdlfe9hBYsx0gezTkSyXoAr r+yA== 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; bh=EWf4q8qLFsZACH0AI5ZhG7yM1TbYLd8HI1pZOhnba8s=; b=DGjHiQGz0z/nuzj2Ok3WO/v66FzejQIKjcHZv5gjZKHSXMeJ4rwnc1+IzqnszMmMXB onC27Z2Jqv4iwVA5vdbT4ZIdAq2g7ox7zyZDkA1lW+nlwLl3dF9gQfdtfy5vxMzR7rzC vA8jBK1T/QWuRAG3oM0J0nOpz/SV2uzMm/YusjgpS25qf4K1GKFtXXhVtLm1mdQ+CkfV 433BCy3RJQRssmknvGSsw5LIETWND6O2VKHJgu6Rv5sQS818BPZQVqjXaQ6rD6iI7e2Z RqRKH4RKsBzfw3H8EQSzsE9Q5pxQc7SFhyxMYFT9NIgZHlI14ew/XAa9mI6Jk/jo6IcI fTNg== X-Gm-Message-State: AKwxytei+FpS5isr+A4afZuxs4wkzmpHdefCpqMx0/KHQmEppOUEX9n9 iB1pNGUcl7Ej/0/Cq5/kGgu+Og== X-Google-Smtp-Source: ACJfBotAl9x6//UmaS3aNMhVCssIAKepqqreFPgXHmYqlSs2vOystddBCTCO+CbUDKqKfltHN5KDcQ== X-Received: by 10.28.2.68 with SMTP id 65mr4331609wmc.60.1515587250602; Wed, 10 Jan 2018 04:27:30 -0800 (PST) Received: from cbtest8.netronome.com (host-79-78-33-110.static.as9105.net. [79.78.33.110]) by smtp.gmail.com with ESMTPSA id q186sm16907279wmb.6.2018.01.10.04.27.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 10 Jan 2018 04:27:30 -0800 (PST) From: Quentin Monnet To: daniel@iogearbox.net, alexei.starovoitov@gmail.com, netdev@vger.kernel.org Cc: oss-drivers@netronome.com, jakub.kicinski@netronome.com Subject: [PATCH bpf-next v2 09/14] nfp: bpf: don't depend on high order allocations for program image Date: Wed, 10 Jan 2018 12:26:02 +0000 Message-Id: <1515587167-1959-10-git-send-email-quentin.monnet@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> References: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jakub Kicinski The translator pre-allocates a buffer of maximal program size. Due to HW/FW limitations the program buffer can't currently be longer than 128Kb, so we used to kmalloc() it, and then map for DMA directly. Now that the late branch resolution is copying the program image anyway, we can just kvmalloc() the buffer. While at it, after translation reallocate the buffer to save space. Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/netronome/nfp/bpf/jit.c | 16 ++++++++++++++++ drivers/net/ethernet/netronome/nfp/bpf/offload.c | 5 +++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/netronome/nfp/bpf/jit.c b/drivers/net/ethernet/netronome/nfp/bpf/jit.c index 3a5c747fd12b..5deebbc18cfd 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/jit.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/jit.c @@ -2676,6 +2676,20 @@ static int nfp_bpf_ustore_calc(u64 *prog, unsigned int len) return 0; } +static void nfp_bpf_prog_trim(struct nfp_prog *nfp_prog) +{ + void *prog; + + prog = kvmalloc_array(nfp_prog->prog_len, sizeof(u64), GFP_KERNEL); + if (!prog) + return; + + nfp_prog->__prog_alloc_len = nfp_prog->prog_len * sizeof(u64); + memcpy(prog, nfp_prog->prog, nfp_prog->__prog_alloc_len); + kvfree(nfp_prog->prog); + nfp_prog->prog = prog; +} + int nfp_bpf_jit(struct nfp_prog *nfp_prog) { int ret; @@ -2691,6 +2705,8 @@ int nfp_bpf_jit(struct nfp_prog *nfp_prog) return -EINVAL; } + nfp_bpf_prog_trim(nfp_prog); + return ret; } diff --git a/drivers/net/ethernet/netronome/nfp/bpf/offload.c b/drivers/net/ethernet/netronome/nfp/bpf/offload.c index 5f165e1d7648..f63560550753 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/offload.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/offload.c @@ -42,6 +42,7 @@ #include #include #include +#include #include #include @@ -135,7 +136,7 @@ int nfp_bpf_translate(struct nfp_app *app, struct nfp_net *nn, max_instr = nn_readw(nn, NFP_NET_CFG_BPF_MAX_LEN); nfp_prog->__prog_alloc_len = max_instr * sizeof(u64); - nfp_prog->prog = kmalloc(nfp_prog->__prog_alloc_len, GFP_KERNEL); + nfp_prog->prog = kvmalloc(nfp_prog->__prog_alloc_len, GFP_KERNEL); if (!nfp_prog->prog) return -ENOMEM; @@ -147,7 +148,7 @@ int nfp_bpf_destroy(struct nfp_app *app, struct nfp_net *nn, { struct nfp_prog *nfp_prog = prog->aux->offload->dev_priv; - kfree(nfp_prog->prog); + kvfree(nfp_prog->prog); nfp_prog_free(nfp_prog); return 0; From patchwork Wed Jan 10 12:26:03 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Quentin Monnet X-Patchwork-Id: 858253 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="VkL6vJ67"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zGpJq0jjCz9sPk for ; Wed, 10 Jan 2018 23:31:07 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965677AbeAJMbC (ORCPT ); Wed, 10 Jan 2018 07:31:02 -0500 Received: from mail-wm0-f65.google.com ([74.125.82.65]:45562 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934465AbeAJM1d (ORCPT ); Wed, 10 Jan 2018 07:27:33 -0500 Received: by mail-wm0-f65.google.com with SMTP id i186so10182040wmi.4 for ; Wed, 10 Jan 2018 04:27:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=gPtOtaSlNIy+71AfFs3ppwnflKTBk0ZB7IQ2PBLury4=; b=VkL6vJ67/k5wJt30EvXVYcJEcijqZYDSSQkYHituu90gAhRKAeW430iBrtVNVZ0EHP GPXqk+/Bqse4QDmrR/yYSadlN/acrzKdR9gFLJOTOi3KVHNcr4ZVr3B6QWxrOQfxZawp uKbwpUnUzwf7wp2B+YCtOqIH5iR51VTf0xN7vLgGnqojinUcM3JFtXeqtLhZdFVNteNg /D8UluEGlIEBp1xbSi72O6D9PHiYQkuz0PLcoLt06pQrDbDFCt5Yqc++5V55/O2julT2 DSLzM1LjeBSnFChKXUPnqVz5XVCn7XOGx9SoyV67fyd1erj51FurtSTZIetfox/mvZgf WHHQ== 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; bh=gPtOtaSlNIy+71AfFs3ppwnflKTBk0ZB7IQ2PBLury4=; b=b4lLiiWmLN4JXaGzC4yDREBOxR8BlrspnsBUn9tJ0zKLOuK/njVjBdqNfPuHty34Je oMaC6d26J75gW5yhWog4To+Kdy0Ai4WdE7ILMTyNq+DumOzISiwjm7K2SKy5iRQ7TGk2 oeyIoCEMYb1bBUWj2an9mnx3PxTmA0vUFBSrZ6zVqSX7IrHCbGo9SBRCo7fnTB62RlEO VWOtG1UGOmWNUHS6ZGoCPB+jP1BElBqt2g2AoPEhJLJ9xzIaCkE1E9MnLCP2ppj62DUt eUxJECMrL+ea69xMmc5GF+9fvzvYfk5S4U6kg3s7IsIkaMRrLTVKSXh6gS67cGM68b5f e/kA== X-Gm-Message-State: AKGB3mK/4um0XMWVB5DBCKfu2BF/G009fs+VQPRMx1BpeUVKRd25Kb1C LAWkAFosvLishd28Iio7IMLGsA== X-Google-Smtp-Source: ACJfBotnvntVyBadxjYwo7usa8kupI5R4gjigs9VXDoh6+gL0b4Mc+2GgGm8opkNmPpA03m1aVcuPg== X-Received: by 10.28.9.77 with SMTP id 74mr14076179wmj.107.1515587251763; Wed, 10 Jan 2018 04:27:31 -0800 (PST) Received: from cbtest8.netronome.com (host-79-78-33-110.static.as9105.net. [79.78.33.110]) by smtp.gmail.com with ESMTPSA id q186sm16907279wmb.6.2018.01.10.04.27.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 10 Jan 2018 04:27:31 -0800 (PST) From: Quentin Monnet To: daniel@iogearbox.net, alexei.starovoitov@gmail.com, netdev@vger.kernel.org Cc: oss-drivers@netronome.com, jakub.kicinski@netronome.com Subject: [PATCH bpf-next v2 10/14] nfp: bpf: use a large constant in unresolved branches Date: Wed, 10 Jan 2018 12:26:03 +0000 Message-Id: <1515587167-1959-11-git-send-email-quentin.monnet@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> References: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jakub Kicinski To make absolute relocated branches (branches which will be completely rewritten with br_set_offset()) distinguishable in user space dumps from normal jumps add a large offset to them. Signed-off-by: Jakub Kicinski Reviewed-by: Jiong Wang --- drivers/net/ethernet/netronome/nfp/bpf/jit.c | 14 +++++++------- drivers/net/ethernet/netronome/nfp/bpf/main.h | 6 ++++++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/drivers/net/ethernet/netronome/nfp/bpf/jit.c b/drivers/net/ethernet/netronome/nfp/bpf/jit.c index 5deebbc18cfd..b4ed6bca4ea9 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/jit.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/jit.c @@ -739,7 +739,7 @@ construct_data_ind_ld(struct nfp_prog *nfp_prog, u16 offset, u16 src, u8 size) imm_a(nfp_prog), ALU_OP_ADD, reg_imm(size)); emit_alu(nfp_prog, reg_none(), plen_reg(nfp_prog), ALU_OP_SUB, imm_a(nfp_prog)); - emit_br_relo(nfp_prog, BR_BLO, 0, 0, RELO_BR_GO_ABORT); + emit_br_relo(nfp_prog, BR_BLO, BR_OFF_RELO, 0, RELO_BR_GO_ABORT); /* Load data */ return data_ld(nfp_prog, imm_b(nfp_prog), 0, size); @@ -752,7 +752,7 @@ static int construct_data_ld(struct nfp_prog *nfp_prog, u16 offset, u8 size) /* Check packet length */ tmp_reg = ur_load_imm_any(nfp_prog, offset + size, imm_a(nfp_prog)); emit_alu(nfp_prog, reg_none(), plen_reg(nfp_prog), ALU_OP_SUB, tmp_reg); - emit_br_relo(nfp_prog, BR_BLO, 0, 0, RELO_BR_GO_ABORT); + emit_br_relo(nfp_prog, BR_BLO, BR_OFF_RELO, 0, RELO_BR_GO_ABORT); /* Load data */ tmp_reg = re_load_imm_any(nfp_prog, offset, imm_b(nfp_prog)); @@ -2026,7 +2026,7 @@ static int call(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) static int goto_out(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) { - emit_br_relo(nfp_prog, BR_UNC, 0, 0, RELO_BR_GO_OUT); + emit_br_relo(nfp_prog, BR_UNC, BR_OFF_RELO, 0, RELO_BR_GO_OUT); return 0; } @@ -2175,7 +2175,7 @@ static void nfp_outro_tc_da(struct nfp_prog *nfp_prog) /* Target for aborts */ nfp_prog->tgt_abort = nfp_prog_current_offset(nfp_prog); - emit_br_relo(nfp_prog, BR_UNC, 0, 2, RELO_BR_NEXT_PKT); + emit_br_relo(nfp_prog, BR_UNC, BR_OFF_RELO, 2, RELO_BR_NEXT_PKT); wrp_mov(nfp_prog, reg_a(0), NFP_BPF_ABI_FLAGS); emit_ld_field(nfp_prog, reg_a(0), 0xc, reg_imm(0x11), SHF_SC_L_SHF, 16); @@ -2202,7 +2202,7 @@ static void nfp_outro_tc_da(struct nfp_prog *nfp_prog) emit_shf(nfp_prog, reg_b(2), reg_imm(0xf), SHF_OP_AND, reg_b(3), SHF_SC_R_SHF, 0); - emit_br_relo(nfp_prog, BR_UNC, 0, 2, RELO_BR_NEXT_PKT); + emit_br_relo(nfp_prog, BR_UNC, BR_OFF_RELO, 2, RELO_BR_NEXT_PKT); emit_shf(nfp_prog, reg_b(2), reg_a(2), SHF_OP_OR, reg_b(2), SHF_SC_L_SHF, 4); @@ -2221,7 +2221,7 @@ static void nfp_outro_xdp(struct nfp_prog *nfp_prog) /* Target for aborts */ nfp_prog->tgt_abort = nfp_prog_current_offset(nfp_prog); - emit_br_relo(nfp_prog, BR_UNC, 0, 2, RELO_BR_NEXT_PKT); + emit_br_relo(nfp_prog, BR_UNC, BR_OFF_RELO, 2, RELO_BR_NEXT_PKT); wrp_mov(nfp_prog, reg_a(0), NFP_BPF_ABI_FLAGS); emit_ld_field(nfp_prog, reg_a(0), 0xc, reg_imm(0x82), SHF_SC_L_SHF, 16); @@ -2242,7 +2242,7 @@ static void nfp_outro_xdp(struct nfp_prog *nfp_prog) emit_shf(nfp_prog, reg_b(2), reg_imm(0xff), SHF_OP_AND, reg_b(2), SHF_SC_R_SHF, 0); - emit_br_relo(nfp_prog, BR_UNC, 0, 2, RELO_BR_NEXT_PKT); + emit_br_relo(nfp_prog, BR_UNC, BR_OFF_RELO, 2, RELO_BR_NEXT_PKT); wrp_mov(nfp_prog, reg_a(0), NFP_BPF_ABI_FLAGS); emit_ld_field(nfp_prog, reg_a(0), 0xc, reg_b(2), SHF_SC_L_SHF, 16); diff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.h b/drivers/net/ethernet/netronome/nfp/bpf/main.h index 5deba5099618..8d02c39b9b10 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/main.h +++ b/drivers/net/ethernet/netronome/nfp/bpf/main.h @@ -58,6 +58,12 @@ enum nfp_relo_type { RELO_BR_NEXT_PKT, }; +/* To make absolute relocated branches (branches other than RELO_BR_REL) + * distinguishable in user space dumps from normal jumps, add a large offset + * to them. + */ +#define BR_OFF_RELO 15000 + enum static_regs { STATIC_REG_IMM = 21, /* Bank AB */ STATIC_REG_STACK = 22, /* Bank A */ From patchwork Wed Jan 10 12:26:04 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Quentin Monnet X-Patchwork-Id: 858251 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="rkijOv7n"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zGpJY5hsSz9sPk for ; Wed, 10 Jan 2018 23:30:53 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965671AbeAJMau (ORCPT ); Wed, 10 Jan 2018 07:30:50 -0500 Received: from mail-wr0-f196.google.com ([209.85.128.196]:36591 "EHLO mail-wr0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934473AbeAJM1e (ORCPT ); Wed, 10 Jan 2018 07:27:34 -0500 Received: by mail-wr0-f196.google.com with SMTP id d9so1865377wre.3 for ; Wed, 10 Jan 2018 04:27:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=QvZKu23hLbve7EErzTIkI6MNyeofHBTyuwx3qVowVTQ=; b=rkijOv7nm8sVuk6ewD15hf0/cwAKx8jTPvQ6Kp8mmWk82xMF2yY0tqeGKbNXVrL5u4 rzOtEHDOqMsL7ZOL9ELEq87FkafdlcoIzWiWbpaOOE9olRwInZX+6RH/6XJ90vMRKu6h NMzKOm+PuCoDzQAymKvmD6lh1oHTROXUR2Q2fKGgZs5lLJSCwz7aB0xe2gyosRKSMLuB gTnZC1k6B+VoDxgjJ0jqrXF8aQB3ecuVRCmQNu4veu7YNZWQsMvt8fgCOVAzqGGAVCGX dv2YwtQ8j/qNIhemowF/F6cerxCsu7bJVIbHCMxrYViTek/SWfV/CplQPz06JRk6GmNe mHJA== 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; bh=QvZKu23hLbve7EErzTIkI6MNyeofHBTyuwx3qVowVTQ=; b=amkfWD3YhottNh23NAho7eqSWsT6hpAuyBfLdY3oVpAnMVfY5XHctRMhstVobl5J15 EjSzXM8eILq3Zbf5QUTFPUNpy4GW/1AMEO2oY5ltnfQQMDXe2ItR4GcTCzVzsXcJPJa8 pPuSMdKgu3crY2qlPIJXxmTdlBRfSbQU0pl6HjBSmWAALUJh25Z5WHfqee217dAmzg3+ hzyv9I95ByQr5AklJQvcczw/q8VML5tvYee8uSaLnBKofSPF558r8UO4GFyfF4laYQAA tL0UFEOQj1jEke94YtBeib1sArODsYqzDU8S8RjnObkuJ4PjBZNlypKU//jPkRggbCO6 6tlw== X-Gm-Message-State: AKGB3mLGd0ZA0M4Hj5M25blucszqFaX2FO/LoS4Xx4NnkIz/AUAFcahw 9EzdOiSzCu62/f++S/Ot3Mw8zQ== X-Google-Smtp-Source: ACJfBovqRkXuU6RleFVWC7WrYCP3sBbcNcT8hqaIYd5Z6+3OsJZHV2m6IQR296J4BgycET97FI+Hcg== X-Received: by 10.223.165.84 with SMTP id j20mr16412111wrb.278.1515587253076; Wed, 10 Jan 2018 04:27:33 -0800 (PST) Received: from cbtest8.netronome.com (host-79-78-33-110.static.as9105.net. [79.78.33.110]) by smtp.gmail.com with ESMTPSA id q186sm16907279wmb.6.2018.01.10.04.27.31 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 10 Jan 2018 04:27:32 -0800 (PST) From: Quentin Monnet To: daniel@iogearbox.net, alexei.starovoitov@gmail.com, netdev@vger.kernel.org Cc: oss-drivers@netronome.com, jakub.kicinski@netronome.com Subject: [PATCH bpf-next v2 11/14] nfp: hand over to BPF offload app at coarser granularity Date: Wed, 10 Jan 2018 12:26:04 +0000 Message-Id: <1515587167-1959-12-git-send-email-quentin.monnet@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> References: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jakub Kicinski Instead of having an app callback per message type hand off all offload-related handling to apps with one "rest of ndo_bpf" callback. Signed-off-by: Jakub Kicinski Reviewed-by: Quentin Monnet --- drivers/net/ethernet/netronome/nfp/bpf/main.c | 5 +-- drivers/net/ethernet/netronome/nfp/bpf/main.h | 8 +--- drivers/net/ethernet/netronome/nfp/bpf/offload.c | 25 +++++++++--- drivers/net/ethernet/netronome/nfp/nfp_app.h | 47 +++++----------------- .../net/ethernet/netronome/nfp/nfp_net_common.c | 10 +---- 5 files changed, 34 insertions(+), 61 deletions(-) diff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.c b/drivers/net/ethernet/netronome/nfp/bpf/main.c index 9ed76ccdd3c1..e8cfe300c8c4 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/main.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/main.c @@ -345,9 +345,6 @@ const struct nfp_app_type app_bpf = { .setup_tc = nfp_bpf_setup_tc, .tc_busy = nfp_bpf_tc_busy, + .bpf = nfp_ndo_bpf, .xdp_offload = nfp_bpf_xdp_offload, - - .bpf_verifier_prep = nfp_bpf_verifier_prep, - .bpf_translate = nfp_bpf_translate, - .bpf_destroy = nfp_bpf_destroy, }; diff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.h b/drivers/net/ethernet/netronome/nfp/bpf/main.h index 8d02c39b9b10..66381afee2a9 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/main.h +++ b/drivers/net/ethernet/netronome/nfp/bpf/main.h @@ -256,15 +256,11 @@ struct netdev_bpf; struct nfp_app; struct nfp_net; +int nfp_ndo_bpf(struct nfp_app *app, struct nfp_net *nn, + struct netdev_bpf *bpf); int nfp_net_bpf_offload(struct nfp_net *nn, struct bpf_prog *prog, bool old_prog); -int nfp_bpf_verifier_prep(struct nfp_app *app, struct nfp_net *nn, - struct netdev_bpf *bpf); -int nfp_bpf_translate(struct nfp_app *app, struct nfp_net *nn, - struct bpf_prog *prog); -int nfp_bpf_destroy(struct nfp_app *app, struct nfp_net *nn, - struct bpf_prog *prog); struct nfp_insn_meta * nfp_bpf_goto_meta(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta, unsigned int insn_idx, unsigned int n_insns); diff --git a/drivers/net/ethernet/netronome/nfp/bpf/offload.c b/drivers/net/ethernet/netronome/nfp/bpf/offload.c index f63560550753..320b2250d29a 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/offload.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/offload.c @@ -87,8 +87,9 @@ static void nfp_prog_free(struct nfp_prog *nfp_prog) kfree(nfp_prog); } -int nfp_bpf_verifier_prep(struct nfp_app *app, struct nfp_net *nn, - struct netdev_bpf *bpf) +static int +nfp_bpf_verifier_prep(struct nfp_app *app, struct nfp_net *nn, + struct netdev_bpf *bpf) { struct bpf_prog *prog = bpf->verifier.prog; struct nfp_prog *nfp_prog; @@ -118,8 +119,7 @@ int nfp_bpf_verifier_prep(struct nfp_app *app, struct nfp_net *nn, return ret; } -int nfp_bpf_translate(struct nfp_app *app, struct nfp_net *nn, - struct bpf_prog *prog) +static int nfp_bpf_translate(struct nfp_net *nn, struct bpf_prog *prog) { struct nfp_prog *nfp_prog = prog->aux->offload->dev_priv; unsigned int stack_size; @@ -143,8 +143,7 @@ int nfp_bpf_translate(struct nfp_app *app, struct nfp_net *nn, return nfp_bpf_jit(nfp_prog); } -int nfp_bpf_destroy(struct nfp_app *app, struct nfp_net *nn, - struct bpf_prog *prog) +static int nfp_bpf_destroy(struct nfp_net *nn, struct bpf_prog *prog) { struct nfp_prog *nfp_prog = prog->aux->offload->dev_priv; @@ -154,6 +153,20 @@ int nfp_bpf_destroy(struct nfp_app *app, struct nfp_net *nn, return 0; } +int nfp_ndo_bpf(struct nfp_app *app, struct nfp_net *nn, struct netdev_bpf *bpf) +{ + switch (bpf->command) { + case BPF_OFFLOAD_VERIFIER_PREP: + return nfp_bpf_verifier_prep(app, nn, bpf); + case BPF_OFFLOAD_TRANSLATE: + return nfp_bpf_translate(nn, bpf->offload.prog); + case BPF_OFFLOAD_DESTROY: + return nfp_bpf_destroy(nn, bpf->offload.prog); + default: + return -EINVAL; + } +} + static int nfp_net_bpf_load(struct nfp_net *nn, struct bpf_prog *prog) { struct nfp_prog *nfp_prog = prog->aux->offload->dev_priv; diff --git a/drivers/net/ethernet/netronome/nfp/nfp_app.h b/drivers/net/ethernet/netronome/nfp/nfp_app.h index e6b59c28c4ca..32ff46a00f70 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_app.h +++ b/drivers/net/ethernet/netronome/nfp/nfp_app.h @@ -89,10 +89,8 @@ extern const struct nfp_app_type app_flower; * @ctrl_msg_rx: control message handler * @setup_tc: setup TC ndo * @tc_busy: TC HW offload busy (rules loaded) + * @bpf: BPF ndo offload-related calls * @xdp_offload: offload an XDP program - * @bpf_verifier_prep: verifier prep for dev-specific BPF programs - * @bpf_translate: translate call for dev-specific BPF programs - * @bpf_destroy: destroy for dev-specific BPF programs * @eswitch_mode_get: get SR-IOV eswitch mode * @sriov_enable: app-specific sriov initialisation * @sriov_disable: app-specific sriov clean-up @@ -133,14 +131,10 @@ struct nfp_app_type { int (*setup_tc)(struct nfp_app *app, struct net_device *netdev, enum tc_setup_type type, void *type_data); bool (*tc_busy)(struct nfp_app *app, struct nfp_net *nn); + int (*bpf)(struct nfp_app *app, struct nfp_net *nn, + struct netdev_bpf *xdp); int (*xdp_offload)(struct nfp_app *app, struct nfp_net *nn, struct bpf_prog *prog); - int (*bpf_verifier_prep)(struct nfp_app *app, struct nfp_net *nn, - struct netdev_bpf *bpf); - int (*bpf_translate)(struct nfp_app *app, struct nfp_net *nn, - struct bpf_prog *prog); - int (*bpf_destroy)(struct nfp_app *app, struct nfp_net *nn, - struct bpf_prog *prog); int (*sriov_enable)(struct nfp_app *app, int num_vfs); void (*sriov_disable)(struct nfp_app *app); @@ -316,6 +310,14 @@ static inline int nfp_app_setup_tc(struct nfp_app *app, return app->type->setup_tc(app, netdev, type, type_data); } +static inline int nfp_app_bpf(struct nfp_app *app, struct nfp_net *nn, + struct netdev_bpf *bpf) +{ + if (!app || !app->type->bpf) + return -EINVAL; + return app->type->bpf(app, nn, bpf); +} + static inline int nfp_app_xdp_offload(struct nfp_app *app, struct nfp_net *nn, struct bpf_prog *prog) { @@ -324,33 +326,6 @@ static inline int nfp_app_xdp_offload(struct nfp_app *app, struct nfp_net *nn, return app->type->xdp_offload(app, nn, prog); } -static inline int -nfp_app_bpf_verifier_prep(struct nfp_app *app, struct nfp_net *nn, - struct netdev_bpf *bpf) -{ - if (!app || !app->type->bpf_verifier_prep) - return -EOPNOTSUPP; - return app->type->bpf_verifier_prep(app, nn, bpf); -} - -static inline int -nfp_app_bpf_translate(struct nfp_app *app, struct nfp_net *nn, - struct bpf_prog *prog) -{ - if (!app || !app->type->bpf_translate) - return -EOPNOTSUPP; - return app->type->bpf_translate(app, nn, prog); -} - -static inline int -nfp_app_bpf_destroy(struct nfp_app *app, struct nfp_net *nn, - struct bpf_prog *prog) -{ - if (!app || !app->type->bpf_destroy) - return -EOPNOTSUPP; - return app->type->bpf_destroy(app, nn, prog); -} - static inline bool nfp_app_ctrl_tx(struct nfp_app *app, struct sk_buff *skb) { trace_devlink_hwmsg(priv_to_devlink(app->pf), false, 0, diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c index 33cbb9b35e68..caee147fce04 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c @@ -3414,16 +3414,8 @@ static int nfp_net_xdp(struct net_device *netdev, struct netdev_bpf *xdp) xdp->prog_id = nn->xdp_prog ? nn->xdp_prog->aux->id : 0; xdp->prog_flags = nn->xdp_prog ? nn->xdp_flags : 0; return 0; - case BPF_OFFLOAD_VERIFIER_PREP: - return nfp_app_bpf_verifier_prep(nn->app, nn, xdp); - case BPF_OFFLOAD_TRANSLATE: - return nfp_app_bpf_translate(nn->app, nn, - xdp->offload.prog); - case BPF_OFFLOAD_DESTROY: - return nfp_app_bpf_destroy(nn->app, nn, - xdp->offload.prog); default: - return -EINVAL; + return nfp_app_bpf(nn->app, nn, xdp); } } From patchwork Wed Jan 10 12:26:05 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Quentin Monnet X-Patchwork-Id: 858250 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="IZasEM3b"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zGpH96LkYz9s9Y for ; Wed, 10 Jan 2018 23:29:41 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965490AbeAJM3i (ORCPT ); Wed, 10 Jan 2018 07:29:38 -0500 Received: from mail-wm0-f65.google.com ([74.125.82.65]:42282 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934477AbeAJM1f (ORCPT ); Wed, 10 Jan 2018 07:27:35 -0500 Received: by mail-wm0-f65.google.com with SMTP id b141so26635089wme.1 for ; Wed, 10 Jan 2018 04:27:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=YhmtsLn+Uc6ida/Sk3lNjHO39cJrXAsxOblpHDHG2Vc=; b=IZasEM3b0g3KnsfpSvLOqG/mYPtHGHvMBSZ2OGiryHzMfVO/hvM73XRIVvrZPIzD1P re4lQWYml+fIvAFCsbp5j+nVyxfo+aV+Re4vMIJRYbI2O2Dzk1StJcQcOdASS+kAYo7x ShZxd4478JmUAVdsMBHADGXf4Z+XzXcllbTP33prDzWKMc3B+MDzzv9FZYo7hPDP2Hv+ clokn1/qAHdikfL6ze92C8jyQICeQrQ/inQJyhMhv46wONoOOrxhVC0Wh3eDs6QnyVIO 7IlrHIdszanuQAlnFec8/RKWa/ni+zZ7iLLPsoJMRgiUCO4hCDSWgm6zLIRuWN0/efNK 2BoA== 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; bh=YhmtsLn+Uc6ida/Sk3lNjHO39cJrXAsxOblpHDHG2Vc=; b=bmJR3x6KzSAtY/tNDSvfrmX5f98xtLHyBb3yfSU85+CuzOf72J0eCl2A3BtaY+RUZK tgkrwyY0L5BHK5YcN6X+echaB559VUwQZO+fv6U6gLCeK298ID6Q+fCM2NArQUZY0AsY IXf5dGYaX3EA91IFbqwZM7v8ChNmLe7Fd4Djt0JHTNaWnVfc0paMICl6ErEAmfknzXQ2 XCvAgO3YKi3+HGLX0tzMvCVH3qxWJRmS7p3E+tjSlnC9+9ZUZAVCMNZoc1t+cPXSAaMK yr0Z507iNvJn2nM4NQdD6Ze8unNAQHXEnVwu71uiKAPyCUfyutA3uxMlHKFKplTIMbph LwkQ== X-Gm-Message-State: AKwxytchVJv3iD/jEU2noav20bLnqmvbYZgAGr7bRoItf140MIei9HtS 6rixhvxPGBj4M6ZDgrN5P5g5Nw== X-Google-Smtp-Source: ACJfBot4KALdAQy/tecJmFdDck8B1GPiCsOntp2yMqgU+Y383vg7ac2TL0yGDPSC/BVrsI7Y1pbysA== X-Received: by 10.28.238.202 with SMTP id j71mr4820579wmi.34.1515587254179; Wed, 10 Jan 2018 04:27:34 -0800 (PST) Received: from cbtest8.netronome.com (host-79-78-33-110.static.as9105.net. [79.78.33.110]) by smtp.gmail.com with ESMTPSA id q186sm16907279wmb.6.2018.01.10.04.27.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 10 Jan 2018 04:27:33 -0800 (PST) From: Quentin Monnet To: daniel@iogearbox.net, alexei.starovoitov@gmail.com, netdev@vger.kernel.org Cc: oss-drivers@netronome.com, jakub.kicinski@netronome.com, Nic Viljoen Subject: [PATCH bpf-next v2 12/14] nfp: bpf: add signed jump insns Date: Wed, 10 Jan 2018 12:26:05 +0000 Message-Id: <1515587167-1959-13-git-send-email-quentin.monnet@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> References: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Nic Viljoen This patch adds signed jump instructions (jsgt, jsge, jslt, jsle) to the nfp jit. As well as adding the additional required raw assembler branch mask to nfp_asm.h Signed-off-by: Nic Viljoen Reviewed-by: Jiong Wang Reviewed-by: Jakub Kicinski --- drivers/net/ethernet/netronome/nfp/bpf/jit.c | 48 ++++++++++++++++++++++++++++ drivers/net/ethernet/netronome/nfp/nfp_asm.h | 1 + 2 files changed, 49 insertions(+) diff --git a/drivers/net/ethernet/netronome/nfp/bpf/jit.c b/drivers/net/ethernet/netronome/nfp/bpf/jit.c index b4ed6bca4ea9..47c5224f8d6f 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/jit.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/jit.c @@ -1914,6 +1914,26 @@ static int jle_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) return wrp_cmp_imm(nfp_prog, meta, BR_BHS, true); } +static int jsgt_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) +{ + return wrp_cmp_imm(nfp_prog, meta, BR_BLT, true); +} + +static int jsge_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) +{ + return wrp_cmp_imm(nfp_prog, meta, BR_BGE, false); +} + +static int jslt_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) +{ + return wrp_cmp_imm(nfp_prog, meta, BR_BLT, false); +} + +static int jsle_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) +{ + return wrp_cmp_imm(nfp_prog, meta, BR_BGE, true); +} + static int jset_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) { const struct bpf_insn *insn = &meta->insn; @@ -2003,6 +2023,26 @@ static int jle_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) return wrp_cmp_reg(nfp_prog, meta, BR_BHS, true); } +static int jsgt_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) +{ + return wrp_cmp_reg(nfp_prog, meta, BR_BLT, true); +} + +static int jsge_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) +{ + return wrp_cmp_reg(nfp_prog, meta, BR_BGE, false); +} + +static int jslt_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) +{ + return wrp_cmp_reg(nfp_prog, meta, BR_BLT, false); +} + +static int jsle_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) +{ + return wrp_cmp_reg(nfp_prog, meta, BR_BGE, true); +} + static int jset_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) { return wrp_test_reg(nfp_prog, meta, ALU_OP_AND, BR_BNE); @@ -2087,6 +2127,10 @@ static const instr_cb_t instr_cb[256] = { [BPF_JMP | BPF_JGE | BPF_K] = jge_imm, [BPF_JMP | BPF_JLT | BPF_K] = jlt_imm, [BPF_JMP | BPF_JLE | BPF_K] = jle_imm, + [BPF_JMP | BPF_JSGT | BPF_K] = jsgt_imm, + [BPF_JMP | BPF_JSGE | BPF_K] = jsge_imm, + [BPF_JMP | BPF_JSLT | BPF_K] = jslt_imm, + [BPF_JMP | BPF_JSLE | BPF_K] = jsle_imm, [BPF_JMP | BPF_JSET | BPF_K] = jset_imm, [BPF_JMP | BPF_JNE | BPF_K] = jne_imm, [BPF_JMP | BPF_JEQ | BPF_X] = jeq_reg, @@ -2094,6 +2138,10 @@ static const instr_cb_t instr_cb[256] = { [BPF_JMP | BPF_JGE | BPF_X] = jge_reg, [BPF_JMP | BPF_JLT | BPF_X] = jlt_reg, [BPF_JMP | BPF_JLE | BPF_X] = jle_reg, + [BPF_JMP | BPF_JSGT | BPF_X] = jsgt_reg, + [BPF_JMP | BPF_JSGE | BPF_X] = jsge_reg, + [BPF_JMP | BPF_JSLT | BPF_X] = jslt_reg, + [BPF_JMP | BPF_JSLE | BPF_X] = jsle_reg, [BPF_JMP | BPF_JSET | BPF_X] = jset_reg, [BPF_JMP | BPF_JNE | BPF_X] = jne_reg, [BPF_JMP | BPF_CALL] = call, diff --git a/drivers/net/ethernet/netronome/nfp/nfp_asm.h b/drivers/net/ethernet/netronome/nfp/nfp_asm.h index a50240ab0ce2..20e51cb60e69 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_asm.h +++ b/drivers/net/ethernet/netronome/nfp/nfp_asm.h @@ -81,6 +81,7 @@ enum br_mask { BR_BHS = 0x04, BR_BLO = 0x05, BR_BGE = 0x08, + BR_BLT = 0x09, BR_UNC = 0x18, }; From patchwork Wed Jan 10 12:26:06 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Quentin Monnet X-Patchwork-Id: 858249 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="W6inhCVE"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zGpFl6FqBz9t3C for ; Wed, 10 Jan 2018 23:28:27 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965506AbeAJM2Y (ORCPT ); Wed, 10 Jan 2018 07:28:24 -0500 Received: from mail-wm0-f66.google.com ([74.125.82.66]:36900 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934482AbeAJM1g (ORCPT ); Wed, 10 Jan 2018 07:27:36 -0500 Received: by mail-wm0-f66.google.com with SMTP id f140so26671997wmd.2 for ; Wed, 10 Jan 2018 04:27:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=+1R6ZDXQxLdWaLW7QqXV363zFeji+6Cp12PkJNiYtRI=; b=W6inhCVEj6RPAYT2Aa2ESRr/9Q7xrVVNprapMomJO5SmpjDF9DtlUUCo8b8qDfCLwQ E+ovz+muiUdIBI+R5XZRCJcJaa/MuQvzaCPT+SBgDrecPyUFwvqSaX4GymfD+vQTCs8v yMyrXnuVKYPr9F4RASVhbllxUQOtWRZbw7RTP4Qfz/0a4oGFappG/zA0pdFZN10dv7QY SvITct1y07PTjj0sYgH8uDL6IErOu5CJDorfrPzR2NbGjApAycGjIgYUZKfPt7sRSyqn NsezjdJb8hj8uR4RptXt6pFY0sGv3Dcx8h2p5JIkrGR4k++R9QITbvDz3Q2RlRg8AwMD +7xQ== 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; bh=+1R6ZDXQxLdWaLW7QqXV363zFeji+6Cp12PkJNiYtRI=; b=LuoMRm4YfWGcreBLzZgL7UWxvVwX1a60lSvJqBJG0KopKe/vqzrR5D/tcdnQFDr8iQ 7ZIv1Rmda28QFRwHqkjhuG9iOeUncWyIugYB79CSz83h5mnpP9BbqXNp9f/76BfI05v4 gX0jtLuUqjMLlGO+9fy1zMLze0FruUVYmDa2bwUYUGM5q7MBaYrRfUPVF64YBwgJapVl L5Z6Fely6QQXItX8Wx7+bJkH473LOT4DjVgvmeiaRa6uDxBafXNbeNu4Zk8ZsvV2JXaI Frs+lONirzrg3THALP9mmeFjY55WcgVg4Lodcix2PobhesaqgEPld5EJ4MDq1W+roHyz oZDg== X-Gm-Message-State: AKGB3mIx5Njdy77djMdDWkyuWjT8zITF3CKfqUiK0DuwvZyxQM6OCA8t 3nD52yaTNUiIFlg1bMAFqcrQUA== X-Google-Smtp-Source: ACJfBovhfib6EBxud4eoODI6pC6mj2tz/KPxiBXicofWuQT9ThHGVc0BlYk9CDbo+xTzpAwLtI8sqg== X-Received: by 10.28.24.11 with SMTP id 11mr14309688wmy.108.1515587255315; Wed, 10 Jan 2018 04:27:35 -0800 (PST) Received: from cbtest8.netronome.com (host-79-78-33-110.static.as9105.net. [79.78.33.110]) by smtp.gmail.com with ESMTPSA id q186sm16907279wmb.6.2018.01.10.04.27.34 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 10 Jan 2018 04:27:34 -0800 (PST) From: Quentin Monnet To: daniel@iogearbox.net, alexei.starovoitov@gmail.com, netdev@vger.kernel.org Cc: oss-drivers@netronome.com, jakub.kicinski@netronome.com Subject: [PATCH bpf-next v2 13/14] bpf: export function to write into verifier log buffer Date: Wed, 10 Jan 2018 12:26:06 +0000 Message-Id: <1515587167-1959-14-git-send-email-quentin.monnet@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> References: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Rename the BPF verifier `verbose()` to `bpf_verifier_log_write()` and export it, so that other components (in particular, drivers for BPF offload) can reuse the user buffer log to dump error messages at verification time. Renaming `verbose()` was necessary in order to avoid a name so generic to be exported to the global namespace. However to prevent too much pain for backports, the calls to `verbose()` in the kernel BPF verifier were not changed. Instead, use function aliasing to make `verbose` point to `bpf_verifier_log_write`. Another solution could consist in making a wrapper around `verbose()`, but since it is a variadic function, I don't see a clean way without creating two identical wrappers, one for the verifier and one to export. Signed-off-by: Quentin Monnet Reviewed-by: Jakub Kicinski --- v2: Replace #define by function aliasing for verbose (thanks Daniel). --- include/linux/bpf_verifier.h | 3 +++ kernel/bpf/verifier.c | 16 ++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h index 2feb218c001d..6b66cd1aa0b9 100644 --- a/include/linux/bpf_verifier.h +++ b/include/linux/bpf_verifier.h @@ -192,6 +192,9 @@ struct bpf_verifier_env { u32 subprog_cnt; }; +__printf(2, 3) void bpf_verifier_log_write(struct bpf_verifier_env *env, + const char *fmt, ...); + static inline struct bpf_reg_state *cur_regs(struct bpf_verifier_env *env) { struct bpf_verifier_state *cur = env->cur_state; diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index a2b211262c25..3690e292d4ce 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -169,11 +169,11 @@ struct bpf_call_arg_meta { static DEFINE_MUTEX(bpf_verifier_lock); /* log_level controls verbosity level of eBPF verifier. - * verbose() is used to dump the verification trace to the log, so the user - * can figure out what's wrong with the program + * bpf_verifier_log_write() is used to dump the verification trace to the log, + * so the user can figure out what's wrong with the program */ -static __printf(2, 3) void verbose(struct bpf_verifier_env *env, - const char *fmt, ...) +__printf(2, 3) void bpf_verifier_log_write(struct bpf_verifier_env *env, + const char *fmt, ...) { struct bpf_verifer_log *log = &env->log; unsigned int n; @@ -197,6 +197,14 @@ static __printf(2, 3) void verbose(struct bpf_verifier_env *env, else log->ubuf = NULL; } +EXPORT_SYMBOL_GPL(bpf_verifier_log_write); +/* Historically bpf_verifier_log_write was called verbose, but the name was too + * generic for symbol export. The function was renamed, but not the calls in + * the verifier to avoid complicating backports. Hence the alias below. + */ +static __printf(2, 3) void verbose(struct bpf_verifier_env *env, + const char *fmt, ...) + __attribute__((alias("bpf_verifier_log_write"))); static bool type_is_pkt_pointer(enum bpf_reg_type type) { From patchwork Wed Jan 10 12:26:07 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Quentin Monnet X-Patchwork-Id: 858246 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="y24ZdZLG"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zGpDv29BPz9t0m for ; Wed, 10 Jan 2018 23:27:43 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965263AbeAJM1k (ORCPT ); Wed, 10 Jan 2018 07:27:40 -0500 Received: from mail-wr0-f196.google.com ([209.85.128.196]:43779 "EHLO mail-wr0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934488AbeAJM1h (ORCPT ); Wed, 10 Jan 2018 07:27:37 -0500 Received: by mail-wr0-f196.google.com with SMTP id s13so14749855wra.10 for ; Wed, 10 Jan 2018 04:27:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=gChFzq8Q5xge8KB2bt0CQROpm0q0Ffc4c4X4Ea5Y3ko=; b=y24ZdZLGIGiug6Bk07yHhTasW3zXUiQ+UZwuofRgY02WfV0cDqUT2Mo9k8p+hOuzTk 1GGy8uebJzyy8Q5xd8ayFove6aO/jdtKZ4x1ce1WMtjqqKjabcRIEdyf7wzJXlSdTKtO V6q3X8BhRRRVw2cW6qoCi908i6hqTHW2qjpwUcF8GndTmx+ZtMulDcXP4hxGPfrBLniR k19D8+02pyj1yhYHHTZo+blUoDye8tz3tNq2yZzzv3/W2mP1BLRQWQDAYbZRVpymhpKN 5RLaZeM8Jw0eweN0m28dxCctyqRiB7/7aoKGE58sQvOOkOddHTXN5SeBWNnVLVg4Hr3h MRNg== 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; bh=gChFzq8Q5xge8KB2bt0CQROpm0q0Ffc4c4X4Ea5Y3ko=; b=e97jBTHFRCC+cWCn3JLbghGf7f+zhOD3sY8dxddNH8+GQgqFhlxy/3mWn/P/OH8dWC wcimQq36Xixe5NkhzA77swXBlrQdObxfk3DHJR/rFv6amg30QasBa8ECmhrLOTXnhlka wCwlfl5+ORJixMYocYGWyGVjVLm2eggAPUSGPhZYwUX8dvW1lR2HSQxzPzQ9rwsaQAe2 2X9v26Fm3fandCAXQDG92ACNpjtbQbOKGF4Xm/K/wolCU4tAkjc8qqfW8+ihCwmuI8qn oYQSnOgHtowH0CMz8byfBvKZdgqZ8s398+lTx66yW9VhONRhEXfxyH3GlPV6Dw4femhR c+vQ== X-Gm-Message-State: AKGB3mIjcqTvKTLBnyFQBkjdDvTYKAtp8sE8kG1RZdltzl57Wb56piuY KyxbkWv0iLnzL9iDggoZ51mR8w== X-Google-Smtp-Source: ACJfBovrFGQI8sgwsGy5ggxpc3Ri3vfN7ox6pJI3iYGsuSo01CZ+va6yD2J/IhEJmZeCLzjyiqq/eA== X-Received: by 10.223.184.175 with SMTP id i44mr7031318wrf.253.1515587256395; Wed, 10 Jan 2018 04:27:36 -0800 (PST) Received: from cbtest8.netronome.com (host-79-78-33-110.static.as9105.net. [79.78.33.110]) by smtp.gmail.com with ESMTPSA id q186sm16907279wmb.6.2018.01.10.04.27.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 10 Jan 2018 04:27:35 -0800 (PST) From: Quentin Monnet To: daniel@iogearbox.net, alexei.starovoitov@gmail.com, netdev@vger.kernel.org Cc: oss-drivers@netronome.com, jakub.kicinski@netronome.com Subject: [PATCH bpf-next v2 14/14] nfp: bpf: reuse verifier log for debug messages Date: Wed, 10 Jan 2018 12:26:07 +0000 Message-Id: <1515587167-1959-15-git-send-email-quentin.monnet@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> References: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Now that `bpf_verifier_log_write()` is exported from the verifier and makes it possible to reuse the verifier log to print messages to the standard output, use this instead of the kernel logs in the nfp driver for printing error messages occurring at verification time. Signed-off-by: Quentin Monnet Reviewed-by: Jakub Kicinski --- drivers/net/ethernet/netronome/nfp/bpf/verifier.c | 30 ++++++++++++----------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/drivers/net/ethernet/netronome/nfp/bpf/verifier.c b/drivers/net/ethernet/netronome/nfp/bpf/verifier.c index d8870c2f11f3..7890d95d4018 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/verifier.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/verifier.c @@ -31,8 +31,6 @@ * SOFTWARE. */ -#define pr_fmt(fmt) "NFP net bpf: " fmt - #include #include #include @@ -41,6 +39,9 @@ #include "fw.h" #include "main.h" +#define pr_vlog(env, fmt, ...) \ + bpf_verifier_log_write(env, "[nfp] " fmt, ##__VA_ARGS__) + struct nfp_insn_meta * nfp_bpf_goto_meta(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta, unsigned int insn_idx, unsigned int n_insns) @@ -116,18 +117,18 @@ nfp_bpf_check_call(struct nfp_prog *nfp_prog, struct bpf_verifier_env *env, switch (func_id) { case BPF_FUNC_xdp_adjust_head: if (!bpf->adjust_head.off_max) { - pr_warn("adjust_head not supported by FW\n"); + pr_vlog(env, "adjust_head not supported by FW\n"); return -EOPNOTSUPP; } if (!(bpf->adjust_head.flags & NFP_BPF_ADJUST_HEAD_NO_META)) { - pr_warn("adjust_head: FW requires shifting metadata, not supported by the driver\n"); + pr_vlog(env, "adjust_head: FW requires shifting metadata, not supported by the driver\n"); return -EOPNOTSUPP; } nfp_record_adjust_head(bpf, nfp_prog, meta, reg2); break; default: - pr_warn("unsupported function id: %d\n", func_id); + pr_vlog(env, "unsupported function id: %d\n", func_id); return -EOPNOTSUPP; } @@ -150,7 +151,7 @@ nfp_bpf_check_exit(struct nfp_prog *nfp_prog, char tn_buf[48]; tnum_strn(tn_buf, sizeof(tn_buf), reg0->var_off); - pr_info("unsupported exit state: %d, var_off: %s\n", + pr_vlog(env, "unsupported exit state: %d, var_off: %s\n", reg0->type, tn_buf); return -EINVAL; } @@ -160,7 +161,7 @@ nfp_bpf_check_exit(struct nfp_prog *nfp_prog, imm <= TC_ACT_REDIRECT && imm != TC_ACT_SHOT && imm != TC_ACT_STOLEN && imm != TC_ACT_QUEUED) { - pr_info("unsupported exit state: %d, imm: %llx\n", + pr_vlog(env, "unsupported exit state: %d, imm: %llx\n", reg0->type, imm); return -EINVAL; } @@ -171,12 +172,13 @@ nfp_bpf_check_exit(struct nfp_prog *nfp_prog, static int nfp_bpf_check_stack_access(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta, - const struct bpf_reg_state *reg) + const struct bpf_reg_state *reg, + struct bpf_verifier_env *env) { s32 old_off, new_off; if (!tnum_is_const(reg->var_off)) { - pr_info("variable ptr stack access\n"); + pr_vlog(env, "variable ptr stack access\n"); return -EINVAL; } @@ -194,7 +196,7 @@ nfp_bpf_check_stack_access(struct nfp_prog *nfp_prog, if (old_off % 4 == new_off % 4) return 0; - pr_info("stack access changed location was:%d is:%d\n", + pr_vlog(env, "stack access changed location was:%d is:%d\n", old_off, new_off); return -EINVAL; } @@ -209,18 +211,18 @@ nfp_bpf_check_ptr(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta, if (reg->type != PTR_TO_CTX && reg->type != PTR_TO_STACK && reg->type != PTR_TO_PACKET) { - pr_info("unsupported ptr type: %d\n", reg->type); + pr_vlog(env, "unsupported ptr type: %d\n", reg->type); return -EINVAL; } if (reg->type == PTR_TO_STACK) { - err = nfp_bpf_check_stack_access(nfp_prog, meta, reg); + err = nfp_bpf_check_stack_access(nfp_prog, meta, reg, env); if (err) return err; } if (meta->ptr.type != NOT_INIT && meta->ptr.type != reg->type) { - pr_info("ptr type changed for instruction %d -> %d\n", + pr_vlog(env, "ptr type changed for instruction %d -> %d\n", meta->ptr.type, reg->type); return -EINVAL; } @@ -241,7 +243,7 @@ nfp_verify_insn(struct bpf_verifier_env *env, int insn_idx, int prev_insn_idx) if (meta->insn.src_reg >= MAX_BPF_REG || meta->insn.dst_reg >= MAX_BPF_REG) { - pr_err("program uses extended registers - jit hardening?\n"); + pr_vlog(env, "program uses extended registers - jit hardening?\n"); return -EINVAL; }