From patchwork Sat May 26 04:53:25 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 920885 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=none (p=none dis=none) header.from=netronome.com 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="uA2nHORG"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40t9mg6myNz9s16 for ; Sat, 26 May 2018 14:55:47 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932673AbeEZEz2 (ORCPT ); Sat, 26 May 2018 00:55:28 -0400 Received: from mail-qk0-f195.google.com ([209.85.220.195]:39513 "EHLO mail-qk0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932181AbeEZEz0 (ORCPT ); Sat, 26 May 2018 00:55:26 -0400 Received: by mail-qk0-f195.google.com with SMTP id z75-v6so5648061qkb.6 for ; Fri, 25 May 2018 21:55:26 -0700 (PDT) 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=LuCN8vO7KT/M/gz0ZKvt1LIs8kkfsdRdsCTCwkru1Nc=; b=uA2nHORGwQjwdK0L5wO9KbGh8BhEYtiQ3VEbcQpvGIgtPynSgTuLqroSY4gv1PQCbs svZq7mj3Dl4QcTZS6avgH+ztDJ5YXtaDNSpSZHdA1DC5UG5ZeUsn2LN1k+Qbtz+y4p+P ah0E5MCC/FrCxyYJCrf8vD3VBl/Df6jEJu32w00ZTetW9KAJwHXol0If6uGH1R/tG4OV T2QHc1yzBC07vbjjCQzX8rljF0jH0sQoBHr7bxIu2rYY4c3eYg891Y18QOM05T1aJ4/b 6mGDtYXnoI/GKDTw27Eco4XwziW3ctZC7YGY5YM2we7zWhwt6DvDyOehVUYO7ApLMqJ1 LxuA== 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=LuCN8vO7KT/M/gz0ZKvt1LIs8kkfsdRdsCTCwkru1Nc=; b=GNuZL1+RlFCQSGhGSF4groQkVVF0ufdqZm+LZK5t55nS/TvWx3oVDbIU3scwo3ONsB wilR51UEslmQsETu8VR5ReDKsdTCDJKEaK7f402Yfmle0vFS2ufOqci+nIMvqqbWlu8B VXEGbnBuXnUFQxtavMc37Z1xU1IN8vvY+XrW6SZP3QRTYwGN/vIetkGh6ZnYqhhHYNWe oU7I6LFAcZesHkBKU+KNeZnCxNxmtUmPY/sVmfOfYkzmNOGo6LZwtT4hlSRa1IIz5bou vNsmgyKpSxPrPHCZoCRgJ4C59ENJmerUtjIFXgaGi2CTJMh1IAlFt87Ef+r7HYTxmcdu q2ZQ== X-Gm-Message-State: ALKqPwfFs8XNexR7O7fgxGIHJPV8AW2WL3Aq1T+HJ9sAgpnrLS+2IdSy EYtVugkNQOHIWiNSV8fOsYgiNg== X-Google-Smtp-Source: ADUXVKJgHQ8SZz+xEbGOn85tx14MWvyf4VdAqTuHgfT8x2Tkq6cN/YctMES5nA0sWEsDaYAQqSBvLA== X-Received: by 2002:a37:5d84:: with SMTP id r126-v6mr4479227qkb.352.1527310525609; Fri, 25 May 2018 21:55:25 -0700 (PDT) Received: from jkicinski-Precision-T1700.netronome.com ([75.53.12.129]) by smtp.gmail.com with ESMTPSA id g16-v6sm17463754qtp.9.2018.05.25.21.55.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 25 May 2018 21:55:25 -0700 (PDT) From: Jakub Kicinski To: davem@davemloft.net Cc: jiri@resnulli.us, xiyou.wangcong@gmail.com, john.fastabend@gmail.com, netdev@vger.kernel.org, oss-drivers@netronome.com, alexei.starovoitov@gmail.com, nogahf@mellanox.com, yuvalm@mellanox.com, gerlitz.or@gmail.com, Jakub Kicinski Subject: [PATCH net-next 01/14] nfp: return -EOPNOTSUPP from .ndo_get_phys_port_name for VFs Date: Fri, 25 May 2018 21:53:25 -0700 Message-Id: <20180526045338.10993-2-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180526045338.10993-1-jakub.kicinski@netronome.com> References: <20180526045338.10993-1-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org After recent change we started returning 0 from ndo_get_phys_port_name for VFs. The name parameter for ndo_get_phys_port_name is not initialized by the stack so this can lead to a crash. We should have kept returning -EOPNOTSUPP in the first place. Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/netronome/nfp/nfp_net_common.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c index eea11e881bf5..1f572896d1ee 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c @@ -3286,11 +3286,12 @@ nfp_net_get_phys_port_name(struct net_device *netdev, char *name, size_t len) if (nn->port) return nfp_port_get_phys_port_name(netdev, name, len); - if (!nn->dp.is_vf) { - n = snprintf(name, len, "%d", nn->id); - if (n >= len) - return -EINVAL; - } + if (nn->dp.is_vf) + return -EOPNOTSUPP; + + n = snprintf(name, len, "%d", nn->id); + if (n >= len) + return -EINVAL; return 0; } From patchwork Sat May 26 04:53:26 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 920897 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=none (p=none dis=none) header.from=netronome.com 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="mITaN4eL"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40t9nS5sjWz9s16 for ; Sat, 26 May 2018 14:56:28 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1031196AbeEZE41 (ORCPT ); Sat, 26 May 2018 00:56:27 -0400 Received: from mail-qk0-f193.google.com ([209.85.220.193]:44298 "EHLO mail-qk0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751699AbeEZEz2 (ORCPT ); Sat, 26 May 2018 00:55:28 -0400 Received: by mail-qk0-f193.google.com with SMTP id 185-v6so5647046qkk.11 for ; Fri, 25 May 2018 21:55:27 -0700 (PDT) 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=vw4pkCXaX2PXrN0X4azL7zfMlRY+N7ZFDgNl5eSEIu4=; b=mITaN4eLy/a3MpsZ6uu7tLX2/hbggvUyvfMKbKfm+cF5vbb+7ijBGyVbIRHCheJznS Odky5mNS6RGsboNWJaTLu5StsGphk1F5KdSymxY9VbHaDL3DFLGniQ6B/pqt1o3JvKCz 7sevvLFZ29WcAQxPOEM2T1MYZaPmrZYtX88pe0wZKcJzUawZb/7YgKdcWp30hYcyWWnl veiE1W82eC6WBy3OkIGVCc0o/O6HjltPGeWVHulLya5QbRm9elNHP7spA+AYZSG8DIWG DSrm5QYA7Co4D9tCWvWA2V6g+P/fkQf1nrDALIALWOuGs3awuUtuMVwBAdql8UvGF2X4 CM/w== 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=vw4pkCXaX2PXrN0X4azL7zfMlRY+N7ZFDgNl5eSEIu4=; b=DnNtC3F9OGG8aA/gzVn5cXDwW2R3xPsFDN5u5FSZ62OuiHRaxJ+X5ozBoX62L6nK4C wFni6SyGBBnWnawiHYC7kMEnwOW6NvkFaUFpoaYQQGRuDwH6e5AJKa4abk5XUbz0Qdon qiM0btfneH9+l1FdExsulGFRckqCZV3KZ9XBGrMolrISctcYKWkCqGVLjG1Gbkr/O110 X2nNjSEN8AhFZmBe3dWcfUpIFQetL1QNNn7njadBauffyWudgsvQ28eQ7/qhfity3iVQ rNUeWIwSpQ9ADkxS49nxUfrL401Z5oX0xsVI9h4jmTQD1dNZv15lgNGRaB56daRHSlio sG0w== X-Gm-Message-State: ALKqPwcuHaWnGLUIRktZacktnHWCH06fwhcPlEX0MkKhoZfifnj2fKk5 n0QSTaTtcTFXQJ94vsBqXgSU8g== X-Google-Smtp-Source: ADUXVKJWOETuxPOT1TLrLs1QZtQbNQeravx6Ys9j3RffBoqDXsQ4xtfOG6m4l9ZPT1yjLzJ3Ort8Cw== X-Received: by 2002:a37:c4:: with SMTP id t65-v6mr4396512qkg.402.1527310527254; Fri, 25 May 2018 21:55:27 -0700 (PDT) Received: from jkicinski-Precision-T1700.netronome.com ([75.53.12.129]) by smtp.gmail.com with ESMTPSA id g16-v6sm17463754qtp.9.2018.05.25.21.55.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 25 May 2018 21:55:26 -0700 (PDT) From: Jakub Kicinski To: davem@davemloft.net Cc: jiri@resnulli.us, xiyou.wangcong@gmail.com, john.fastabend@gmail.com, netdev@vger.kernel.org, oss-drivers@netronome.com, alexei.starovoitov@gmail.com, nogahf@mellanox.com, yuvalm@mellanox.com, gerlitz.or@gmail.com, Jakub Kicinski Subject: [PATCH net-next 02/14] nfp: prefix vNIC phys_port_name with 'n' Date: Fri, 25 May 2018 21:53:26 -0700 Message-Id: <20180526045338.10993-3-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180526045338.10993-1-jakub.kicinski@netronome.com> References: <20180526045338.10993-1-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Some drivers are using a bare number inside phys_port_name as VF id and OpenStack's regexps will pick it up. We can't use a bare number for your vNICs, prefix the names with 'n'. Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/netronome/nfp/nfp_net_common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c index 1f572896d1ee..75110c8d6a90 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c @@ -3289,7 +3289,7 @@ nfp_net_get_phys_port_name(struct net_device *netdev, char *name, size_t len) if (nn->dp.is_vf) return -EOPNOTSUPP; - n = snprintf(name, len, "%d", nn->id); + n = snprintf(name, len, "n%d", nn->id); if (n >= len) return -EINVAL; From patchwork Sat May 26 04:53:27 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 920886 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=none (p=none dis=none) header.from=netronome.com 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="y9Zg05vw"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40t9mh5Rbdz9s0y for ; Sat, 26 May 2018 14:55:48 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932934AbeEZEzc (ORCPT ); Sat, 26 May 2018 00:55:32 -0400 Received: from mail-qk0-f194.google.com ([209.85.220.194]:44300 "EHLO mail-qk0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932181AbeEZEz3 (ORCPT ); Sat, 26 May 2018 00:55:29 -0400 Received: by mail-qk0-f194.google.com with SMTP id 185-v6so5647058qkk.11 for ; Fri, 25 May 2018 21:55:29 -0700 (PDT) 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=ZrTBQ7hv0W/gZMkbAoj472xif/rBQ7qbQUV+mx0aDOY=; b=y9Zg05vwT9MNAcol9Gfn6ZurgtqVVoPcZih3/AIzg8VrpwC7dK1T+m56YNbOAnpHHY AIKu/tmS/S1dav7IlyfqYirVsxOTJlSVv2gq9wdoVNcif0qhISE/IOkh1c0Q07jtrI6g Pl2I5KNwWNSCw8BwRKcJBHrsPN3dyBtXyQ8phXeQntYcrUX8bMc/NO8yCpQJufzr1mMf 47hRcIvSYazv0cbl0F+R5N3T8neaHTX4p0uIrX7aOgHO9+/AhNYfHi/CO4DwXZtWaQQC 6AEC7SMmC07m5huIDGv3QCPEc1GtkkvV0pzr3qpkrDZCnTRPqvWlm8G1NnkNdiaSoj2K 3M9A== 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=ZrTBQ7hv0W/gZMkbAoj472xif/rBQ7qbQUV+mx0aDOY=; b=BVhkezwSfHHiuwS2RRbzwCdmtZy3ddmT6nTIyO2Iug2kewTd/oFyFKxycCFBzQTaGr ksv1EXE98ifuFqlGFWSAXlliyP6tUTc675pV8+W5FxAndw7LnwwyMSQfTiKr7nJuGsmk J7yHh4yERn6DmoRV8cZQ5hMNo06HDZQue3AObjjIC7RCIyTvZuQk5MM99F/g2f/18WjN 7UvaA86P9G6skT+1DAfJ5fhJRXHQFnBpvXil7JIIizR7QMZhK0tbXyOMtPBKcSj5XMFm 7PwY4sja74XgA8n3OfZNYW82VPrdYinuK498pgJEvWstcxPMHMlA1o8ReunDraCyB0fu zuvA== X-Gm-Message-State: ALKqPwfX5mWWxgestU+6xbDkLwxzhzSksKAQvUNCElvfPwkdARW9FcFj HLlnBo/KfmjS4NrB0qPOVbvytg== X-Google-Smtp-Source: ADUXVKJUDQ8pJshVHa0FD/71ijRv3Gzi1BdZjjomNUoNEwq4agrNvAgf9YfjVYw5LTRZMZPwX215aw== X-Received: by 2002:a37:4a8d:: with SMTP id x135-v6mr4592849qka.100.1527310528884; Fri, 25 May 2018 21:55:28 -0700 (PDT) Received: from jkicinski-Precision-T1700.netronome.com ([75.53.12.129]) by smtp.gmail.com with ESMTPSA id g16-v6sm17463754qtp.9.2018.05.25.21.55.27 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 25 May 2018 21:55:28 -0700 (PDT) From: Jakub Kicinski To: davem@davemloft.net Cc: jiri@resnulli.us, xiyou.wangcong@gmail.com, john.fastabend@gmail.com, netdev@vger.kernel.org, oss-drivers@netronome.com, alexei.starovoitov@gmail.com, nogahf@mellanox.com, yuvalm@mellanox.com, gerlitz.or@gmail.com, Jakub Kicinski Subject: [PATCH net-next 03/14] nfp: abm: enable advanced queuing on demand Date: Fri, 25 May 2018 21:53:27 -0700 Message-Id: <20180526045338.10993-4-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180526045338.10993-1-jakub.kicinski@netronome.com> References: <20180526045338.10993-1-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org ABM NIC FW has a cut-through mode where the PCIe queuing is bypassed, thus working like our standard NIC FWs. Use this mode by default and only enable queuing in switchdev mode where users can configure it. Signed-off-by: Jakub Kicinski Reviewed-by: Dirk van der Merwe --- drivers/net/ethernet/netronome/nfp/abm/ctrl.c | 13 +++++++++++++ drivers/net/ethernet/netronome/nfp/abm/main.c | 11 +++++++++++ drivers/net/ethernet/netronome/nfp/abm/main.h | 2 ++ drivers/net/ethernet/netronome/nfp/nfp_abi.h | 14 ++++++++++++++ 4 files changed, 40 insertions(+) diff --git a/drivers/net/ethernet/netronome/nfp/abm/ctrl.c b/drivers/net/ethernet/netronome/nfp/abm/ctrl.c index e40f6f06417b..676d3afc9bdd 100644 --- a/drivers/net/ethernet/netronome/nfp/abm/ctrl.c +++ b/drivers/net/ethernet/netronome/nfp/abm/ctrl.c @@ -36,10 +36,23 @@ #include "../nfpcore/nfp_cpp.h" #include "../nfp_app.h" +#include "../nfp_abi.h" #include "../nfp_main.h" #include "../nfp_net.h" #include "main.h" +int nfp_abm_ctrl_qm_enable(struct nfp_abm *abm) +{ + return nfp_mbox_cmd(abm->app->pf, NFP_MBOX_PCIE_ABM_ENABLE, + NULL, 0, NULL, 0); +} + +int nfp_abm_ctrl_qm_disable(struct nfp_abm *abm) +{ + return nfp_mbox_cmd(abm->app->pf, NFP_MBOX_PCIE_ABM_DISABLE, + NULL, 0, NULL, 0); +} + void nfp_abm_ctrl_read_params(struct nfp_abm_link *alink) { alink->queue_base = nn_readl(alink->vnic, NFP_NET_CFG_START_RXQ); diff --git a/drivers/net/ethernet/netronome/nfp/abm/main.c b/drivers/net/ethernet/netronome/nfp/abm/main.c index 5a12bb20bced..28a18ac62040 100644 --- a/drivers/net/ethernet/netronome/nfp/abm/main.c +++ b/drivers/net/ethernet/netronome/nfp/abm/main.c @@ -182,6 +182,7 @@ static enum devlink_eswitch_mode nfp_abm_eswitch_mode_get(struct nfp_app *app) static int nfp_abm_eswitch_set_legacy(struct nfp_abm *abm) { nfp_abm_kill_reprs_all(abm); + nfp_abm_ctrl_qm_disable(abm); abm->eswitch_mode = DEVLINK_ESWITCH_MODE_LEGACY; return 0; @@ -200,6 +201,10 @@ static int nfp_abm_eswitch_set_switchdev(struct nfp_abm *abm) struct nfp_net *nn; int err; + err = nfp_abm_ctrl_qm_enable(abm); + if (err) + return err; + list_for_each_entry(nn, &pf->vnics, vnic_list) { struct nfp_abm_link *alink = nn->app_priv; @@ -217,6 +222,7 @@ static int nfp_abm_eswitch_set_switchdev(struct nfp_abm *abm) err_kill_all_reprs: nfp_abm_kill_reprs_all(abm); + nfp_abm_ctrl_qm_disable(abm); return err; } @@ -350,6 +356,11 @@ static int nfp_abm_init(struct nfp_app *app) if (err) goto err_free_abm; + /* We start in legacy mode, make sure advanced queuing is disabled */ + err = nfp_abm_ctrl_qm_disable(abm); + if (err) + goto err_free_abm; + err = -ENOMEM; reprs = nfp_reprs_alloc(pf->max_data_vnics); if (!reprs) diff --git a/drivers/net/ethernet/netronome/nfp/abm/main.h b/drivers/net/ethernet/netronome/nfp/abm/main.h index 5938b69b8a84..7d129b205535 100644 --- a/drivers/net/ethernet/netronome/nfp/abm/main.h +++ b/drivers/net/ethernet/netronome/nfp/abm/main.h @@ -72,4 +72,6 @@ struct nfp_abm_link { void nfp_abm_ctrl_read_params(struct nfp_abm_link *alink); int nfp_abm_ctrl_find_addrs(struct nfp_abm *abm); +int nfp_abm_ctrl_qm_enable(struct nfp_abm *abm); +int nfp_abm_ctrl_qm_disable(struct nfp_abm *abm); #endif diff --git a/drivers/net/ethernet/netronome/nfp/nfp_abi.h b/drivers/net/ethernet/netronome/nfp/nfp_abi.h index 7ffa6e6a9d1c..8b56c27931bf 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_abi.h +++ b/drivers/net/ethernet/netronome/nfp/nfp_abi.h @@ -59,12 +59,26 @@ * @NFP_MBOX_POOL_SET: set shared buffer pool info/config * Input - struct nfp_shared_buf_pool_info_set * Output - None + * + * @NFP_MBOX_PCIE_ABM_ENABLE: enable PCIe-side advanced buffer management + * Enable advanced buffer management of the PCIe block. If ABM is disabled + * PCIe block maintains a very short queue of buffers and does tail drop. + * ABM allows more advanced buffering and priority control. + * Input - None + * Output - None + * + * @NFP_MBOX_PCIE_ABM_DISABLE: disable PCIe-side advanced buffer management + * Input - None + * Output - None */ enum nfp_mbox_cmd { NFP_MBOX_NO_CMD = 0x00, NFP_MBOX_POOL_GET = 0x01, NFP_MBOX_POOL_SET = 0x02, + + NFP_MBOX_PCIE_ABM_ENABLE = 0x03, + NFP_MBOX_PCIE_ABM_DISABLE = 0x04, }; #define NFP_SHARED_BUF_COUNT_SYM_NAME "_abi_nfd_pf%u_sb_cnt" From patchwork Sat May 26 04:53:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 920899 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=none (p=none dis=none) header.from=netronome.com 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="lJe+Jo+6"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40t9nX4QMgz9s16 for ; Sat, 26 May 2018 14:56:32 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1031188AbeEZE40 (ORCPT ); Sat, 26 May 2018 00:56:26 -0400 Received: from mail-qk0-f196.google.com ([209.85.220.196]:40269 "EHLO mail-qk0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932773AbeEZEzb (ORCPT ); Sat, 26 May 2018 00:55:31 -0400 Received: by mail-qk0-f196.google.com with SMTP id r66-v6so5656545qkr.7 for ; Fri, 25 May 2018 21:55:30 -0700 (PDT) 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=revJbp5zv8BM5Olk4SCcpYTTdnbim+5WtN0ifNjf/Ys=; b=lJe+Jo+6qAUNcih/AT1UvXZQs/8riebYgROSC4rqPc89UYVQM1Hb24ofZYCQ+9Pnjd AJggNWuUuG/1KSrwR+hB/0rHhv5/mVSMdiHvVAOU+zjbla+kiJL5O4GLK8cW3Op1KYIA OlkTHobE1jIS2iZUlfxJ7H5JHBpcHInObM8pbUKf9seP7VGoJUGnu/04vf09wk9oSFCc 6elGQoXW7qmqv/dJFU3a7kkgaGUHgqY9YStUjvqmmBWDqqUMKvmj+yTa70rI9/fjGIr5 UgqxM4cn6dTNt6n8fJkWGySTayZTX5EGHSAOljHLYp2YYYmQnM0NhdO6tdBO/P7tPpnW UFZA== 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=revJbp5zv8BM5Olk4SCcpYTTdnbim+5WtN0ifNjf/Ys=; b=QAabYJM7cQ3vO1b6VLdKA8fSccUCW9Xo5uWym6OVThRRIWtut6Gz43aV7dUiEKwn/v /8tCaPm6fI/ypNac8Y1TEXlCAR4WjV4awxx5Y4cxdJ9lIKFWN1ocgYHyH4fOzMOfZqBz IgozYM9RuAIXoeHYNQEE7wpjmV4b7NUbNkcRlTNjRY8AqedWFB4wdKr8q3xoOgqVQ8/U 0i6Ii/G0K0IYVM2xnTeBWRXmVPQGeQdG2l3lFetMh/dw6JUew3X8AqQXAHFd5j/yyL/b clN3wGOi9lZBKcrAQjOUWlf5BocGaewUnyfwBDarj/sGPj7TTGRwlaXAwiCKZv7yMKxI CYow== X-Gm-Message-State: ALKqPwcfbDuBbFiqGo5YDFhiPzSM6hDh9sy1mQmazzn6MTLcm9sg1kws XKTYCsFxuuuO9AeNTcm//AqppA== X-Google-Smtp-Source: ADUXVKLDSfgVqYRvG3ZAt5GlbMHsQonyJV48mxb6KHd9mSCeXQepwEpKX8NC6MkU4hI7zY/0wn9bng== X-Received: by 2002:a37:1bc9:: with SMTP id m70-v6mr4449976qkh.152.1527310530450; Fri, 25 May 2018 21:55:30 -0700 (PDT) Received: from jkicinski-Precision-T1700.netronome.com ([75.53.12.129]) by smtp.gmail.com with ESMTPSA id g16-v6sm17463754qtp.9.2018.05.25.21.55.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 25 May 2018 21:55:30 -0700 (PDT) From: Jakub Kicinski To: davem@davemloft.net Cc: jiri@resnulli.us, xiyou.wangcong@gmail.com, john.fastabend@gmail.com, netdev@vger.kernel.org, oss-drivers@netronome.com, alexei.starovoitov@gmail.com, nogahf@mellanox.com, yuvalm@mellanox.com, gerlitz.or@gmail.com, Jakub Kicinski Subject: [PATCH net-next 04/14] nfp: abm: add helpers for configuring queue marking levels Date: Fri, 25 May 2018 21:53:28 -0700 Message-Id: <20180526045338.10993-5-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180526045338.10993-1-jakub.kicinski@netronome.com> References: <20180526045338.10993-1-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Queue levels for simple ECN marking are stored in _abi_nfd_out_q_lvls_X symbol, where X is the PCIe PF id. Find out the location of that symbol and add helpers for modifying it. Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/netronome/nfp/abm/ctrl.c | 80 +++++++++++++++++++ drivers/net/ethernet/netronome/nfp/abm/main.h | 3 + .../ethernet/netronome/nfp/nfpcore/nfp_cpp.h | 5 ++ 3 files changed, 88 insertions(+) diff --git a/drivers/net/ethernet/netronome/nfp/abm/ctrl.c b/drivers/net/ethernet/netronome/nfp/abm/ctrl.c index 676d3afc9bdd..978884a0be19 100644 --- a/drivers/net/ethernet/netronome/nfp/abm/ctrl.c +++ b/drivers/net/ethernet/netronome/nfp/abm/ctrl.c @@ -35,12 +35,57 @@ #include #include "../nfpcore/nfp_cpp.h" +#include "../nfpcore/nfp_nffw.h" #include "../nfp_app.h" #include "../nfp_abi.h" #include "../nfp_main.h" #include "../nfp_net.h" #include "main.h" +#define NFP_QLVL_SYM_NAME "_abi_nfd_out_q_lvls_%u" +#define NFP_QLVL_STRIDE 16 +#define NFP_QLVL_THRS 8 + +static unsigned long long +nfp_abm_q_lvl_thrs(struct nfp_abm_link *alink, unsigned int queue) +{ + return alink->abm->q_lvls->addr + + (alink->queue_base + queue) * NFP_QLVL_STRIDE + NFP_QLVL_THRS; +} + +static int +nfp_abm_ctrl_set_q_lvl(struct nfp_abm_link *alink, unsigned int i, u32 val) +{ + struct nfp_cpp *cpp = alink->abm->app->cpp; + u32 muw; + int err; + + muw = NFP_CPP_ATOMIC_WR(alink->abm->q_lvls->target, + alink->abm->q_lvls->domain); + + err = nfp_cpp_writel(cpp, muw, nfp_abm_q_lvl_thrs(alink, i), val); + if (err) { + nfp_err(cpp, "RED offload setting level failed on vNIC %d queue %d\n", + alink->id, i); + return err; + } + + return 0; +} + +int nfp_abm_ctrl_set_all_q_lvls(struct nfp_abm_link *alink, u32 val) +{ + int i, err; + + for (i = 0; i < alink->vnic->max_rx_rings; i++) { + err = nfp_abm_ctrl_set_q_lvl(alink, i, val); + if (err) + return err; + } + + return 0; +} + int nfp_abm_ctrl_qm_enable(struct nfp_abm *abm) { return nfp_mbox_cmd(abm->app->pf, NFP_MBOX_PCIE_ABM_ENABLE, @@ -59,13 +104,48 @@ void nfp_abm_ctrl_read_params(struct nfp_abm_link *alink) alink->queue_base /= alink->vnic->stride_rx; } +static const struct nfp_rtsym * +nfp_abm_ctrl_find_rtsym(struct nfp_pf *pf, const char *name, unsigned int size) +{ + const struct nfp_rtsym *sym; + + sym = nfp_rtsym_lookup(pf->rtbl, name); + if (!sym) { + nfp_err(pf->cpp, "Symbol '%s' not found\n", name); + return ERR_PTR(-ENOENT); + } + if (sym->size != size) { + nfp_err(pf->cpp, + "Symbol '%s' wrong size: expected %u got %llu\n", + name, size, sym->size); + return ERR_PTR(-EINVAL); + } + + return sym; +} + +static const struct nfp_rtsym * +nfp_abm_ctrl_find_q_rtsym(struct nfp_pf *pf, const char *name, + unsigned int size) +{ + return nfp_abm_ctrl_find_rtsym(pf, name, size * NFP_NET_MAX_RX_RINGS); +} + int nfp_abm_ctrl_find_addrs(struct nfp_abm *abm) { struct nfp_pf *pf = abm->app->pf; + const struct nfp_rtsym *sym; unsigned int pf_id; + char pf_symbol[64]; pf_id = nfp_cppcore_pcie_unit(pf->cpp); abm->pf_id = pf_id; + snprintf(pf_symbol, sizeof(pf_symbol), NFP_QLVL_SYM_NAME, pf_id); + sym = nfp_abm_ctrl_find_q_rtsym(pf, pf_symbol, NFP_QLVL_STRIDE); + if (IS_ERR(sym)) + return PTR_ERR(sym); + abm->q_lvls = sym; + return 0; } diff --git a/drivers/net/ethernet/netronome/nfp/abm/main.h b/drivers/net/ethernet/netronome/nfp/abm/main.h index 7d129b205535..1ac651cdc140 100644 --- a/drivers/net/ethernet/netronome/nfp/abm/main.h +++ b/drivers/net/ethernet/netronome/nfp/abm/main.h @@ -49,11 +49,13 @@ struct nfp_net; * @pf_id: ID of our PF link * @eswitch_mode: devlink eswitch mode, advanced functions only visible * in switchdev mode + * @q_lvls: queue level control area */ struct nfp_abm { struct nfp_app *app; unsigned int pf_id; enum devlink_eswitch_mode eswitch_mode; + const struct nfp_rtsym *q_lvls; }; /** @@ -72,6 +74,7 @@ struct nfp_abm_link { void nfp_abm_ctrl_read_params(struct nfp_abm_link *alink); int nfp_abm_ctrl_find_addrs(struct nfp_abm *abm); +int nfp_abm_ctrl_set_all_q_lvls(struct nfp_abm_link *alink, u32 val); int nfp_abm_ctrl_qm_enable(struct nfp_abm *abm); int nfp_abm_ctrl_qm_disable(struct nfp_abm *abm); #endif diff --git a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cpp.h b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cpp.h index 4e19add1c539..b0da3d436850 100644 --- a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cpp.h +++ b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cpp.h @@ -87,6 +87,11 @@ struct resource; #define NFP_CPP_TARGET_ID_MASK 0x1f +#define NFP_CPP_ATOMIC_RD(target, island) \ + NFP_CPP_ISLAND_ID((target), 3, 0, (island)) +#define NFP_CPP_ATOMIC_WR(target, island) \ + NFP_CPP_ISLAND_ID((target), 4, 0, (island)) + /** * NFP_CPP_ID() - pack target, token, and action into a CPP ID. * @target: NFP CPP target id From patchwork Sat May 26 04:53:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 920887 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=none (p=none dis=none) header.from=netronome.com 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="GxWkCzx+"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40t9mj3DPmz9s16 for ; Sat, 26 May 2018 14:55:49 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1031083AbeEZEzf (ORCPT ); Sat, 26 May 2018 00:55:35 -0400 Received: from mail-qk0-f181.google.com ([209.85.220.181]:39255 "EHLO mail-qk0-f181.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932943AbeEZEzc (ORCPT ); Sat, 26 May 2018 00:55:32 -0400 Received: by mail-qk0-f181.google.com with SMTP id z75-v6so5648159qkb.6 for ; Fri, 25 May 2018 21:55:32 -0700 (PDT) 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=MnQSXtnjTMP1dsyJ3fSSz8FksZpaA2vpmxt1oniOstw=; b=GxWkCzx+4c2TDXN2jZZSUhjAhTQoVzoo6Us6LbzztQFx9P/TyCP6U0Yfqup8DOvw1t n2g1ySnrXhqkBGziIm1O3HYfkH0TN+TmMM5Eu3tv8SHbDjJbSmIbOuscqclOHd8Sxg/g P4tibw9wtAGMawdN4sBnYzpmRsSH29DtZ/z8mRC3q2sI325nO4SFXDWj5TVpuuBKvilQ lG6Ln6ZGWjK/jKSLtTy/W8kixek/8Xu9h1gcHC81ZStaf/rv/hem+2/Otwn7s/Gwi5zf A52M0G7es6YrkioR/Zm4QCNXkTP4J27RogY9LHqVSVk5GDGALEbT369nLei5M1S58BDe 52+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=MnQSXtnjTMP1dsyJ3fSSz8FksZpaA2vpmxt1oniOstw=; b=Rcv+H0qQYNr4f0eBT3gGOdNCwLBrWhxwmkkTn06Jaz/z7ot4e8Qw5ovFqpHwtk3Lf4 7N5FVWByU7toRRs1xpRW2Dy3XhBPtNuul7GMMIA9qnghk8+vK5rCr0Qeh7bdMwbmeCas tI0kFs0cIB0IsCv2rR6N5/j8sDxBNSVow25g5aVT3DWEURdckrYY3xwF3Mt5Ilfk/Xur UxbypQNrv0Q/Pnp25LD2tzPp1F+YMf8mT8BSwfaMT/taY/2Cs7bIUN14SFlR5x01DgGt 8/fWHih/ihbHHJdhaVp8WVxScwbxglKUtBZ534+XHVhcCGn8NpgzhbmpjHROzIMXfnFk FbBg== X-Gm-Message-State: ALKqPwe9QaW4Tk2AZ3u9Q/cNMbedtDaKIrw7I/5X5HmyCMECp36Qb0xU hj2zB7FmX3pPSHrxuwICuIMRsw== X-Google-Smtp-Source: ADUXVKJPRyTC/gDVHmdYV/jsL+McM02Bh31DpazQx4cFiibZ7g8gxQTW0SPn1U4JY/XGA42+R/VNjA== X-Received: by 2002:a37:b0c:: with SMTP id 12-v6mr4631408qkl.412.1527310532063; Fri, 25 May 2018 21:55:32 -0700 (PDT) Received: from jkicinski-Precision-T1700.netronome.com ([75.53.12.129]) by smtp.gmail.com with ESMTPSA id g16-v6sm17463754qtp.9.2018.05.25.21.55.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 25 May 2018 21:55:31 -0700 (PDT) From: Jakub Kicinski To: davem@davemloft.net Cc: jiri@resnulli.us, xiyou.wangcong@gmail.com, john.fastabend@gmail.com, netdev@vger.kernel.org, oss-drivers@netronome.com, alexei.starovoitov@gmail.com, nogahf@mellanox.com, yuvalm@mellanox.com, gerlitz.or@gmail.com, Jakub Kicinski Subject: [PATCH net-next 05/14] nfp: abm: add simple RED offload Date: Fri, 25 May 2018 21:53:29 -0700 Message-Id: <20180526045338.10993-6-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180526045338.10993-1-jakub.kicinski@netronome.com> References: <20180526045338.10993-1-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Offload simple RED configurations. For now support only DCTCP like scenarios where min and max are the same. Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/netronome/nfp/abm/main.c | 82 +++++++++++++++++++ drivers/net/ethernet/netronome/nfp/abm/main.h | 10 +++ 2 files changed, 92 insertions(+) diff --git a/drivers/net/ethernet/netronome/nfp/abm/main.c b/drivers/net/ethernet/netronome/nfp/abm/main.c index 28a18ac62040..22251d88c958 100644 --- a/drivers/net/ethernet/netronome/nfp/abm/main.c +++ b/drivers/net/ethernet/netronome/nfp/abm/main.c @@ -38,6 +38,8 @@ #include #include #include +#include +#include #include "../nfpcore/nfp.h" #include "../nfpcore/nfp_cpp.h" @@ -55,6 +57,84 @@ static u32 nfp_abm_portid(enum nfp_repr_type rtype, unsigned int id) FIELD_PREP(NFP_ABM_PORTID_ID, id); } +static void +nfp_abm_red_destroy(struct net_device *netdev, struct nfp_abm_link *alink, + u32 handle) +{ + struct nfp_port *port = nfp_port_from_netdev(netdev); + + if (handle != alink->qdiscs[0].handle) + return; + + alink->qdiscs[0].handle = TC_H_UNSPEC; + port->tc_offload_cnt = 0; + nfp_abm_ctrl_set_all_q_lvls(alink, ~0); +} + +static int +nfp_abm_red_replace(struct net_device *netdev, struct nfp_abm_link *alink, + struct tc_red_qopt_offload *opt) +{ + struct nfp_port *port = nfp_port_from_netdev(netdev); + int err; + + if (opt->set.min != opt->set.max || !opt->set.is_ecn) { + nfp_warn(alink->abm->app->cpp, + "RED offload failed - unsupported parameters\n"); + err = -EINVAL; + goto err_destroy; + } + err = nfp_abm_ctrl_set_all_q_lvls(alink, opt->set.min); + if (err) + goto err_destroy; + + alink->qdiscs[0].handle = opt->handle; + port->tc_offload_cnt = 1; + + return 0; +err_destroy: + if (alink->qdiscs[0].handle != TC_H_UNSPEC) + nfp_abm_red_destroy(netdev, alink, alink->qdiscs[0].handle); + return err; +} + +static int +nfp_abm_setup_tc_red(struct net_device *netdev, struct nfp_abm_link *alink, + struct tc_red_qopt_offload *opt) +{ + if (opt->parent != TC_H_ROOT) + return -EOPNOTSUPP; + + switch (opt->command) { + case TC_RED_REPLACE: + return nfp_abm_red_replace(netdev, alink, opt); + case TC_RED_DESTROY: + nfp_abm_red_destroy(netdev, alink, opt->handle); + return 0; + default: + return -EOPNOTSUPP; + } +} + +static int +nfp_abm_setup_tc(struct nfp_app *app, struct net_device *netdev, + enum tc_setup_type type, void *type_data) +{ + struct nfp_repr *repr = netdev_priv(netdev); + struct nfp_port *port; + + port = nfp_port_from_netdev(netdev); + if (!port || port->type != NFP_PORT_PF_PORT) + return -EOPNOTSUPP; + + switch (type) { + case TC_SETUP_QDISC_RED: + return nfp_abm_setup_tc_red(netdev, repr->app_priv, type_data); + default: + return -EOPNOTSUPP; + } +} + static struct net_device *nfp_abm_repr_get(struct nfp_app *app, u32 port_id) { enum nfp_repr_type rtype; @@ -403,6 +483,8 @@ const struct nfp_app_type app_abm = { .vnic_alloc = nfp_abm_vnic_alloc, .vnic_free = nfp_abm_vnic_free, + .setup_tc = nfp_abm_setup_tc, + .eswitch_mode_get = nfp_abm_eswitch_mode_get, .eswitch_mode_set = nfp_abm_eswitch_mode_set, diff --git a/drivers/net/ethernet/netronome/nfp/abm/main.h b/drivers/net/ethernet/netronome/nfp/abm/main.h index 1ac651cdc140..979f98fb808b 100644 --- a/drivers/net/ethernet/netronome/nfp/abm/main.h +++ b/drivers/net/ethernet/netronome/nfp/abm/main.h @@ -58,18 +58,28 @@ struct nfp_abm { const struct nfp_rtsym *q_lvls; }; +/** + * struct nfp_red_qdisc - representation of single RED Qdisc + * @handle: handle of currently offloaded RED Qdisc + */ +struct nfp_red_qdisc { + u32 handle; +}; + /** * struct nfp_abm_link - port tuple of a ABM NIC * @abm: back pointer to nfp_abm * @vnic: data vNIC * @id: id of the data vNIC * @queue_base: id of base to host queue within PCIe (not QC idx) + * @qdiscs: array of qdiscs */ struct nfp_abm_link { struct nfp_abm *abm; struct nfp_net *vnic; unsigned int id; unsigned int queue_base; + struct nfp_red_qdisc qdiscs[1]; }; void nfp_abm_ctrl_read_params(struct nfp_abm_link *alink); From patchwork Sat May 26 04:53:30 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 920895 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=none (p=none dis=none) header.from=netronome.com 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="oHXmfAuf"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40t9nH0ZPDz9s0y for ; Sat, 26 May 2018 14:56:19 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1031180AbeEZE4Q (ORCPT ); Sat, 26 May 2018 00:56:16 -0400 Received: from mail-qk0-f195.google.com ([209.85.220.195]:38307 "EHLO mail-qk0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932181AbeEZEze (ORCPT ); Sat, 26 May 2018 00:55:34 -0400 Received: by mail-qk0-f195.google.com with SMTP id c23-v6so5650249qkb.5 for ; Fri, 25 May 2018 21:55:34 -0700 (PDT) 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=apc4RctwNhS7qveHgq9i+nRpElvOeW3B6GO6BSsoApI=; b=oHXmfAuf9da3TpHtagpDPt5RSUv82qM54weNG68ijgUTinoajViP+CrXxQpW/L8+MG i5NNUWhUJROnQvyGOWj2vss9lB3E5AHPTegDLPZuQ2G/u6g9Ys77swIKBzJT+2gWAeV5 wFc1OWlqZX+0aYPsqAH6YazMxHtQvuEqDiMpaogCbTL+ERPC9s0QerqvNtC45a7s3rbK hk1JPBRA91akbSYnPD6QIcH1+kORozcrVkmLCTfFS7sHIhV00dSBh25p9dZSi8wj73Es xIcbRZM3rjxxdBw/CwksZFRyySfTHCtBkkTWZ6avupA9v2ATVEVfNFsvKLybn/WMjiAF yQ/g== 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=apc4RctwNhS7qveHgq9i+nRpElvOeW3B6GO6BSsoApI=; b=pU+OrlcwacurcAnHJZhfZchaX9CEE069NyQ0/sNe4C1WSuVCYou3cMdqZG7EgAoqeU 2IDhryH36nZySZAywrJf8wcnPWPFTkaabGyijad31Ll1IHl9/cX7Kc9dL8eRMYqBlac7 Q5+uUiVV4eikhoQskj4QhB8LlX1CV0ylpvKTvblxwboxj4H9f7+qhLabn42SmiiYYvj4 GxOFJsK8JSZrLZ7N5sKEmzzjzEWO4zOPRqhmZ48bxVLxWZHr+7w4ruM8ZtkeKASv2jS1 kkKV6p34X4IJ1jl6Xyk8iM20A9fiYgxAdlaXTBeXt6O4gZSAhQPL55Z6FgZ9A4R7c52I WhHg== X-Gm-Message-State: ALKqPwfDCw/Wwr7hBbBOOlS4JcZmRDuZHMTmmTZN4qJHOw5k/qg5uE9u 7SAJO384iVFzo25v9g3RIfBO3A== X-Google-Smtp-Source: ADUXVKLPIvifM8zGqVDj3heGPu2Rq2ZtQqPJSDVUWPzVwrO5vB1hB6qwZvSOlP4o7VQY27E4kT3wEQ== X-Received: by 2002:a37:668c:: with SMTP id a134-v6mr4042269qkc.7.1527310533627; Fri, 25 May 2018 21:55:33 -0700 (PDT) Received: from jkicinski-Precision-T1700.netronome.com ([75.53.12.129]) by smtp.gmail.com with ESMTPSA id g16-v6sm17463754qtp.9.2018.05.25.21.55.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 25 May 2018 21:55:33 -0700 (PDT) From: Jakub Kicinski To: davem@davemloft.net Cc: jiri@resnulli.us, xiyou.wangcong@gmail.com, john.fastabend@gmail.com, netdev@vger.kernel.org, oss-drivers@netronome.com, alexei.starovoitov@gmail.com, nogahf@mellanox.com, yuvalm@mellanox.com, gerlitz.or@gmail.com, Jakub Kicinski Subject: [PATCH net-next 06/14] net: sched: add qstats.qlen to qlen Date: Fri, 25 May 2018 21:53:30 -0700 Message-Id: <20180526045338.10993-7-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180526045338.10993-1-jakub.kicinski@netronome.com> References: <20180526045338.10993-1-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org AFAICT struct gnet_stats_queue.qlen is not used in Qdiscs. It may, however, be useful for offloads to report HW queue length there. Add that value to the result of qdisc_qlen_sum(). Signed-off-by: Jakub Kicinski --- include/net/sch_generic.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index 98c10a28cd01..0b786c8204b9 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h @@ -350,14 +350,14 @@ static inline int qdisc_qlen(const struct Qdisc *q) static inline int qdisc_qlen_sum(const struct Qdisc *q) { - __u32 qlen = 0; + __u32 qlen = q->qstats.qlen; int i; if (q->flags & TCQ_F_NOLOCK) { for_each_possible_cpu(i) qlen += per_cpu_ptr(q->cpu_qstats, i)->qlen; } else { - qlen = q->q.qlen; + qlen += q->q.qlen; } return qlen; From patchwork Sat May 26 04:53:31 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 920888 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=none (p=none dis=none) header.from=netronome.com 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="CgzcZu6R"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40t9mk15Nhz9s0y for ; Sat, 26 May 2018 14:55:50 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1031108AbeEZEzj (ORCPT ); Sat, 26 May 2018 00:55:39 -0400 Received: from mail-qk0-f178.google.com ([209.85.220.178]:46121 "EHLO mail-qk0-f178.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1031087AbeEZEzg (ORCPT ); Sat, 26 May 2018 00:55:36 -0400 Received: by mail-qk0-f178.google.com with SMTP id k86-v6so5644181qkh.13 for ; Fri, 25 May 2018 21:55:35 -0700 (PDT) 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=Ma5leCR21+EN8gIkhFGeKcnwibdW9DhoBheVbZvFpCU=; b=CgzcZu6ROdnI88Jjs1Imw63U+LSRn98viCdJvfSxM/58ce5kpBmyjGJTxqnpp2do52 NUH8z2cVKDbfrZbE+AOQJejIzQGsxu5asD//k5JrACV4Q1wmiI59cOq4cMmO3KGXqKI6 Lye+ez2Jy2LNRhKUYj6BD2SpN2keizrdIuiBESupXVR6QvDvcMwtDnhqf7GLFgitS0l9 o7KxhigtBe49oZff8Sj/Xt0MuzRTpRGEmGTMvejuwSUUe1HMqBGmImgZmHcHp+VT8tVI JLWHL5Jn4br0+SHU84tNygKbOOr5mD9CHgfUfx4G9ry+UXwpee6i7wvA7cfe4VBu/4Oq Yfbg== 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=Ma5leCR21+EN8gIkhFGeKcnwibdW9DhoBheVbZvFpCU=; b=Ym7cEhJDwR6BvT+J30UuTP6jKAYqpQNL43VfJeIQuxgkIkaW/ZKkyrBnUzX4803dz+ IV78E633ebokTF+O2Nt2BelYEdIj2v9hjdcuoh1oHW26tJtavcCgl3NrEOu+ClE5UCE1 lVd5h0NnOAq9wOs4UWb0S8zyyyIr6ZnQJXydecihDSj9ELdN+TxGUDXGtZWYX6w74s8P f76iS8UoeWqnx+OjzsTfhVEZpoBccohhpprmoq2oGNm7E5nicQ6zHlSsA78OlMc/KhZO JVMmo5VLh6/142dBhVCzHgyXsitFD5cLkHCrO485nn0eZ+KERNDY0nt1YxD+yf8rDucz NlCQ== X-Gm-Message-State: ALKqPweDOjYXlFwuJDVWe3wcn4sAK6UAACPnXKm0kKvAKt18iVWyufWD DoO3L6+hJdqdM2dcsg4/L4W1/Q== X-Google-Smtp-Source: ADUXVKI+Su95ei2C2A06K1m1xYg21LI7ATEjG+0QDEDoWiZrqrAcy1UG5g3qL821j5nCRcNTZpwY5A== X-Received: by 2002:a37:9bd4:: with SMTP id d203-v6mr25940qke.122.1527310535275; Fri, 25 May 2018 21:55:35 -0700 (PDT) Received: from jkicinski-Precision-T1700.netronome.com ([75.53.12.129]) by smtp.gmail.com with ESMTPSA id g16-v6sm17463754qtp.9.2018.05.25.21.55.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 25 May 2018 21:55:34 -0700 (PDT) From: Jakub Kicinski To: davem@davemloft.net Cc: jiri@resnulli.us, xiyou.wangcong@gmail.com, john.fastabend@gmail.com, netdev@vger.kernel.org, oss-drivers@netronome.com, alexei.starovoitov@gmail.com, nogahf@mellanox.com, yuvalm@mellanox.com, gerlitz.or@gmail.com, Jakub Kicinski Subject: [PATCH net-next 07/14] nfp: abm: report statistics from RED offload Date: Fri, 25 May 2018 21:53:31 -0700 Message-Id: <20180526045338.10993-8-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180526045338.10993-1-jakub.kicinski@netronome.com> References: <20180526045338.10993-1-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Report basic and extended RED statistics back to TC. Signed-off-by: Jakub Kicinski Reviewed-by: Dirk van der Merwe --- drivers/net/ethernet/netronome/nfp/abm/ctrl.c | 114 ++++++++++++++++++ drivers/net/ethernet/netronome/nfp/abm/main.c | 92 ++++++++++++++ drivers/net/ethernet/netronome/nfp/abm/main.h | 38 ++++++ 3 files changed, 244 insertions(+) diff --git a/drivers/net/ethernet/netronome/nfp/abm/ctrl.c b/drivers/net/ethernet/netronome/nfp/abm/ctrl.c index 978884a0be19..d2d9ca7a727c 100644 --- a/drivers/net/ethernet/netronome/nfp/abm/ctrl.c +++ b/drivers/net/ethernet/netronome/nfp/abm/ctrl.c @@ -44,8 +44,15 @@ #define NFP_QLVL_SYM_NAME "_abi_nfd_out_q_lvls_%u" #define NFP_QLVL_STRIDE 16 +#define NFP_QLVL_BLOG_BYTES 0 +#define NFP_QLVL_BLOG_PKTS 4 #define NFP_QLVL_THRS 8 +#define NFP_QMSTAT_SYM_NAME "_abi_nfdqm%u_stats" +#define NFP_QMSTAT_STRIDE 32 +#define NFP_QMSTAT_DROP 16 +#define NFP_QMSTAT_ECN 24 + static unsigned long long nfp_abm_q_lvl_thrs(struct nfp_abm_link *alink, unsigned int queue) { @@ -53,6 +60,55 @@ nfp_abm_q_lvl_thrs(struct nfp_abm_link *alink, unsigned int queue) (alink->queue_base + queue) * NFP_QLVL_STRIDE + NFP_QLVL_THRS; } +static int +nfp_abm_ctrl_stat(struct nfp_abm_link *alink, const struct nfp_rtsym *sym, + unsigned int stride, unsigned int offset, unsigned int i, + bool is_u64, u64 *res) +{ + struct nfp_cpp *cpp = alink->abm->app->cpp; + u32 val32, mur; + u64 val, addr; + int err; + + mur = NFP_CPP_ATOMIC_RD(sym->target, sym->domain); + + addr = sym->addr + (alink->queue_base + i) * stride + offset; + if (is_u64) + err = nfp_cpp_readq(cpp, mur, addr, &val); + else + err = nfp_cpp_readl(cpp, mur, addr, &val32); + if (err) { + nfp_err(cpp, + "RED offload reading stat failed on vNIC %d queue %d\n", + alink->id, i); + return err; + } + + *res = is_u64 ? val : val32; + return 0; +} + +static int +nfp_abm_ctrl_stat_all(struct nfp_abm_link *alink, const struct nfp_rtsym *sym, + unsigned int stride, unsigned int offset, bool is_u64, + u64 *res) +{ + u64 val, sum = 0; + unsigned int i; + int err; + + for (i = 0; i < alink->vnic->max_rx_rings; i++) { + err = nfp_abm_ctrl_stat(alink, sym, stride, offset, i, + is_u64, &val); + if (err) + return err; + sum += val; + } + + *res = sum; + return 0; +} + static int nfp_abm_ctrl_set_q_lvl(struct nfp_abm_link *alink, unsigned int i, u32 val) { @@ -86,6 +142,58 @@ int nfp_abm_ctrl_set_all_q_lvls(struct nfp_abm_link *alink, u32 val) return 0; } +int nfp_abm_ctrl_read_stats(struct nfp_abm_link *alink, + struct nfp_alink_stats *stats) +{ + u64 pkts = 0, bytes = 0; + int i, err; + + for (i = 0; i < alink->vnic->max_rx_rings; i++) { + pkts += nn_readq(alink->vnic, NFP_NET_CFG_RXR_STATS(i)); + bytes += nn_readq(alink->vnic, NFP_NET_CFG_RXR_STATS(i) + 8); + } + stats->tx_pkts = pkts; + stats->tx_bytes = bytes; + + err = nfp_abm_ctrl_stat_all(alink, alink->abm->q_lvls, + NFP_QLVL_STRIDE, NFP_QLVL_BLOG_BYTES, + false, &stats->backlog_bytes); + if (err) + return err; + + err = nfp_abm_ctrl_stat_all(alink, alink->abm->q_lvls, + NFP_QLVL_STRIDE, NFP_QLVL_BLOG_PKTS, + false, &stats->backlog_pkts); + if (err) + return err; + + err = nfp_abm_ctrl_stat_all(alink, alink->abm->qm_stats, + NFP_QMSTAT_STRIDE, NFP_QMSTAT_DROP, + true, &stats->drops); + if (err) + return err; + + return nfp_abm_ctrl_stat_all(alink, alink->abm->qm_stats, + NFP_QMSTAT_STRIDE, NFP_QMSTAT_ECN, + true, &stats->overlimits); +} + +int nfp_abm_ctrl_read_xstats(struct nfp_abm_link *alink, + struct nfp_alink_xstats *xstats) +{ + int err; + + err = nfp_abm_ctrl_stat_all(alink, alink->abm->qm_stats, + NFP_QMSTAT_STRIDE, NFP_QMSTAT_DROP, + true, &xstats->pdrop); + if (err) + return err; + + return nfp_abm_ctrl_stat_all(alink, alink->abm->qm_stats, + NFP_QMSTAT_STRIDE, NFP_QMSTAT_ECN, + true, &xstats->ecn_marked); +} + int nfp_abm_ctrl_qm_enable(struct nfp_abm *abm) { return nfp_mbox_cmd(abm->app->pf, NFP_MBOX_PCIE_ABM_ENABLE, @@ -147,5 +255,11 @@ int nfp_abm_ctrl_find_addrs(struct nfp_abm *abm) return PTR_ERR(sym); abm->q_lvls = sym; + snprintf(pf_symbol, sizeof(pf_symbol), NFP_QMSTAT_SYM_NAME, pf_id); + sym = nfp_abm_ctrl_find_q_rtsym(pf, pf_symbol, NFP_QMSTAT_STRIDE); + if (IS_ERR(sym)) + return PTR_ERR(sym); + abm->qm_stats = sym; + return 0; } diff --git a/drivers/net/ethernet/netronome/nfp/abm/main.c b/drivers/net/ethernet/netronome/nfp/abm/main.c index 22251d88c958..d0c21899a8b7 100644 --- a/drivers/net/ethernet/netronome/nfp/abm/main.c +++ b/drivers/net/ethernet/netronome/nfp/abm/main.c @@ -40,6 +40,7 @@ #include #include #include +#include #include "../nfpcore/nfp.h" #include "../nfpcore/nfp_cpp.h" @@ -57,6 +58,23 @@ static u32 nfp_abm_portid(enum nfp_repr_type rtype, unsigned int id) FIELD_PREP(NFP_ABM_PORTID_ID, id); } +static int nfp_abm_reset_stats(struct nfp_abm_link *alink) +{ + int err; + + err = nfp_abm_ctrl_read_stats(alink, &alink->qdiscs[0].stats); + if (err) + return err; + alink->qdiscs[0].stats.backlog_pkts = 0; + alink->qdiscs[0].stats.backlog_bytes = 0; + + err = nfp_abm_ctrl_read_xstats(alink, &alink->qdiscs[0].xstats); + if (err) + return err; + + return 0; +} + static void nfp_abm_red_destroy(struct net_device *netdev, struct nfp_abm_link *alink, u32 handle) @@ -88,16 +106,86 @@ nfp_abm_red_replace(struct net_device *netdev, struct nfp_abm_link *alink, if (err) goto err_destroy; + /* Reset stats only on new qdisc */ + if (alink->qdiscs[0].handle != opt->handle) { + err = nfp_abm_reset_stats(alink); + if (err) + goto err_destroy; + } + alink->qdiscs[0].handle = opt->handle; port->tc_offload_cnt = 1; return 0; err_destroy: + /* If the qdisc keeps on living, but we can't offload undo changes */ + if (alink->qdiscs[0].handle == opt->handle) { + opt->set.qstats->qlen -= alink->qdiscs[0].stats.backlog_pkts; + opt->set.qstats->backlog -= + alink->qdiscs[0].stats.backlog_bytes; + } if (alink->qdiscs[0].handle != TC_H_UNSPEC) nfp_abm_red_destroy(netdev, alink, alink->qdiscs[0].handle); return err; } +static void +nfp_abm_update_stats(struct nfp_alink_stats *new, struct nfp_alink_stats *old, + struct tc_qopt_offload_stats *stats) +{ + _bstats_update(stats->bstats, new->tx_bytes - old->tx_bytes, + new->tx_pkts - old->tx_pkts); + stats->qstats->qlen += new->backlog_pkts - old->backlog_pkts; + stats->qstats->backlog += new->backlog_bytes - old->backlog_bytes; + stats->qstats->overlimits += new->overlimits - old->overlimits; + stats->qstats->drops += new->drops - old->drops; +} + +static int +nfp_abm_red_stats(struct nfp_abm_link *alink, struct tc_red_qopt_offload *opt) +{ + struct nfp_alink_stats *prev_stats; + struct nfp_alink_stats stats; + int err; + + if (alink->qdiscs[0].handle != opt->handle) + return -EOPNOTSUPP; + prev_stats = &alink->qdiscs[0].stats; + + err = nfp_abm_ctrl_read_stats(alink, &stats); + if (err) + return err; + + nfp_abm_update_stats(&stats, prev_stats, &opt->stats); + + *prev_stats = stats; + + return 0; +} + +static int +nfp_abm_red_xstats(struct nfp_abm_link *alink, struct tc_red_qopt_offload *opt) +{ + struct nfp_alink_xstats *prev_xstats; + struct nfp_alink_xstats xstats; + int err; + + if (alink->qdiscs[0].handle != opt->handle) + return -EOPNOTSUPP; + prev_xstats = &alink->qdiscs[0].xstats; + + err = nfp_abm_ctrl_read_xstats(alink, &xstats); + if (err) + return err; + + opt->xstats->forced_mark += xstats.ecn_marked - prev_xstats->ecn_marked; + opt->xstats->pdrop += xstats.pdrop - prev_xstats->pdrop; + + *prev_xstats = xstats; + + return 0; +} + static int nfp_abm_setup_tc_red(struct net_device *netdev, struct nfp_abm_link *alink, struct tc_red_qopt_offload *opt) @@ -111,6 +199,10 @@ nfp_abm_setup_tc_red(struct net_device *netdev, struct nfp_abm_link *alink, case TC_RED_DESTROY: nfp_abm_red_destroy(netdev, alink, opt->handle); return 0; + case TC_RED_STATS: + return nfp_abm_red_stats(alink, opt); + case TC_RED_XSTATS: + return nfp_abm_red_xstats(alink, opt); default: return -EOPNOTSUPP; } diff --git a/drivers/net/ethernet/netronome/nfp/abm/main.h b/drivers/net/ethernet/netronome/nfp/abm/main.h index 979f98fb808b..93a3b79cf468 100644 --- a/drivers/net/ethernet/netronome/nfp/abm/main.h +++ b/drivers/net/ethernet/netronome/nfp/abm/main.h @@ -50,20 +50,54 @@ struct nfp_net; * @eswitch_mode: devlink eswitch mode, advanced functions only visible * in switchdev mode * @q_lvls: queue level control area + * @qm_stats: queue statistics symbol */ struct nfp_abm { struct nfp_app *app; unsigned int pf_id; enum devlink_eswitch_mode eswitch_mode; const struct nfp_rtsym *q_lvls; + const struct nfp_rtsym *qm_stats; +}; + +/** + * struct nfp_alink_stats - ABM NIC statistics + * @tx_pkts: number of TXed packets + * @tx_bytes: number of TXed bytes + * @backlog_pkts: momentary backlog length (packets) + * @backlog_bytes: momentary backlog length (bytes) + * @overlimits: number of ECN marked TXed packets (accumulative) + * @drops: number of tail-dropped packets (accumulative) + */ +struct nfp_alink_stats { + u64 tx_pkts; + u64 tx_bytes; + u64 backlog_pkts; + u64 backlog_bytes; + u64 overlimits; + u64 drops; +}; + +/** + * struct nfp_alink_xstats - extended ABM NIC statistics + * @ecn_marked: number of ECN marked TXed packets + * @pdrop: number of hard drops due to queue limit + */ +struct nfp_alink_xstats { + u64 ecn_marked; + u64 pdrop; }; /** * struct nfp_red_qdisc - representation of single RED Qdisc * @handle: handle of currently offloaded RED Qdisc + * @stats: statistics from last refresh + * @xstats: base of extended statistics */ struct nfp_red_qdisc { u32 handle; + struct nfp_alink_stats stats; + struct nfp_alink_xstats xstats; }; /** @@ -85,6 +119,10 @@ struct nfp_abm_link { void nfp_abm_ctrl_read_params(struct nfp_abm_link *alink); int nfp_abm_ctrl_find_addrs(struct nfp_abm *abm); int nfp_abm_ctrl_set_all_q_lvls(struct nfp_abm_link *alink, u32 val); +int nfp_abm_ctrl_read_stats(struct nfp_abm_link *alink, + struct nfp_alink_stats *stats); +int nfp_abm_ctrl_read_xstats(struct nfp_abm_link *alink, + struct nfp_alink_xstats *xstats); int nfp_abm_ctrl_qm_enable(struct nfp_abm *abm); int nfp_abm_ctrl_qm_disable(struct nfp_abm *abm); #endif From patchwork Sat May 26 04:53:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 920896 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=none (p=none dis=none) header.from=netronome.com 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="HMjYqlJZ"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40t9nK1xb2z9s0y for ; Sat, 26 May 2018 14:56:21 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1031172AbeEZE4P (ORCPT ); Sat, 26 May 2018 00:56:15 -0400 Received: from mail-qk0-f195.google.com ([209.85.220.195]:44309 "EHLO mail-qk0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1031090AbeEZEzh (ORCPT ); Sat, 26 May 2018 00:55:37 -0400 Received: by mail-qk0-f195.google.com with SMTP id 185-v6so5647164qkk.11 for ; Fri, 25 May 2018 21:55:37 -0700 (PDT) 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=h5cf2fB/rDWRol3C60SnUBLBNKhjADvGI/HrydFIwgk=; b=HMjYqlJZC3w3CtRRvIVENWBbYa1+AGOjfDoEWonltit21BUUFGpDU7mEExelLOdPec BNi5N5Xk5Uekay8x5BTmFs9K//UxrqglsLMzTRqxPJS3CkE/wNiRqvfylIRb23wpsFFn mGqz0QOXJ6KsgHn8xTPh+4NHzwa5xIwTCQjG2OqudHGMY0j1Y6qqlLNT1N6egiI8VJ1P IvGnbbrsPiS0YZ3W3gEmW2Vs4JuFqQRvQQy2RPcDyq1LYXwYe/LAvH6sG1hg5UqIoXVI cT5stX6asbnjvjisNrf5zjJoN8bcKoHe+3c4krrMHpRUl/0Jkd/JOkGgVJb9oJyUnZ7f TESA== 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=h5cf2fB/rDWRol3C60SnUBLBNKhjADvGI/HrydFIwgk=; b=fC60FZjF+47yXmMu/qrwATQdoKLF8xh992YzeXnWO8hW3gLGL4ExVI2kq5miMoKCC8 ZQwdmS7ap/wf/ttdr3DK9iwQfb37EbxyFxUsaPh2GsAxieu1owMPtXbErYoNsHyA6zxW oTdj+HiWA3FvrLGbqmXLN9tPZs1Yd/h0xgeELpAybZHeoug9Eo8wVJC8ngxrDHLaXi/I 7j1Y//CSOPLU3qJXlKBEjQ6JjhosCiBKaCH0JkofF+EAHfrAWvZSHVUkaihfUs7nS1nT Jdt4U8DtP3+sJfjAavL3c77fU5c2LACI/4aC1XZat+aEMH9JQYyedWFLcTv++WeLX+6M KucQ== X-Gm-Message-State: ALKqPwf6eaxA+dVJADnfScIn5/iwysMQAh+nFvgn1v8RADY+97/Z2aE9 FB8VleXtkOEO2kelcA8FGN+ang== X-Google-Smtp-Source: ADUXVKL+zSdvj77y0LFXqnAXKYqUAxhLCJ+4IjPBT+bjiN118NDLxwuiAan1oqvsniAFn3IyCKRWXw== X-Received: by 2002:a37:d6ce:: with SMTP id p75-v6mr4318017qkl.405.1527310536962; Fri, 25 May 2018 21:55:36 -0700 (PDT) Received: from jkicinski-Precision-T1700.netronome.com ([75.53.12.129]) by smtp.gmail.com with ESMTPSA id g16-v6sm17463754qtp.9.2018.05.25.21.55.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 25 May 2018 21:55:36 -0700 (PDT) From: Jakub Kicinski To: davem@davemloft.net Cc: jiri@resnulli.us, xiyou.wangcong@gmail.com, john.fastabend@gmail.com, netdev@vger.kernel.org, oss-drivers@netronome.com, alexei.starovoitov@gmail.com, nogahf@mellanox.com, yuvalm@mellanox.com, gerlitz.or@gmail.com, Jakub Kicinski Subject: [PATCH net-next 08/14] nfp: allow apps to add extra stats to ports Date: Fri, 25 May 2018 21:53:32 -0700 Message-Id: <20180526045338.10993-9-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180526045338.10993-1-jakub.kicinski@netronome.com> References: <20180526045338.10993-1-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Allow nfp apps to add extra ethtool stats. Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/netronome/nfp/nfp_app.c | 22 +++++++++++++++++++ drivers/net/ethernet/netronome/nfp/nfp_app.h | 13 +++++++++++ .../ethernet/netronome/nfp/nfp_net_ethtool.c | 10 +++++++-- drivers/net/ethernet/netronome/nfp/nfp_port.h | 2 ++ 4 files changed, 45 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_app.c b/drivers/net/ethernet/netronome/nfp/nfp_app.c index c9d8a7ab311e..f28b244f4ee7 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_app.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_app.c @@ -43,6 +43,7 @@ #include "nfp_main.h" #include "nfp_net.h" #include "nfp_net_repr.h" +#include "nfp_port.h" static const struct nfp_app_type *apps[] = { [NFP_APP_CORE_NIC] = &app_nic, @@ -85,6 +86,27 @@ const char *nfp_app_mip_name(struct nfp_app *app) return nfp_mip_name(app->pf->mip); } +u64 *nfp_app_port_get_stats(struct nfp_port *port, u64 *data) +{ + if (!port || !port->app || !port->app->type->port_get_stats) + return data; + return port->app->type->port_get_stats(port->app, port, data); +} + +int nfp_app_port_get_stats_count(struct nfp_port *port) +{ + if (!port || !port->app || !port->app->type->port_get_stats_count) + return 0; + return port->app->type->port_get_stats_count(port->app, port); +} + +u8 *nfp_app_port_get_stats_strings(struct nfp_port *port, u8 *data) +{ + if (!port || !port->app || !port->app->type->port_get_stats_strings) + return data; + return port->app->type->port_get_stats_strings(port->app, port, data); +} + struct sk_buff * nfp_app_ctrl_msg_alloc(struct nfp_app *app, unsigned int size, gfp_t priority) { diff --git a/drivers/net/ethernet/netronome/nfp/nfp_app.h b/drivers/net/ethernet/netronome/nfp/nfp_app.h index 23b99a4e05c2..ee74caacb015 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_app.h +++ b/drivers/net/ethernet/netronome/nfp/nfp_app.h @@ -90,6 +90,9 @@ extern const struct nfp_app_type app_abm; * @repr_stop: representor netdev stop callback * @check_mtu: MTU change request on a netdev (verify it is valid) * @repr_change_mtu: MTU change request on repr (make and verify change) + * @port_get_stats: get extra ethtool statistics for a port + * @port_get_stats_count: get count of extra statistics for a port + * @port_get_stats_strings: get strings for extra statistics * @start: start application logic * @stop: stop application logic * @ctrl_msg_rx: control message handler @@ -132,6 +135,12 @@ struct nfp_app_type { int (*repr_change_mtu)(struct nfp_app *app, struct net_device *netdev, int new_mtu); + u64 *(*port_get_stats)(struct nfp_app *app, + struct nfp_port *port, u64 *data); + int (*port_get_stats_count)(struct nfp_app *app, struct nfp_port *port); + u8 *(*port_get_stats_strings)(struct nfp_app *app, + struct nfp_port *port, u8 *data); + int (*start)(struct nfp_app *app); void (*stop)(struct nfp_app *app); @@ -404,6 +413,10 @@ static inline struct net_device *nfp_app_repr_get(struct nfp_app *app, u32 id) struct nfp_app *nfp_app_from_netdev(struct net_device *netdev); +u64 *nfp_app_port_get_stats(struct nfp_port *port, u64 *data); +int nfp_app_port_get_stats_count(struct nfp_port *port); +u8 *nfp_app_port_get_stats_strings(struct nfp_port *port, u8 *data); + struct nfp_reprs * nfp_reprs_get_locked(struct nfp_app *app, enum nfp_repr_type type); struct nfp_reprs * diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c b/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c index c9016419bfa0..26d1cc4e2906 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c @@ -437,7 +437,7 @@ static int nfp_net_set_ringparam(struct net_device *netdev, return nfp_net_set_ring_size(nn, rxd_cnt, txd_cnt); } -static __printf(2, 3) u8 *nfp_pr_et(u8 *data, const char *fmt, ...) +__printf(2, 3) u8 *nfp_pr_et(u8 *data, const char *fmt, ...) { va_list args; @@ -637,6 +637,7 @@ static void nfp_net_get_strings(struct net_device *netdev, nn->dp.num_tx_rings, false); data = nfp_mac_get_stats_strings(netdev, data); + data = nfp_app_port_get_stats_strings(nn->port, data); break; } } @@ -651,6 +652,7 @@ nfp_net_get_stats(struct net_device *netdev, struct ethtool_stats *stats, data = nfp_vnic_get_hw_stats(data, nn->dp.ctrl_bar, nn->dp.num_rx_rings, nn->dp.num_tx_rings); data = nfp_mac_get_stats(netdev, data); + data = nfp_app_port_get_stats(nn->port, data); } static int nfp_net_get_sset_count(struct net_device *netdev, int sset) @@ -662,7 +664,8 @@ static int nfp_net_get_sset_count(struct net_device *netdev, int sset) return nfp_vnic_get_sw_stats_count(netdev) + nfp_vnic_get_hw_stats_count(nn->dp.num_rx_rings, nn->dp.num_tx_rings) + - nfp_mac_get_stats_count(netdev); + nfp_mac_get_stats_count(netdev) + + nfp_app_port_get_stats_count(nn->port); default: return -EOPNOTSUPP; } @@ -679,6 +682,7 @@ static void nfp_port_get_strings(struct net_device *netdev, data = nfp_vnic_get_hw_stats_strings(data, 0, 0, true); else data = nfp_mac_get_stats_strings(netdev, data); + data = nfp_app_port_get_stats_strings(port, data); break; } } @@ -693,6 +697,7 @@ nfp_port_get_stats(struct net_device *netdev, struct ethtool_stats *stats, data = nfp_vnic_get_hw_stats(data, port->vnic, 0, 0); else data = nfp_mac_get_stats(netdev, data); + data = nfp_app_port_get_stats(port, data); } static int nfp_port_get_sset_count(struct net_device *netdev, int sset) @@ -706,6 +711,7 @@ static int nfp_port_get_sset_count(struct net_device *netdev, int sset) count = nfp_vnic_get_hw_stats_count(0, 0); else count = nfp_mac_get_stats_count(netdev); + count += nfp_app_port_get_stats_count(port); return count; default: return -EOPNOTSUPP; diff --git a/drivers/net/ethernet/netronome/nfp/nfp_port.h b/drivers/net/ethernet/netronome/nfp/nfp_port.h index 18666750456e..51f10ae2d53e 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_port.h +++ b/drivers/net/ethernet/netronome/nfp/nfp_port.h @@ -122,6 +122,8 @@ struct nfp_port { extern const struct ethtool_ops nfp_port_ethtool_ops; extern const struct switchdev_ops nfp_port_switchdev_ops; +__printf(2, 3) u8 *nfp_pr_et(u8 *data, const char *fmt, ...); + int nfp_port_setup_tc(struct net_device *netdev, enum tc_setup_type type, void *type_data); From patchwork Sat May 26 04:53:33 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 920889 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=none (p=none dis=none) header.from=netronome.com 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="fkl5EAQa"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40t9mk5ypXz9s16 for ; Sat, 26 May 2018 14:55:50 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1031117AbeEZEzl (ORCPT ); Sat, 26 May 2018 00:55:41 -0400 Received: from mail-qk0-f195.google.com ([209.85.220.195]:35870 "EHLO mail-qk0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1031091AbeEZEzj (ORCPT ); Sat, 26 May 2018 00:55:39 -0400 Received: by mail-qk0-f195.google.com with SMTP id a195-v6so3096697qkg.3 for ; Fri, 25 May 2018 21:55:39 -0700 (PDT) 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=oFXwtrObFyhJcLH6Kdi5zGSs2sveJJTeP4EXTx88Rzo=; b=fkl5EAQa6GENLAE53BJeQtBxPstaAj8fi4+25UaxUGvT1cMM/8u5BdSmgi7MSZwJYG py80OAagPjndLqIlHblA35QFCKwvVBIDcOqUlA4okibWoH819UNhidSJlt7uYatQxnI9 RyewXRXcaxtyc649kL59QhIFuwfzo+6mxL5KSCCQ0g/FDCwZmIFykWU4RJtNIQ/6yPMB HC2vV5HN9h1sAiKBS3vv0sQo4Ut3hHNYlGi8+jDXkDVwjF9ZlO1zKmZ2cDY5okjk92DX FRCUPj32UHzlq2je6GUBSA66Ol6f8fLcafh5ZfusSi998TB5qFgiU8hPlnbTYFcsFMjN 9VkQ== 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=oFXwtrObFyhJcLH6Kdi5zGSs2sveJJTeP4EXTx88Rzo=; b=LyNVGR6AVhSuStcGKymf19tRdHKXHtgds5juCc6aoa7vQ2eZVn8BSpLP3XW1vm1bHM GPR1jwFIGPjHiXsNl20tM0+X0BWQVWFFFblq9mZJY7m70GSKVRTCJ4gN1pPw0+R02rG/ 2xfEoMkH2LYQ/4pJrb/iLxcwBxSm93siwG3R7xdHoJs2nznWcROuZRC9mGwxgfmOT6Hj 2/XcVSIty4Pe6DgYflvJS69wmK1Sd4H4g8nPvW51uwGU0Ni1xASXdoYRnhsL61SotkLv 0ssnZyNWGF245CvBJMAfiuBRxuuObALEckMbr0Lf99AZhEPG7khz96gkEQK+rymJOM5O CEmw== X-Gm-Message-State: ALKqPwdaFAQrOztF6ZrJndiBUqhKyvAAQoA+m8J6v9zeB3+AqhafakJe g6W9siMF1ztBBeX0lKJWxpj7caPQ X-Google-Smtp-Source: ADUXVKJldXX/nOF7OtotP+iusiUQxxWweRvdgcxhoiwuGWh/UbElRslQfK/XJH32ymcyB4a91hEbLA== X-Received: by 2002:a37:6151:: with SMTP id v78-v6mr4655184qkb.134.1527310538572; Fri, 25 May 2018 21:55:38 -0700 (PDT) Received: from jkicinski-Precision-T1700.netronome.com ([75.53.12.129]) by smtp.gmail.com with ESMTPSA id g16-v6sm17463754qtp.9.2018.05.25.21.55.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 25 May 2018 21:55:38 -0700 (PDT) From: Jakub Kicinski To: davem@davemloft.net Cc: jiri@resnulli.us, xiyou.wangcong@gmail.com, john.fastabend@gmail.com, netdev@vger.kernel.org, oss-drivers@netronome.com, alexei.starovoitov@gmail.com, nogahf@mellanox.com, yuvalm@mellanox.com, gerlitz.or@gmail.com, Jakub Kicinski Subject: [PATCH net-next 09/14] nfp: abm: expose the internal stats in ethtool Date: Fri, 25 May 2018 21:53:33 -0700 Message-Id: <20180526045338.10993-10-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180526045338.10993-1-jakub.kicinski@netronome.com> References: <20180526045338.10993-1-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org There is a handful of statistics exposing some internal details of the implementation. Expose those via ethtool. Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/netronome/nfp/abm/ctrl.c | 22 ++++++++ drivers/net/ethernet/netronome/nfp/abm/main.c | 51 +++++++++++++++++++ drivers/net/ethernet/netronome/nfp/abm/main.h | 2 + 3 files changed, 75 insertions(+) diff --git a/drivers/net/ethernet/netronome/nfp/abm/ctrl.c b/drivers/net/ethernet/netronome/nfp/abm/ctrl.c index d2d9ca7a727c..79fc9147c012 100644 --- a/drivers/net/ethernet/netronome/nfp/abm/ctrl.c +++ b/drivers/net/ethernet/netronome/nfp/abm/ctrl.c @@ -50,6 +50,8 @@ #define NFP_QMSTAT_SYM_NAME "_abi_nfdqm%u_stats" #define NFP_QMSTAT_STRIDE 32 +#define NFP_QMSTAT_NON_STO 0 +#define NFP_QMSTAT_STO 8 #define NFP_QMSTAT_DROP 16 #define NFP_QMSTAT_ECN 24 @@ -142,6 +144,26 @@ int nfp_abm_ctrl_set_all_q_lvls(struct nfp_abm_link *alink, u32 val) return 0; } +u64 nfp_abm_ctrl_stat_non_sto(struct nfp_abm_link *alink, unsigned int i) +{ + u64 val; + + if (nfp_abm_ctrl_stat(alink, alink->abm->qm_stats, NFP_QMSTAT_STRIDE, + NFP_QMSTAT_NON_STO, i, true, &val)) + return 0; + return val; +} + +u64 nfp_abm_ctrl_stat_sto(struct nfp_abm_link *alink, unsigned int i) +{ + u64 val; + + if (nfp_abm_ctrl_stat(alink, alink->abm->qm_stats, NFP_QMSTAT_STRIDE, + NFP_QMSTAT_STO, i, true, &val)) + return 0; + return val; +} + int nfp_abm_ctrl_read_stats(struct nfp_abm_link *alink, struct nfp_alink_stats *stats) { diff --git a/drivers/net/ethernet/netronome/nfp/abm/main.c b/drivers/net/ethernet/netronome/nfp/abm/main.c index d0c21899a8b7..4e89159f13d3 100644 --- a/drivers/net/ethernet/netronome/nfp/abm/main.c +++ b/drivers/net/ethernet/netronome/nfp/abm/main.c @@ -497,6 +497,53 @@ static void nfp_abm_vnic_free(struct nfp_app *app, struct nfp_net *nn) kfree(alink); } +static u64 * +nfp_abm_port_get_stats(struct nfp_app *app, struct nfp_port *port, u64 *data) +{ + struct nfp_repr *repr = netdev_priv(port->netdev); + struct nfp_abm_link *alink; + unsigned int i; + + if (port->type != NFP_PORT_PF_PORT) + return data; + alink = repr->app_priv; + for (i = 0; i < alink->vnic->dp.num_r_vecs; i++) { + *data++ = nfp_abm_ctrl_stat_non_sto(alink, i); + *data++ = nfp_abm_ctrl_stat_sto(alink, i); + } + return data; +} + +static int +nfp_abm_port_get_stats_count(struct nfp_app *app, struct nfp_port *port) +{ + struct nfp_repr *repr = netdev_priv(port->netdev); + struct nfp_abm_link *alink; + + if (port->type != NFP_PORT_PF_PORT) + return 0; + alink = repr->app_priv; + return alink->vnic->dp.num_r_vecs * 2; +} + +static u8 * +nfp_abm_port_get_stats_strings(struct nfp_app *app, struct nfp_port *port, + u8 *data) +{ + struct nfp_repr *repr = netdev_priv(port->netdev); + struct nfp_abm_link *alink; + unsigned int i; + + if (port->type != NFP_PORT_PF_PORT) + return data; + alink = repr->app_priv; + for (i = 0; i < alink->vnic->dp.num_r_vecs; i++) { + data = nfp_pr_et(data, "q%u_no_wait", i); + data = nfp_pr_et(data, "q%u_delayed", i); + } + return data; +} + static int nfp_abm_init(struct nfp_app *app) { struct nfp_pf *pf = app->pf; @@ -575,6 +622,10 @@ const struct nfp_app_type app_abm = { .vnic_alloc = nfp_abm_vnic_alloc, .vnic_free = nfp_abm_vnic_free, + .port_get_stats = nfp_abm_port_get_stats, + .port_get_stats_count = nfp_abm_port_get_stats_count, + .port_get_stats_strings = nfp_abm_port_get_stats_strings, + .setup_tc = nfp_abm_setup_tc, .eswitch_mode_get = nfp_abm_eswitch_mode_get, diff --git a/drivers/net/ethernet/netronome/nfp/abm/main.h b/drivers/net/ethernet/netronome/nfp/abm/main.h index 93a3b79cf468..09fd15847961 100644 --- a/drivers/net/ethernet/netronome/nfp/abm/main.h +++ b/drivers/net/ethernet/netronome/nfp/abm/main.h @@ -123,6 +123,8 @@ int nfp_abm_ctrl_read_stats(struct nfp_abm_link *alink, struct nfp_alink_stats *stats); int nfp_abm_ctrl_read_xstats(struct nfp_abm_link *alink, struct nfp_alink_xstats *xstats); +u64 nfp_abm_ctrl_stat_non_sto(struct nfp_abm_link *alink, unsigned int i); +u64 nfp_abm_ctrl_stat_sto(struct nfp_abm_link *alink, unsigned int i); int nfp_abm_ctrl_qm_enable(struct nfp_abm *abm); int nfp_abm_ctrl_qm_disable(struct nfp_abm *abm); #endif From patchwork Sat May 26 04:53:34 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 920894 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=none (p=none dis=none) header.from=netronome.com 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="h9sLWidF"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40t9n43kYRz9s0y for ; Sat, 26 May 2018 14:56:08 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1031166AbeEZE4G (ORCPT ); Sat, 26 May 2018 00:56:06 -0400 Received: from mail-qk0-f196.google.com ([209.85.220.196]:46854 "EHLO mail-qk0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1031087AbeEZEzk (ORCPT ); Sat, 26 May 2018 00:55:40 -0400 Received: by mail-qk0-f196.google.com with SMTP id k86-v6so5644244qkh.13 for ; Fri, 25 May 2018 21:55:40 -0700 (PDT) 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=Ud9DkSS+cbEYva2Tl3UQbahjHVxFXpQV3o4ASjnAK90=; b=h9sLWidFNdwfj26u+7x8h9n/uGGmZm4mBVAl/nau07hcifiCmHaI+gzi7plrkBAZBz 55FYE8N4shFWccADw5VFMHzOibDs9X9Ekg8+ye4+N4sSsjb+PDG9n/23alwZE5MJlBBl Bct2WcqT9aBcGag3f+KcPlA1ZHYK0Fs4/5hLhL6bgvJ3iP6vVz1WcOtPQTP4Qiz/VMXL 2MhlGJTi7j4fbVZqc7Pe+ZHlE70jsesEAD4ee/HdyJAWZDvL9bNefZfn2rVXh8MjoTJ4 E2ucU/70eUV9UqPw7R+2owC/JSrcRky10sUE4EsAzw1LEP2ICOFVwuvJDAJs7QYBIsr1 M0XA== 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=Ud9DkSS+cbEYva2Tl3UQbahjHVxFXpQV3o4ASjnAK90=; b=gv/JFDrYyAX36wRVS2uxj0qIj0soqvGRBVJpQDOtAyoGF6XS0eUb5TOcOd0pPTUEMP c5NuuRo9QXI6yRXoyZFjE8ih6FJAi5d5KrmmNPC/ShS9u9UvmyiaGAZe1tBPg9sC6CFF Y3k6N0InrEi+oZ1pZD2C3f0dfsDbRwVCkN8iZAOpb3N8EDn+6AKktbPZW94J5nM/yXGu fMFzEdBzEjyjGI3gPTVyWE/YxqZ0CaXPHw2osS4eqFrijZtOzlwjHgNl7qUkaODj7LVI tr/2Hgda8o6FG4tSRGBql83cdplA8xyvBDPmLGiM1Uoi89vkTZ1CNt1ks2MG2aCyz7U6 TBkQ== X-Gm-Message-State: ALKqPwdXjiOcwxEiZRsQuyvkp3YW5ukwAVquuH+VDn0c2N/3sYhcb15l 8v0vmrFIcYk6D8WeUTize6SsXQ== X-Google-Smtp-Source: ADUXVKJ5cy17NYSnE2xGx2z54npu3Ht1rmwtdd8gohY7lWLPL60tIeNt9a5lrsarTUmS+AM0jzLQ3g== X-Received: by 2002:a37:24c2:: with SMTP id k63-v6mr4675892qkk.28.1527310540145; Fri, 25 May 2018 21:55:40 -0700 (PDT) Received: from jkicinski-Precision-T1700.netronome.com ([75.53.12.129]) by smtp.gmail.com with ESMTPSA id g16-v6sm17463754qtp.9.2018.05.25.21.55.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 25 May 2018 21:55:39 -0700 (PDT) From: Jakub Kicinski To: davem@davemloft.net Cc: jiri@resnulli.us, xiyou.wangcong@gmail.com, john.fastabend@gmail.com, netdev@vger.kernel.org, oss-drivers@netronome.com, alexei.starovoitov@gmail.com, nogahf@mellanox.com, yuvalm@mellanox.com, gerlitz.or@gmail.com, Jakub Kicinski Subject: [PATCH net-next 10/14] nfp: abm: expose all PF queues Date: Fri, 25 May 2018 21:53:34 -0700 Message-Id: <20180526045338.10993-11-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180526045338.10993-1-jakub.kicinski@netronome.com> References: <20180526045338.10993-1-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Allocate the PF representor as multi-queue to allow setting the configuration per-queue. Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/netronome/nfp/abm/main.c | 10 +++++++--- drivers/net/ethernet/netronome/nfp/nfp_net_repr.c | 5 +++-- drivers/net/ethernet/netronome/nfp/nfp_net_repr.h | 7 ++++++- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/netronome/nfp/abm/main.c b/drivers/net/ethernet/netronome/nfp/abm/main.c index 4e89159f13d3..ef77d7b0d99d 100644 --- a/drivers/net/ethernet/netronome/nfp/abm/main.c +++ b/drivers/net/ethernet/netronome/nfp/abm/main.c @@ -255,14 +255,18 @@ nfp_abm_spawn_repr(struct nfp_app *app, struct nfp_abm_link *alink, struct nfp_reprs *reprs; struct nfp_repr *repr; struct nfp_port *port; + unsigned int txqs; int err; - if (ptype == NFP_PORT_PHYS_PORT) + if (ptype == NFP_PORT_PHYS_PORT) { rtype = NFP_REPR_TYPE_PHYS_PORT; - else + txqs = 1; + } else { rtype = NFP_REPR_TYPE_PF; + txqs = alink->vnic->max_rx_rings; + } - netdev = nfp_repr_alloc(app); + netdev = nfp_repr_alloc_mqs(app, txqs, 1); if (!netdev) return -ENOMEM; repr = netdev_priv(netdev); diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c b/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c index 117eca6819de..d7b712f6362f 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c @@ -360,12 +360,13 @@ void nfp_repr_free(struct net_device *netdev) __nfp_repr_free(netdev_priv(netdev)); } -struct net_device *nfp_repr_alloc(struct nfp_app *app) +struct net_device * +nfp_repr_alloc_mqs(struct nfp_app *app, unsigned int txqs, unsigned int rxqs) { struct net_device *netdev; struct nfp_repr *repr; - netdev = alloc_etherdev(sizeof(*repr)); + netdev = alloc_etherdev_mqs(sizeof(*repr), txqs, rxqs); if (!netdev) return NULL; diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_repr.h b/drivers/net/ethernet/netronome/nfp/nfp_net_repr.h index 8366e4f3c623..1bf2b18109ab 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_repr.h +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_repr.h @@ -126,7 +126,8 @@ int nfp_repr_init(struct nfp_app *app, struct net_device *netdev, u32 cmsg_port_id, struct nfp_port *port, struct net_device *pf_netdev); void nfp_repr_free(struct net_device *netdev); -struct net_device *nfp_repr_alloc(struct nfp_app *app); +struct net_device * +nfp_repr_alloc_mqs(struct nfp_app *app, unsigned int txqs, unsigned int rxqs); void nfp_repr_clean_and_free(struct nfp_repr *repr); void nfp_reprs_clean_and_free(struct nfp_app *app, struct nfp_reprs *reprs); void nfp_reprs_clean_and_free_by_type(struct nfp_app *app, @@ -134,4 +135,8 @@ void nfp_reprs_clean_and_free_by_type(struct nfp_app *app, struct nfp_reprs *nfp_reprs_alloc(unsigned int num_reprs); int nfp_reprs_resync_phys_ports(struct nfp_app *app); +static inline struct net_device *nfp_repr_alloc(struct nfp_app *app) +{ + return nfp_repr_alloc_mqs(app, 1, 1); +} #endif /* NFP_NET_REPR_H */ From patchwork Sat May 26 04:53:35 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 920892 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=none (p=none dis=none) header.from=netronome.com 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="YPg0340X"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40t9mt22vWz9s0y for ; Sat, 26 May 2018 14:55:58 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1031140AbeEZEzq (ORCPT ); Sat, 26 May 2018 00:55:46 -0400 Received: from mail-qk0-f193.google.com ([209.85.220.193]:41925 "EHLO mail-qk0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1031091AbeEZEzm (ORCPT ); Sat, 26 May 2018 00:55:42 -0400 Received: by mail-qk0-f193.google.com with SMTP id d125-v6so5643845qkb.8 for ; Fri, 25 May 2018 21:55:42 -0700 (PDT) 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=yK1uDfwHPI1WjgwhXDiwRIogN3dutwgRCloleQeT440=; b=YPg0340XU1lTeGmly6spcs2XAFJeZf26AsFJiA/cwpHXXRJZpApAwjBuxMOK4xniaE +9wuedj0PyuZViGb92I4hNtLOpDNaY6NfIx8uAT7RhS3pfFgbKZnURxJqFQUMmC6V3GE 9BmXQCHI14ZHKmusCIts9xQFh07XmfDDZw2rVNlg8QFoX6wc54ExNQSMKxt5QjeN/DYP Zd+jKsLnNcgl1aTUUFLmGVf5Z6Q3FPzjjaGV2tgHqYI/5paiiahq4+RedLbTOyMccG7S Ob9PCCNxoMQJjz4y21vXMgbtBIUbSpT/KDS50LlZnxmCTOgc8iYaXZ2rWUj0acrnIVZC tN5g== 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=yK1uDfwHPI1WjgwhXDiwRIogN3dutwgRCloleQeT440=; b=c6sWafCzfffc9ZAzOiWW+3a/GMxmqhv5M1eGb5kV7ZGVTRGEy/3NnPcFMQ1bRFJQIP rSd4bnFm6A2h4+C4vLXdfWlaaQvpNbU/5FKYUrYER836TqjuAlNp81aCC0vs3bZBkqyT +yYNtlaqZi5SRyB3vlaYh6TMxizUJkE/Cdf8EZrY5BSboyIBkU5sTF3/1DMsTjUPFQi1 9qcGjz/knwG1xHqsQ0c4gOBlsWW7NmFIckrpE94YjmWn4a+Xd/+nhhFAIBKWXDSrdWKp L8y36Iswiy/oEH0TdzoYVIXF8dXWAw/QfFbLEjGmVNy/u7LXEilVZydJbfINkKezQhKH gKaA== X-Gm-Message-State: ALKqPwew1LshgzEQZX7Y+H6vdkSVuHym6gERSCw3voMmaW0sVvzx9Ke8 03+emS0C1x/3NsgkpqkZgc6wUA== X-Google-Smtp-Source: ADUXVKJsX59LEZaYN21l2QHBDvPY66jD3T5jaXVs73e8xjUjbAJC2Vg+cM9QEnFu58vVV4E4DeCYAQ== X-Received: by 2002:a37:8942:: with SMTP id l63-v6mr4391323qkd.293.1527310541730; Fri, 25 May 2018 21:55:41 -0700 (PDT) Received: from jkicinski-Precision-T1700.netronome.com ([75.53.12.129]) by smtp.gmail.com with ESMTPSA id g16-v6sm17463754qtp.9.2018.05.25.21.55.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 25 May 2018 21:55:41 -0700 (PDT) From: Jakub Kicinski To: davem@davemloft.net Cc: jiri@resnulli.us, xiyou.wangcong@gmail.com, john.fastabend@gmail.com, netdev@vger.kernel.org, oss-drivers@netronome.com, alexei.starovoitov@gmail.com, nogahf@mellanox.com, yuvalm@mellanox.com, gerlitz.or@gmail.com, Jakub Kicinski Subject: [PATCH net-next 11/14] net: sched: mq: add simple offload notification Date: Fri, 25 May 2018 21:53:35 -0700 Message-Id: <20180526045338.10993-12-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180526045338.10993-1-jakub.kicinski@netronome.com> References: <20180526045338.10993-1-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org mq offload is trivial, we just need to let the device know that the root qdisc is mq. Alternative approach would be to export qdisc_lookup() and make drivers check the root type themselves, but notification via ndo_setup_tc is more in line with other qdiscs. Note that mq doesn't hold any stats on it's own, it just adds up stats of its children. Signed-off-by: Jakub Kicinski --- include/linux/netdevice.h | 1 + include/net/pkt_cls.h | 10 ++++++++++ net/sched/sch_mq.c | 19 +++++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 8452f72087ef..29ef76360cc8 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -791,6 +791,7 @@ enum tc_setup_type { TC_SETUP_QDISC_CBS, TC_SETUP_QDISC_RED, TC_SETUP_QDISC_PRIO, + TC_SETUP_QDISC_MQ, }; /* These structures hold the attributes of bpf state that are being passed diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h index f3ec43725724..942f839dbca4 100644 --- a/include/net/pkt_cls.h +++ b/include/net/pkt_cls.h @@ -778,6 +778,16 @@ struct tc_qopt_offload_stats { struct gnet_stats_queue *qstats; }; +enum tc_mq_command { + TC_MQ_CREATE, + TC_MQ_DESTROY, +}; + +struct tc_mq_qopt_offload { + enum tc_mq_command command; + u32 handle; +}; + enum tc_red_command { TC_RED_REPLACE, TC_RED_DESTROY, diff --git a/net/sched/sch_mq.c b/net/sched/sch_mq.c index f062a18e9162..6ccf6daa2503 100644 --- a/net/sched/sch_mq.c +++ b/net/sched/sch_mq.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -23,12 +24,28 @@ struct mq_sched { struct Qdisc **qdiscs; }; +static int mq_offload(struct Qdisc *sch, enum tc_mq_command cmd) +{ + struct net_device *dev = qdisc_dev(sch); + struct tc_mq_qopt_offload opt = { + .command = cmd, + .handle = sch->handle, + }; + + if (!tc_can_offload(dev) || !dev->netdev_ops->ndo_setup_tc) + return -EOPNOTSUPP; + + return dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_QDISC_MQ, &opt); +} + static void mq_destroy(struct Qdisc *sch) { struct net_device *dev = qdisc_dev(sch); struct mq_sched *priv = qdisc_priv(sch); unsigned int ntx; + mq_offload(sch, TC_MQ_DESTROY); + if (!priv->qdiscs) return; for (ntx = 0; ntx < dev->num_tx_queues && priv->qdiscs[ntx]; ntx++) @@ -70,6 +87,8 @@ static int mq_init(struct Qdisc *sch, struct nlattr *opt, } sch->flags |= TCQ_F_MQROOT; + + mq_offload(sch, TC_MQ_CREATE); return 0; } From patchwork Sat May 26 04:53:36 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 920891 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=none (p=none dis=none) header.from=netronome.com 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="w1c598Bz"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40t9mq0Cfkz9s0y for ; Sat, 26 May 2018 14:55:55 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1031148AbeEZEzs (ORCPT ); Sat, 26 May 2018 00:55:48 -0400 Received: from mail-qk0-f182.google.com ([209.85.220.182]:38265 "EHLO mail-qk0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1031119AbeEZEzo (ORCPT ); Sat, 26 May 2018 00:55:44 -0400 Received: by mail-qk0-f182.google.com with SMTP id c23-v6so5650376qkb.5 for ; Fri, 25 May 2018 21:55:44 -0700 (PDT) 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=2p0y4AcfFuiLzoZUAo2IqJX73X5FnrU8kHzZBzXexqk=; b=w1c598BzpyahbeP0mI24GvphvDbOfg/iPA6MbJ6POJ1aHzNeRlVmHPvfYyfd8+mxsr gfHW0liUF+Zhlbtt7m0+KfrtTFBAkX0T4EhdPc7k0Ga/k33HTBx2A9+e+eDcHUhj/rCw yEmfgkKIDYiHtDENUcKDDKD43nFX2Ei36KkqTcdEeWSKsQFavbA6GXFakMP3N7nTpaso Gz6uWqB9u3YD0uo7bsKqOveDIblpydDzgDNVdkRun35fJIavgVuW+s6KwgkwppMa8rzB oFJ1ZsVjYtRAcdht8azy/Q29sxUnPvpEnDYCi70xpApHop9kca59v3bHN9QAUbyFFr3V EzwQ== 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=2p0y4AcfFuiLzoZUAo2IqJX73X5FnrU8kHzZBzXexqk=; b=ItwNvxnq4g3Mpv7IkGMVSqGEKh9m/79q8V/MtKf+EV1BG5iHM6RDaiJAk3A3s1hM2C W88CzZKlQDihoD50alMtzDlRy/AeW0B98ycp3pgaA03kZWnNeqn13lgQL0lJnmpB+FsC fk8elqhGEJetgm/fSdTKOI9OOW/SEwxJ/d3hy/xP4CrDgrR4Iq8c4UKlQAp5Eq+0tCjI 5fu/fbpB7xm72vTARMlqryA9b2KOzVw4+HEpzsTkDObXsBhp1d/l4vdXqNbq1Ad31YnX MoYGjidlLaivDh38b03g7fEG2Y8TlUduWCbUVeIIjQ78lnSnHvUkt4YW5abrSTslxFuy pvZw== X-Gm-Message-State: ALKqPwe8mnVjkFyDKlbwiIqiddcZZUD2TFBuOvJ5bKkXnZZBMP1DNe7C UTxZFkKRSFm8o8p6K4LK3easRg== X-Google-Smtp-Source: ADUXVKI+Aa27z8wYQ2rfMcCG11ccYP1YHUE+KrYDrecqWTtQP8fSaVIGXaa/7gcT6/CH6AAI7umBEA== X-Received: by 2002:a37:bac4:: with SMTP id k187-v6mr4427244qkf.66.1527310543336; Fri, 25 May 2018 21:55:43 -0700 (PDT) Received: from jkicinski-Precision-T1700.netronome.com ([75.53.12.129]) by smtp.gmail.com with ESMTPSA id g16-v6sm17463754qtp.9.2018.05.25.21.55.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 25 May 2018 21:55:42 -0700 (PDT) From: Jakub Kicinski To: davem@davemloft.net Cc: jiri@resnulli.us, xiyou.wangcong@gmail.com, john.fastabend@gmail.com, netdev@vger.kernel.org, oss-drivers@netronome.com, alexei.starovoitov@gmail.com, nogahf@mellanox.com, yuvalm@mellanox.com, gerlitz.or@gmail.com, Jakub Kicinski Subject: [PATCH net-next 12/14] nfp: abm: multi-queue RED offload Date: Fri, 25 May 2018 21:53:36 -0700 Message-Id: <20180526045338.10993-13-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180526045338.10993-1-jakub.kicinski@netronome.com> References: <20180526045338.10993-1-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add support for MQ offload and setting RED parameters on queue-by-queue basis. Signed-off-by: Jakub Kicinski Reviewed-by: Dirk van der Merwe --- drivers/net/ethernet/netronome/nfp/abm/ctrl.c | 50 ++++- drivers/net/ethernet/netronome/nfp/abm/main.c | 192 ++++++++++++++---- drivers/net/ethernet/netronome/nfp/abm/main.h | 14 +- 3 files changed, 208 insertions(+), 48 deletions(-) diff --git a/drivers/net/ethernet/netronome/nfp/abm/ctrl.c b/drivers/net/ethernet/netronome/nfp/abm/ctrl.c index 79fc9147c012..b157ccd8c80f 100644 --- a/drivers/net/ethernet/netronome/nfp/abm/ctrl.c +++ b/drivers/net/ethernet/netronome/nfp/abm/ctrl.c @@ -111,8 +111,7 @@ nfp_abm_ctrl_stat_all(struct nfp_abm_link *alink, const struct nfp_rtsym *sym, return 0; } -static int -nfp_abm_ctrl_set_q_lvl(struct nfp_abm_link *alink, unsigned int i, u32 val) +int nfp_abm_ctrl_set_q_lvl(struct nfp_abm_link *alink, unsigned int i, u32 val) { struct nfp_cpp *cpp = alink->abm->app->cpp; u32 muw; @@ -164,6 +163,37 @@ u64 nfp_abm_ctrl_stat_sto(struct nfp_abm_link *alink, unsigned int i) return val; } +int nfp_abm_ctrl_read_q_stats(struct nfp_abm_link *alink, unsigned int i, + struct nfp_alink_stats *stats) +{ + int err; + + stats->tx_pkts = nn_readq(alink->vnic, NFP_NET_CFG_RXR_STATS(i)); + stats->tx_bytes = nn_readq(alink->vnic, NFP_NET_CFG_RXR_STATS(i) + 8); + + err = nfp_abm_ctrl_stat(alink, alink->abm->q_lvls, + NFP_QLVL_STRIDE, NFP_QLVL_BLOG_BYTES, + i, false, &stats->backlog_bytes); + if (err) + return err; + + err = nfp_abm_ctrl_stat(alink, alink->abm->q_lvls, + NFP_QLVL_STRIDE, NFP_QLVL_BLOG_PKTS, + i, false, &stats->backlog_pkts); + if (err) + return err; + + err = nfp_abm_ctrl_stat(alink, alink->abm->qm_stats, + NFP_QMSTAT_STRIDE, NFP_QMSTAT_DROP, + i, true, &stats->drops); + if (err) + return err; + + return nfp_abm_ctrl_stat(alink, alink->abm->qm_stats, + NFP_QMSTAT_STRIDE, NFP_QMSTAT_ECN, + i, true, &stats->overlimits); +} + int nfp_abm_ctrl_read_stats(struct nfp_abm_link *alink, struct nfp_alink_stats *stats) { @@ -200,6 +230,22 @@ int nfp_abm_ctrl_read_stats(struct nfp_abm_link *alink, true, &stats->overlimits); } +int nfp_abm_ctrl_read_q_xstats(struct nfp_abm_link *alink, unsigned int i, + struct nfp_alink_xstats *xstats) +{ + int err; + + err = nfp_abm_ctrl_stat(alink, alink->abm->qm_stats, + NFP_QMSTAT_STRIDE, NFP_QMSTAT_DROP, + i, true, &xstats->pdrop); + if (err) + return err; + + return nfp_abm_ctrl_stat(alink, alink->abm->qm_stats, + NFP_QMSTAT_STRIDE, NFP_QMSTAT_ECN, + i, true, &xstats->ecn_marked); +} + int nfp_abm_ctrl_read_xstats(struct nfp_abm_link *alink, struct nfp_alink_xstats *xstats) { diff --git a/drivers/net/ethernet/netronome/nfp/abm/main.c b/drivers/net/ethernet/netronome/nfp/abm/main.c index ef77d7b0d99d..21d5af1fb061 100644 --- a/drivers/net/ethernet/netronome/nfp/abm/main.c +++ b/drivers/net/ethernet/netronome/nfp/abm/main.c @@ -58,43 +58,77 @@ static u32 nfp_abm_portid(enum nfp_repr_type rtype, unsigned int id) FIELD_PREP(NFP_ABM_PORTID_ID, id); } -static int nfp_abm_reset_stats(struct nfp_abm_link *alink) +static int +__nfp_abm_reset_root(struct net_device *netdev, struct nfp_abm_link *alink, + u32 handle, unsigned int qs, u32 init_val) { - int err; + struct nfp_port *port = nfp_port_from_netdev(netdev); + int ret; - err = nfp_abm_ctrl_read_stats(alink, &alink->qdiscs[0].stats); - if (err) - return err; - alink->qdiscs[0].stats.backlog_pkts = 0; - alink->qdiscs[0].stats.backlog_bytes = 0; + ret = nfp_abm_ctrl_set_all_q_lvls(alink, init_val); + memset(alink->qdiscs, 0, sizeof(*alink->qdiscs) * alink->num_qdiscs); - err = nfp_abm_ctrl_read_xstats(alink, &alink->qdiscs[0].xstats); - if (err) - return err; + alink->parent = handle; + alink->num_qdiscs = qs; + port->tc_offload_cnt = qs; - return 0; + return ret; +} + +static void +nfp_abm_reset_root(struct net_device *netdev, struct nfp_abm_link *alink, + u32 handle, unsigned int qs) +{ + __nfp_abm_reset_root(netdev, alink, handle, qs, ~0); +} + +static int +nfp_abm_red_find(struct nfp_abm_link *alink, struct tc_red_qopt_offload *opt) +{ + unsigned int i = TC_H_MIN(opt->parent) - 1; + + if (opt->parent == TC_H_ROOT) + i = 0; + else if (TC_H_MAJ(alink->parent) == TC_H_MAJ(opt->parent)) + i = TC_H_MIN(opt->parent) - 1; + else + return -EOPNOTSUPP; + + if (i >= alink->num_qdiscs || opt->handle != alink->qdiscs[i].handle) + return -EOPNOTSUPP; + + return i; } static void nfp_abm_red_destroy(struct net_device *netdev, struct nfp_abm_link *alink, u32 handle) { - struct nfp_port *port = nfp_port_from_netdev(netdev); + unsigned int i; - if (handle != alink->qdiscs[0].handle) + for (i = 0; i < alink->num_qdiscs; i++) + if (handle == alink->qdiscs[i].handle) + break; + if (i == alink->num_qdiscs) return; - alink->qdiscs[0].handle = TC_H_UNSPEC; - port->tc_offload_cnt = 0; - nfp_abm_ctrl_set_all_q_lvls(alink, ~0); + if (alink->parent == TC_H_ROOT) { + nfp_abm_reset_root(netdev, alink, TC_H_ROOT, 0); + } else { + nfp_abm_ctrl_set_q_lvl(alink, i, ~0); + memset(&alink->qdiscs[i], 0, sizeof(*alink->qdiscs)); + } } static int nfp_abm_red_replace(struct net_device *netdev, struct nfp_abm_link *alink, struct tc_red_qopt_offload *opt) { - struct nfp_port *port = nfp_port_from_netdev(netdev); - int err; + bool existing; + int i, err; + + i = nfp_abm_red_find(alink, opt); + existing = i >= 0; if (opt->set.min != opt->set.max || !opt->set.is_ecn) { nfp_warn(alink->abm->app->cpp, @@ -102,30 +136,62 @@ nfp_abm_red_replace(struct net_device *netdev, struct nfp_abm_link *alink, err = -EINVAL; goto err_destroy; } - err = nfp_abm_ctrl_set_all_q_lvls(alink, opt->set.min); - if (err) - goto err_destroy; - /* Reset stats only on new qdisc */ - if (alink->qdiscs[0].handle != opt->handle) { - err = nfp_abm_reset_stats(alink); + if (existing) { + if (alink->parent == TC_H_ROOT) + err = nfp_abm_ctrl_set_all_q_lvls(alink, opt->set.min); + else + err = nfp_abm_ctrl_set_q_lvl(alink, i, opt->set.min); if (err) goto err_destroy; + return 0; } - alink->qdiscs[0].handle = opt->handle; - port->tc_offload_cnt = 1; + if (opt->parent == TC_H_ROOT) { + i = 0; + err = __nfp_abm_reset_root(netdev, alink, TC_H_ROOT, 1, + opt->set.min); + } else if (TC_H_MAJ(alink->parent) == TC_H_MAJ(opt->parent)) { + i = TC_H_MIN(opt->parent) - 1; + err = nfp_abm_ctrl_set_q_lvl(alink, i, opt->set.min); + } else { + return -EINVAL; + } + /* Set the handle to try full clean up, in case IO failed */ + alink->qdiscs[i].handle = opt->handle; + if (err) + goto err_destroy; + + if (opt->parent == TC_H_ROOT) + err = nfp_abm_ctrl_read_stats(alink, &alink->qdiscs[i].stats); + else + err = nfp_abm_ctrl_read_q_stats(alink, i, + &alink->qdiscs[i].stats); + if (err) + goto err_destroy; + + if (opt->parent == TC_H_ROOT) + err = nfp_abm_ctrl_read_xstats(alink, + &alink->qdiscs[i].xstats); + else + err = nfp_abm_ctrl_read_q_xstats(alink, i, + &alink->qdiscs[i].xstats); + if (err) + goto err_destroy; + + alink->qdiscs[i].stats.backlog_pkts = 0; + alink->qdiscs[i].stats.backlog_bytes = 0; return 0; err_destroy: /* If the qdisc keeps on living, but we can't offload undo changes */ - if (alink->qdiscs[0].handle == opt->handle) { - opt->set.qstats->qlen -= alink->qdiscs[0].stats.backlog_pkts; + if (existing) { + opt->set.qstats->qlen -= alink->qdiscs[i].stats.backlog_pkts; opt->set.qstats->backlog -= - alink->qdiscs[0].stats.backlog_bytes; + alink->qdiscs[i].stats.backlog_bytes; } - if (alink->qdiscs[0].handle != TC_H_UNSPEC) - nfp_abm_red_destroy(netdev, alink, alink->qdiscs[0].handle); + nfp_abm_red_destroy(netdev, alink, opt->handle); + return err; } @@ -146,13 +212,17 @@ nfp_abm_red_stats(struct nfp_abm_link *alink, struct tc_red_qopt_offload *opt) { struct nfp_alink_stats *prev_stats; struct nfp_alink_stats stats; - int err; + int i, err; - if (alink->qdiscs[0].handle != opt->handle) - return -EOPNOTSUPP; - prev_stats = &alink->qdiscs[0].stats; + i = nfp_abm_red_find(alink, opt); + if (i < 0) + return i; + prev_stats = &alink->qdiscs[i].stats; - err = nfp_abm_ctrl_read_stats(alink, &stats); + if (alink->parent == TC_H_ROOT) + err = nfp_abm_ctrl_read_stats(alink, &stats); + else + err = nfp_abm_ctrl_read_q_stats(alink, i, &stats); if (err) return err; @@ -168,13 +238,17 @@ nfp_abm_red_xstats(struct nfp_abm_link *alink, struct tc_red_qopt_offload *opt) { struct nfp_alink_xstats *prev_xstats; struct nfp_alink_xstats xstats; - int err; + int i, err; - if (alink->qdiscs[0].handle != opt->handle) - return -EOPNOTSUPP; - prev_xstats = &alink->qdiscs[0].xstats; + i = nfp_abm_red_find(alink, opt); + if (i < 0) + return i; + prev_xstats = &alink->qdiscs[i].xstats; - err = nfp_abm_ctrl_read_xstats(alink, &xstats); + if (alink->parent == TC_H_ROOT) + err = nfp_abm_ctrl_read_xstats(alink, &xstats); + else + err = nfp_abm_ctrl_read_q_xstats(alink, i, &xstats); if (err) return err; @@ -190,9 +264,6 @@ static int nfp_abm_setup_tc_red(struct net_device *netdev, struct nfp_abm_link *alink, struct tc_red_qopt_offload *opt) { - if (opt->parent != TC_H_ROOT) - return -EOPNOTSUPP; - switch (opt->command) { case TC_RED_REPLACE: return nfp_abm_red_replace(netdev, alink, opt); @@ -208,6 +279,24 @@ nfp_abm_setup_tc_red(struct net_device *netdev, struct nfp_abm_link *alink, } } +static int +nfp_abm_setup_tc_mq(struct net_device *netdev, struct nfp_abm_link *alink, + struct tc_mq_qopt_offload *opt) +{ + switch (opt->command) { + case TC_MQ_CREATE: + nfp_abm_reset_root(netdev, alink, opt->handle, + alink->total_queues); + return 0; + case TC_MQ_DESTROY: + if (opt->handle == alink->parent) + nfp_abm_reset_root(netdev, alink, TC_H_ROOT, 0); + return 0; + default: + return -EOPNOTSUPP; + } +} + static int nfp_abm_setup_tc(struct nfp_app *app, struct net_device *netdev, enum tc_setup_type type, void *type_data) @@ -220,6 +309,8 @@ nfp_abm_setup_tc(struct nfp_app *app, struct net_device *netdev, return -EOPNOTSUPP; switch (type) { + case TC_SETUP_QDISC_MQ: + return nfp_abm_setup_tc_mq(netdev, repr->app_priv, type_data); case TC_SETUP_QDISC_RED: return nfp_abm_setup_tc_red(netdev, repr->app_priv, type_data); default: @@ -473,13 +564,21 @@ nfp_abm_vnic_alloc(struct nfp_app *app, struct nfp_net *nn, unsigned int id) alink->abm = abm; alink->vnic = nn; alink->id = id; + alink->parent = TC_H_ROOT; + alink->total_queues = alink->vnic->max_rx_rings; + alink->qdiscs = kvzalloc(sizeof(*alink->qdiscs) * alink->total_queues, + GFP_KERNEL); + if (!alink->qdiscs) { + err = -ENOMEM; + goto err_free_alink; + } /* This is a multi-host app, make sure MAC/PHY is up, but don't * make the MAC/PHY state follow the state of any of the ports. */ err = nfp_eth_set_configured(app->cpp, eth_port->index, true); if (err < 0) - goto err_free_alink; + goto err_free_qdiscs; netif_keep_dst(nn->dp.netdev); @@ -488,6 +587,8 @@ nfp_abm_vnic_alloc(struct nfp_app *app, struct nfp_net *nn, unsigned int id) return 0; +err_free_qdiscs: + kvfree(alink->qdiscs); err_free_alink: kfree(alink); return err; @@ -498,6 +599,7 @@ static void nfp_abm_vnic_free(struct nfp_app *app, struct nfp_net *nn) struct nfp_abm_link *alink = nn->app_priv; nfp_abm_kill_reprs(alink->abm, alink); + kvfree(alink->qdiscs); kfree(alink); } diff --git a/drivers/net/ethernet/netronome/nfp/abm/main.h b/drivers/net/ethernet/netronome/nfp/abm/main.h index 09fd15847961..934a70835473 100644 --- a/drivers/net/ethernet/netronome/nfp/abm/main.h +++ b/drivers/net/ethernet/netronome/nfp/abm/main.h @@ -106,6 +106,9 @@ struct nfp_red_qdisc { * @vnic: data vNIC * @id: id of the data vNIC * @queue_base: id of base to host queue within PCIe (not QC idx) + * @total_queues: number of PF queues + * @parent: handle of expected parent, i.e. handle of MQ, or TC_H_ROOT + * @num_qdiscs: number of currently used qdiscs * @qdiscs: array of qdiscs */ struct nfp_abm_link { @@ -113,16 +116,25 @@ struct nfp_abm_link { struct nfp_net *vnic; unsigned int id; unsigned int queue_base; - struct nfp_red_qdisc qdiscs[1]; + unsigned int total_queues; + u32 parent; + unsigned int num_qdiscs; + struct nfp_red_qdisc *qdiscs; }; void nfp_abm_ctrl_read_params(struct nfp_abm_link *alink); int nfp_abm_ctrl_find_addrs(struct nfp_abm *abm); int nfp_abm_ctrl_set_all_q_lvls(struct nfp_abm_link *alink, u32 val); +int nfp_abm_ctrl_set_q_lvl(struct nfp_abm_link *alink, unsigned int i, + u32 val); int nfp_abm_ctrl_read_stats(struct nfp_abm_link *alink, struct nfp_alink_stats *stats); +int nfp_abm_ctrl_read_q_stats(struct nfp_abm_link *alink, unsigned int i, + struct nfp_alink_stats *stats); int nfp_abm_ctrl_read_xstats(struct nfp_abm_link *alink, struct nfp_alink_xstats *xstats); +int nfp_abm_ctrl_read_q_xstats(struct nfp_abm_link *alink, unsigned int i, + struct nfp_alink_xstats *xstats); u64 nfp_abm_ctrl_stat_non_sto(struct nfp_abm_link *alink, unsigned int i); u64 nfp_abm_ctrl_stat_sto(struct nfp_abm_link *alink, unsigned int i); int nfp_abm_ctrl_qm_enable(struct nfp_abm *abm); From patchwork Sat May 26 04:53:37 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 920890 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=none (p=none dis=none) header.from=netronome.com 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="m0uNNQu7"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40t9mm0JhYz9s0y for ; Sat, 26 May 2018 14:55:52 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1031154AbeEZEzt (ORCPT ); Sat, 26 May 2018 00:55:49 -0400 Received: from mail-qk0-f193.google.com ([209.85.220.193]:40284 "EHLO mail-qk0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1031122AbeEZEzp (ORCPT ); Sat, 26 May 2018 00:55:45 -0400 Received: by mail-qk0-f193.google.com with SMTP id r66-v6so5656744qkr.7 for ; Fri, 25 May 2018 21:55:45 -0700 (PDT) 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=lMNoM7yl7Mw9jl+uj2NJ+paWjCougpA0u1UmNbDIFqg=; b=m0uNNQu7loCx8HBMFBZH7OE7wXLY+W6BFihSIInhHN8nD2emGku0gCHOvtB9TnUZ7U +ygOHJSEzsetkz2VbisDeJ8aMCdPIrP4E9us+kpAo6S07gQ4QGYMN8JLQpeU3TBeHPKR RYrJuRm+7DIcQCfv+24Be3UO7NzL0UyoHku8VKTEQOoEgxZ8c1eyc0f3vf/b8IZmsp0S SIna6L695QfomUMalki8P4+ttFyTSCrYS5aWefTKO9e0Jx2cAGgUlsJX2aLl4fF8pZNr 9zdgVAR/kzNgXxy68nLkfET20VdfL8gxi7KApVxle9nlGGHPfxvEe9Lqj+F66a+oyrpr C5Cw== 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=lMNoM7yl7Mw9jl+uj2NJ+paWjCougpA0u1UmNbDIFqg=; b=GL7ES5bruCblA4Aqwh1lQrcQ9pUL2Ch4kr4d9EcBl0BTExPPcuvrQfHbB5U88dhBF3 gHHtnKSWr3BXSE09Pw9FjVjjIUcxfHGIflktKqHm/ltjGEz5CdyL0il+hEHy86fxeBd0 Rv0HZrzQQeLAdIPDWLElzoHoolRRhmq3cfqcgkI9oS/D+VWThbjJfFtP4dArEp2ZGRA+ hUPTpT2xtb2+1Nbb44oDZ2vXQuVRkdJ/8w+sQo1i8YPMP30YLLKLmYAtsY7/wNzrjtq2 R5ORXGB2+fep2nppypmhMIbgKaFYfHMOi29o4edIJl0LfD5Kf0JInqddx9YRumOC7IjA JMLg== X-Gm-Message-State: ALKqPweO2gwyuTkbdddZw+sVCgY/GCxCm5DQpjkz2sDDalkg05l85Lg7 ph8gni+MSdz0G6BJcwqY8a6W4g== X-Google-Smtp-Source: ADUXVKJZ8vsyB+xYzNYWeRHD6HfQR57dCBJzWvF2y4KfAd+kVUvj23iVwiNBdtbyc5LKi9uEMtG4WA== X-Received: by 2002:a37:1fd4:: with SMTP id n81-v6mr4341044qkh.308.1527310544921; Fri, 25 May 2018 21:55:44 -0700 (PDT) Received: from jkicinski-Precision-T1700.netronome.com ([75.53.12.129]) by smtp.gmail.com with ESMTPSA id g16-v6sm17463754qtp.9.2018.05.25.21.55.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 25 May 2018 21:55:44 -0700 (PDT) From: Jakub Kicinski To: davem@davemloft.net Cc: jiri@resnulli.us, xiyou.wangcong@gmail.com, john.fastabend@gmail.com, netdev@vger.kernel.org, oss-drivers@netronome.com, alexei.starovoitov@gmail.com, nogahf@mellanox.com, yuvalm@mellanox.com, gerlitz.or@gmail.com, Jakub Kicinski Subject: [PATCH net-next 13/14] net: sched: mq: request stats from offloads Date: Fri, 25 May 2018 21:53:37 -0700 Message-Id: <20180526045338.10993-14-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180526045338.10993-1-jakub.kicinski@netronome.com> References: <20180526045338.10993-1-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org MQ doesn't hold any statistics on its own, however, statistic from offloads are requested starting from the root, hence MQ will read the old values for its sums. Call into the drivers, because of the additive nature of the stats drivers are aware of how much "pending updates" they have to children of the MQ. Since MQ reset its stats on every dump we can simply offset the stats, predicting how stats of offloaded children will change. Signed-off-by: Jakub Kicinski --- include/net/pkt_cls.h | 2 ++ net/sched/sch_mq.c | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h index 942f839dbca4..a3c1a2c47cd4 100644 --- a/include/net/pkt_cls.h +++ b/include/net/pkt_cls.h @@ -781,11 +781,13 @@ struct tc_qopt_offload_stats { enum tc_mq_command { TC_MQ_CREATE, TC_MQ_DESTROY, + TC_MQ_STATS, }; struct tc_mq_qopt_offload { enum tc_mq_command command; u32 handle; + struct tc_qopt_offload_stats stats; }; enum tc_red_command { diff --git a/net/sched/sch_mq.c b/net/sched/sch_mq.c index 6ccf6daa2503..d6b8ae4ed7a3 100644 --- a/net/sched/sch_mq.c +++ b/net/sched/sch_mq.c @@ -38,6 +38,22 @@ static int mq_offload(struct Qdisc *sch, enum tc_mq_command cmd) return dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_QDISC_MQ, &opt); } +static void mq_offload_stats(struct Qdisc *sch) +{ + struct net_device *dev = qdisc_dev(sch); + struct tc_mq_qopt_offload opt = { + .command = TC_MQ_STATS, + .handle = sch->handle, + .stats = { + .bstats = &sch->bstats, + .qstats = &sch->qstats, + }, + }; + + if (tc_can_offload(dev) && dev->netdev_ops->ndo_setup_tc) + dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_QDISC_MQ, &opt); +} + static void mq_destroy(struct Qdisc *sch) { struct net_device *dev = qdisc_dev(sch); @@ -146,6 +162,7 @@ static int mq_dump(struct Qdisc *sch, struct sk_buff *skb) sch->q.qlen += qdisc->q.qlen; sch->bstats.bytes += qdisc->bstats.bytes; sch->bstats.packets += qdisc->bstats.packets; + sch->qstats.qlen += qdisc->qstats.qlen; sch->qstats.backlog += qdisc->qstats.backlog; sch->qstats.drops += qdisc->qstats.drops; sch->qstats.requeues += qdisc->qstats.requeues; @@ -154,6 +171,7 @@ static int mq_dump(struct Qdisc *sch, struct sk_buff *skb) spin_unlock_bh(qdisc_lock(qdisc)); } + mq_offload_stats(sch); return 0; } From patchwork Sat May 26 04:53:38 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 920893 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=none (p=none dis=none) header.from=netronome.com 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="MWn0NR6G"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40t9mw0L73z9s16 for ; Sat, 26 May 2018 14:56:00 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1031160AbeEZEz6 (ORCPT ); Sat, 26 May 2018 00:55:58 -0400 Received: from mail-qk0-f182.google.com ([209.85.220.182]:46130 "EHLO mail-qk0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1031091AbeEZEzr (ORCPT ); Sat, 26 May 2018 00:55:47 -0400 Received: by mail-qk0-f182.google.com with SMTP id k86-v6so5644325qkh.13 for ; Fri, 25 May 2018 21:55:46 -0700 (PDT) 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=IrQRg8HDeGNNbdnT8JSQxvv3Ao2Z+APEumtaJWZkCmg=; b=MWn0NR6Gf8ytjiqfGi/frwvxevDyYco8DYhA1b7iqFU41MavUgR6ydyTetRalGkrcI ou6cfN8Le8DZ9211ixBgkgi8fHkJGWY8I5EyHE+ROaW43KQRcCd6l0jWHScqgjkTmbif PCGHD+AEG/4QJb2pG9ZOu5/3Jf9g0XSsAhyMvvEQBwbRdtkOSfBatB9bj6kLzx/OBRxd pRma4eRphZZAt6to80I6wuHif2xHTpBoOWy3y+kGBY6PCivW4jYJ9smMrVpQqEdBDs0j jN/MlQREe1+vZeI7QYD4UovcCjiLUVbRh0HJWw7DtgiUlBn4s9YRcfSKHp421tm32WHl I9fg== 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=IrQRg8HDeGNNbdnT8JSQxvv3Ao2Z+APEumtaJWZkCmg=; b=PsjRG08WvwEXA2rR1IGTOi2/MOeFkTQiwbdN7/L78KUxDJenGAjqtjbCMP2HH8k1F7 6jcm5KHxmTpZuRIsE1kks14cYzoChhNbjgt0eiZ6+4bjbmP5gOXZ89SlAEOoG1HrXumL walKu8Ba3TbfyhBiQgYQfeKmLaJLRqMnwsli2lTnLfzoVqnZcPyYt5511e4dGOhZ5Ao1 DBI5DRzUXV8g2MVwqHhrNw6YfLnsCUf6HLK3HgupTUN+XNOquX5QkBPSB8ZkODItiouV rOyjTMOzZsttfcN0ttjdBBWkOja3ZJ+MKdCmOf9v2V566QoG4NtpHs6H3BuIF352Nxrp cALQ== X-Gm-Message-State: ALKqPwcpsba9HVNffpiuNiRXzBBGBT+kPwGf2wUZlsGoBIuFfzkWnOVn A+g81WFhwXWAesxShyoNAHJ55A== X-Google-Smtp-Source: ADUXVKJYsR2a0j/kY0+lkM3Z0h5WshPsfEev1001BWMgP1gRWZCm7fG3KsBr9jgGPSss1LzDqSgMRQ== X-Received: by 2002:ae9:f405:: with SMTP id y5-v6mr4430100qkl.75.1527310546558; Fri, 25 May 2018 21:55:46 -0700 (PDT) Received: from jkicinski-Precision-T1700.netronome.com ([75.53.12.129]) by smtp.gmail.com with ESMTPSA id g16-v6sm17463754qtp.9.2018.05.25.21.55.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 25 May 2018 21:55:46 -0700 (PDT) From: Jakub Kicinski To: davem@davemloft.net Cc: jiri@resnulli.us, xiyou.wangcong@gmail.com, john.fastabend@gmail.com, netdev@vger.kernel.org, oss-drivers@netronome.com, alexei.starovoitov@gmail.com, nogahf@mellanox.com, yuvalm@mellanox.com, gerlitz.or@gmail.com, Jakub Kicinski Subject: [PATCH net-next 14/14] nfp: abm: report correct MQ stats Date: Fri, 25 May 2018 21:53:38 -0700 Message-Id: <20180526045338.10993-15-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180526045338.10993-1-jakub.kicinski@netronome.com> References: <20180526045338.10993-1-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Report the stat diff to make sure MQ stats add up to child stats. Signed-off-by: Jakub Kicinski Reviewed-by: Dirk van der Merwe --- drivers/net/ethernet/netronome/nfp/abm/main.c | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/net/ethernet/netronome/nfp/abm/main.c b/drivers/net/ethernet/netronome/nfp/abm/main.c index 21d5af1fb061..1561c2724c26 100644 --- a/drivers/net/ethernet/netronome/nfp/abm/main.c +++ b/drivers/net/ethernet/netronome/nfp/abm/main.c @@ -279,6 +279,28 @@ nfp_abm_setup_tc_red(struct net_device *netdev, struct nfp_abm_link *alink, } } +static int +nfp_abm_mq_stats(struct nfp_abm_link *alink, struct tc_mq_qopt_offload *opt) +{ + struct nfp_alink_stats stats; + unsigned int i; + int err; + + for (i = 0; i < alink->num_qdiscs; i++) { + if (alink->qdiscs[i].handle == TC_H_UNSPEC) + continue; + + err = nfp_abm_ctrl_read_q_stats(alink, i, &stats); + if (err) + return err; + + nfp_abm_update_stats(&stats, &alink->qdiscs[i].stats, + &opt->stats); + } + + return 0; +} + static int nfp_abm_setup_tc_mq(struct net_device *netdev, struct nfp_abm_link *alink, struct tc_mq_qopt_offload *opt) @@ -292,6 +314,8 @@ nfp_abm_setup_tc_mq(struct net_device *netdev, struct nfp_abm_link *alink, if (opt->handle == alink->parent) nfp_abm_reset_root(netdev, alink, TC_H_ROOT, 0); return 0; + case TC_MQ_STATS: + return nfp_abm_mq_stats(alink, opt); default: return -EOPNOTSUPP; }