From patchwork Sun Jan 14 11:33:13 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 860429 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=resnulli-us.20150623.gappssmtp.com header.i=@resnulli-us.20150623.gappssmtp.com header.b="DRnPQBCv"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zKDrT6Rt2z9s9Y for ; Sun, 14 Jan 2018 22:33:29 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751487AbeANLd0 (ORCPT ); Sun, 14 Jan 2018 06:33:26 -0500 Received: from mail-wm0-f66.google.com ([74.125.82.66]:35678 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751379AbeANLdW (ORCPT ); Sun, 14 Jan 2018 06:33:22 -0500 Received: by mail-wm0-f66.google.com with SMTP id r78so19574171wme.0 for ; Sun, 14 Jan 2018 03:33:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=3HOF0YOJLSVaW9y8vgvGHwcN4JBfqa5/TBGaSBvxvdA=; b=DRnPQBCvzKYAeP0W/YRO4JaKYuuNNrXTeIoGbzAXs2fMw4p67A5kFhC1QBHaww2ZOa vqD+7LqrR3Njfu+RmeY0xCrofQNhv5kOYLu8U1PmRP2NWJwfZ2YErk46ikmEby1P6ehj P97nVL9QSc7TglyHMTqkSINdlcoJfz00oXYX46sKEJBhh/sr67IwRU/ITaVUUtcxajRE 7W+yMW4VPnwX1/R9iyAs9eHcP8rkC3cgmGDv9+gG8j5kWWrxmOjGrK6QQ9GJM2Out10r yQt+jtTGKYQzKvHS82dnFwL438Ev8FJHeT0LBwf4+Nle+tsyB+f0pokfAx/rLXTnyDY/ szkA== 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=3HOF0YOJLSVaW9y8vgvGHwcN4JBfqa5/TBGaSBvxvdA=; b=NfZ+I8CC1mkHtytii41qzvtmSPf6Nhr/pRTMwY01HrHYrinsAQbVB4QCcJiQnvJhYi aITbJ75DSHc0sgFxi2wW7HKuvRS8JvOz9rExtWy9MASKDlSzsDiJgDug59DMF6JwsZth MzqLgy9bEcJ2gMoDyGzG6ayBoeWJz3wUw4RarXwpS5xyTxcgulm9nPTSgcamfH5xgv9f AI3Vf14dH9Ms9cVXchmMFI7j9H9iMZIgQ0n2CEcTFfF+eSX1McG+QX+4dfEGHxHWnbOw 9hnEFdUoXojzyGXxRrr90P5YJERialL2S50zWnLoucLJyZ2uRmPYcKd8yPyBFtv1yY+Z NxSQ== X-Gm-Message-State: AKwxytd9OoovucfzNftbXtjhmCmoidOQSejezEqnCdfMAB1NyWIqEiN4 YBmwZyyjXnhi0OC0cnzR0QHuZ1G+BgOHQA== X-Google-Smtp-Source: ACJfBotbYAIFVL8JTdSaZuOgpqpwEO5/9V+Za4aDC9OZmbeHg3TNdaccWY0RuWHq9UL425iWrZDuTQ== X-Received: by 10.28.213.143 with SMTP id m137mr7235414wmg.135.1515929601351; Sun, 14 Jan 2018 03:33:21 -0800 (PST) Received: from localhost (ip-160-218-244-106.eurotel.cz. [160.218.244.106]) by smtp.gmail.com with ESMTPSA id r1sm1301652wmg.22.2018.01.14.03.33.20 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 14 Jan 2018 03:33:20 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: nogahf@mellanox.com, yuvalm@mellanox.com, davem@davemloft.net, idosch@mellanox.com, mlxsw@mellanox.com, jhs@mojatatu.com, xiyou.wangcong@gmail.com, kubakici@wp.pl Subject: [patch net-next v2 1/5] mlxsw: reg: add rdpm register Date: Sun, 14 Jan 2018 12:33:13 +0100 Message-Id: <20180114113317.4706-2-jiri@resnulli.us> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180114113317.4706-1-jiri@resnulli.us> References: <20180114113317.4706-1-jiri@resnulli.us> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Yuval Mintz Add rdpm definition - router DSCP to priority mapping register. This register will be utilized later to align the default mapping between packet DSCP and switch-priority to the kernel's mapping between packet priority and skb priority. This is the first non-bit indexed register where the entries are arranged in descending order, i.e., entry at offset 0 matches configuration for dscp[63]. As a result, the item's step is converted into a signed variable to support descending arrays [where step would be negative]. Signed-off-by: Yuval Mintz Signed-off-by: Nogah Frankel Signed-off-by: Jiri Pirko --- drivers/net/ethernet/mellanox/mlxsw/item.h | 2 +- drivers/net/ethernet/mellanox/mlxsw/reg.h | 37 ++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/mellanox/mlxsw/item.h b/drivers/net/ethernet/mellanox/mlxsw/item.h index 28427f0758c7..31c886edc791 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/item.h +++ b/drivers/net/ethernet/mellanox/mlxsw/item.h @@ -42,7 +42,7 @@ struct mlxsw_item { unsigned short offset; /* bytes in container */ - unsigned short step; /* step in bytes for indexed items */ + short step; /* step in bytes for indexed items */ unsigned short in_step_offset; /* offset within one step */ unsigned char shift; /* shift in bits */ unsigned char element_size; /* size of element in bit array */ diff --git a/drivers/net/ethernet/mellanox/mlxsw/reg.h b/drivers/net/ethernet/mellanox/mlxsw/reg.h index 6c4e08b8058a..0e08be41c8e0 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/reg.h +++ b/drivers/net/ethernet/mellanox/mlxsw/reg.h @@ -4827,6 +4827,42 @@ static inline void mlxsw_reg_ratr_counter_pack(char *payload, u64 counter_index, mlxsw_reg_ratr_counter_set_type_set(payload, set_type); } +/* RDPM - Router DSCP to Priority Mapping + * -------------------------------------- + * Controls the mapping from DSCP field to switch priority on routed packets + */ +#define MLXSW_REG_RDPM_ID 0x8009 +#define MLXSW_REG_RDPM_BASE_LEN 0x00 +#define MLXSW_REG_RDPM_DSCP_ENTRY_REC_LEN 0x01 +#define MLXSW_REG_RDPM_DSCP_ENTRY_REC_MAX_COUNT 64 +#define MLXSW_REG_RDPM_LEN 0x40 +#define MLXSW_REG_RDPM_LAST_ENTRY (MLXSW_REG_RDPM_BASE_LEN + \ + MLXSW_REG_RDPM_LEN - \ + MLXSW_REG_RDPM_DSCP_ENTRY_REC_LEN) + +MLXSW_REG_DEFINE(rdpm, MLXSW_REG_RDPM_ID, MLXSW_REG_RDPM_LEN); + +/* reg_dscp_entry_e + * Enable update of the specific entry + * Access: Index + */ +MLXSW_ITEM8_INDEXED(reg, rdpm, dscp_entry_e, MLXSW_REG_RDPM_LAST_ENTRY, 7, 1, + -MLXSW_REG_RDPM_DSCP_ENTRY_REC_LEN, 0x00, false); + +/* reg_dscp_entry_prio + * Switch Priority + * Access: RW + */ +MLXSW_ITEM8_INDEXED(reg, rdpm, dscp_entry_prio, MLXSW_REG_RDPM_LAST_ENTRY, 0, 4, + -MLXSW_REG_RDPM_DSCP_ENTRY_REC_LEN, 0x00, false); + +static inline void mlxsw_reg_rdpm_pack(char *payload, unsigned short index, + u8 prio) +{ + mlxsw_reg_rdpm_dscp_entry_e_set(payload, index, 1); + mlxsw_reg_rdpm_dscp_entry_prio_set(payload, index, prio); +} + /* RICNT - Router Interface Counter Register * ----------------------------------------- * The RICNT register retrieves per port performance counters @@ -7640,6 +7676,7 @@ static const struct mlxsw_reg_info *mlxsw_reg_infos[] = { MLXSW_REG(rtar), MLXSW_REG(ratr), MLXSW_REG(rtdp), + MLXSW_REG(rdpm), MLXSW_REG(ricnt), MLXSW_REG(rrcr), MLXSW_REG(ralta), From patchwork Sun Jan 14 11:33:14 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 860430 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=resnulli-us.20150623.gappssmtp.com header.i=@resnulli-us.20150623.gappssmtp.com header.b="W8dSiEw5"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zKDrW30xDz9sBZ for ; Sun, 14 Jan 2018 22:33:31 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751565AbeANLd1 (ORCPT ); Sun, 14 Jan 2018 06:33:27 -0500 Received: from mail-wm0-f68.google.com ([74.125.82.68]:37615 "EHLO mail-wm0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750979AbeANLdY (ORCPT ); Sun, 14 Jan 2018 06:33:24 -0500 Received: by mail-wm0-f68.google.com with SMTP id f140so19383403wmd.2 for ; Sun, 14 Jan 2018 03:33:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=qXvndgLTM7nrEtLSl00UdlBONqbsoqxdc6okZgMsYkA=; b=W8dSiEw5yEtAEWYwH6GbUtkWUm0I6iu1OvkB/HN5EB6hwAfOzJx1E+X0neVpxLKj7X As1lJ7PNegZauYiylvhEGxnh8jsLUPtq4qNl9twwkfQDQOcHcopE/WimycQ49GHu4G2a xhhINPaeKfR+JtM2vERBXqj3Q9IA5OfBUEmr7FujqyxawrbAD+4UfsubVaP2mA/GCoSb QUQBU4MQkyGm6PHIh5vh6joEIYJUCqylmizCy2OfPS+5cb/IHSqN581Evvn+VWW5nZGL nqw7wR6ObmDoFIFBA/B7rvy2oftdpEsKGMzAPCwvPNaBWjgIuCWiUIOShkIvs9Ra27Z0 DD7w== 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=qXvndgLTM7nrEtLSl00UdlBONqbsoqxdc6okZgMsYkA=; b=aBMGo5H8WTS0mqNlLVhlfup4wsI+4U8DkAQZAI+ldbmLcXJu76tShR9UFkxlvw3EZm lBtNxiszePrFbpIG39p6X6HPI7t/2aeE/ToofPkvhDDALlDV3TVuGveh1M2D2/RzCRT1 LNmpdF421YvHS+AuN4/rv5yJBMjWdMHmAYHC+lIHVW3i55agKOWVPsixmzJhlZfnmUmn MOQt/jDw8FbhCTtW7OKVmxJo1GE6OhA1BFA72U7TYH1/4uxm0WkcBA4MLKFinX/ePZt8 xX79LvTshZWWXUGOfVmS69Js4keIJDNqCp1oXKoYyAgmMocjryWsfFaBk5rVREhuRI5F 8jQA== X-Gm-Message-State: AKwxytdD5T9jD2y+0hIasLWZUACh1vDOK6ciYU1N3TumpUWtgVsIIPvD vsEmdSyXPIgjgS/a8snVM0+hJE4OVO0zwA== X-Google-Smtp-Source: ACJfBovVKkr5SMwx0XlEn7T4iHUm1npcU14pjeF8yGogT84i25KrZouiP/QACbNLooZ3Nvu7kWRg0w== X-Received: by 10.28.66.150 with SMTP id k22mr8454972wmi.104.1515929603117; Sun, 14 Jan 2018 03:33:23 -0800 (PST) Received: from localhost (ip-160-218-244-106.eurotel.cz. [160.218.244.106]) by smtp.gmail.com with ESMTPSA id y23sm4565434wrc.24.2018.01.14.03.33.22 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 14 Jan 2018 03:33:22 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: nogahf@mellanox.com, yuvalm@mellanox.com, davem@davemloft.net, idosch@mellanox.com, mlxsw@mellanox.com, jhs@mojatatu.com, xiyou.wangcong@gmail.com, kubakici@wp.pl Subject: [patch net-next v2 2/5] mlxsw: spectrum_router: Configure default routing priority Date: Sun, 14 Jan 2018 12:33:14 +0100 Message-Id: <20180114113317.4706-3-jiri@resnulli.us> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180114113317.4706-1-jiri@resnulli.us> References: <20180114113317.4706-1-jiri@resnulli.us> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Yuval Mintz When routing ip packets, the kernel is setting the SKB's priority based on the tos field of the packet. Imitate this behavior in the mlxsw router, having the internal switch priority of a routed packet determined according to its DS field. Signed-off-by: Yuval Mintz Signed-off-by: Nogah Frankel Signed-off-by: Jiri Pirko --- .../net/ethernet/mellanox/mlxsw/spectrum_router.c | 24 ++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c index 7a136256b8f7..01ff5ba6796e 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c @@ -7011,6 +7011,24 @@ static int mlxsw_sp_mp_hash_init(struct mlxsw_sp *mlxsw_sp) } #endif +static int mlxsw_sp_dscp_init(struct mlxsw_sp *mlxsw_sp) +{ + char rdpm_pl[MLXSW_REG_RDPM_LEN]; + unsigned int i; + + MLXSW_REG_ZERO(rdpm, rdpm_pl); + + /* HW is determining switch priority based on DSCP-bits, but the + * kernel is still doing that based on the ToS. Since there's a + * mismatch in bits we need to make sure to translate the right + * value ToS would observe, skipping the 2 least-significant ECN bits. + */ + for (i = 0; i < MLXSW_REG_RDPM_DSCP_ENTRY_REC_MAX_COUNT; i++) + mlxsw_reg_rdpm_pack(rdpm_pl, i, rt_tos2priority(i << 2)); + + return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(rdpm), rdpm_pl); +} + static int __mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp) { char rgcr_pl[MLXSW_REG_RGCR_LEN]; @@ -7023,6 +7041,7 @@ static int __mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp) mlxsw_reg_rgcr_pack(rgcr_pl, true, true); mlxsw_reg_rgcr_max_router_interfaces_set(rgcr_pl, max_rifs); + mlxsw_reg_rgcr_usp_set(rgcr_pl, true); err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(rgcr), rgcr_pl); if (err) return err; @@ -7098,6 +7117,10 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp) if (err) goto err_mp_hash_init; + err = mlxsw_sp_dscp_init(mlxsw_sp); + if (err) + goto err_dscp_init; + mlxsw_sp->router->fib_nb.notifier_call = mlxsw_sp_router_fib_event; err = register_fib_notifier(&mlxsw_sp->router->fib_nb, mlxsw_sp_router_fib_dump_flush); @@ -7107,6 +7130,7 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp) return 0; err_register_fib_notifier: +err_dscp_init: err_mp_hash_init: unregister_netevent_notifier(&mlxsw_sp->router->netevent_nb); err_register_netevent_notifier: From patchwork Sun Jan 14 11:33:15 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 860434 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=resnulli-us.20150623.gappssmtp.com header.i=@resnulli-us.20150623.gappssmtp.com header.b="xiQ+4P6a"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zKDrz0wxfz9s83 for ; Sun, 14 Jan 2018 22:33:55 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751822AbeANLdw (ORCPT ); Sun, 14 Jan 2018 06:33:52 -0500 Received: from mail-wm0-f66.google.com ([74.125.82.66]:39233 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751441AbeANLdZ (ORCPT ); Sun, 14 Jan 2018 06:33:25 -0500 Received: by mail-wm0-f66.google.com with SMTP id i11so19385879wmf.4 for ; Sun, 14 Jan 2018 03:33:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=4rX+hloTOiv2tple1KgBXH5AlV9RjtBdnC3xO/b3Ukw=; b=xiQ+4P6aVymO9tTNOaULfNAWlWcUxC1FSrFpY6sENm0xpLYbhiIKmL2MHB+JzuhXzE R0HvaMi2rHWDkz6vnuC7cJ8NH08vCZT7zA/ImXd5JlDoXdCzdDrDnfjxdZ7oHkMkhDbG 0gaN0W0z5gB7uhzq/fQGH2dd7Zl1TmMqqGPFgoFMWV4tnTryWHjrzmrwodvNxICYn72I xNUI/arRw5L3rAxdE8AjgPQvmT8ESR+YR7kOGsqbxp3KSRx6BebG5EZuZyXrRCR0f0bg nC7ug8wlGqdTKjgpayehbxEhuPrewgrFfna2Uf7iUayDdiMY9U/Tj/nFek4uzQdRDj4V RNyA== 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=4rX+hloTOiv2tple1KgBXH5AlV9RjtBdnC3xO/b3Ukw=; b=MX/a2XEM7+F4d1eEmeyMnzmuA3rBkOGxIuMZ/wMCvYNeo5+s1+n8bXHchv1u9J011t iKKIS1dfL3wY3H7OxVqhKd5GdAbaulDoGDFtg8QAZ5Hk1V21pYAjxK0vAx0CQxYPh9E4 DkS83izyqDfojUSLKk6SBDWgC5+egRFlehWiAQhwZ6rbBDwt84BJvcSddGaxa/keOmf8 1kuYMkI8L4JNgwW/9RlDiHNaX+qkGyWIhOLwAa2wkZPTkBJt65uaQWHyFQdOQeZYF/Wq Dhs4eg+7UfNAv141drgZTCBkcSwBJ4UxVw9TwX0V/q2ds7YPrLRPjRRQ5Xzk5C7ZN2Yl uI6w== X-Gm-Message-State: AKwxytcGORS0mht0C+JekQgI0/OpaSmEm3FhjUERLoV4TvR8mYgxX1xU SVIhxpgEWWn43MqY6s7gMtGF4IqVYco6EA== X-Google-Smtp-Source: ACJfBoul1Nf1yxYlUrE5Mw3LXPyMtdDXhctMPmoFvTqRh6px48wuuh/CKUppsqJmAIoL4sARSnnxtQ== X-Received: by 10.28.146.16 with SMTP id u16mr8410499wmd.124.1515929604370; Sun, 14 Jan 2018 03:33:24 -0800 (PST) Received: from localhost (ip-160-218-244-106.eurotel.cz. [160.218.244.106]) by smtp.gmail.com with ESMTPSA id w133sm3277276wmg.5.2018.01.14.03.33.23 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 14 Jan 2018 03:33:24 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: nogahf@mellanox.com, yuvalm@mellanox.com, davem@davemloft.net, idosch@mellanox.com, mlxsw@mellanox.com, jhs@mojatatu.com, xiyou.wangcong@gmail.com, kubakici@wp.pl Subject: [patch net-next v2 3/5] net: sch: prio: Add offload ability to PRIO qdisc Date: Sun, 14 Jan 2018 12:33:15 +0100 Message-Id: <20180114113317.4706-4-jiri@resnulli.us> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180114113317.4706-1-jiri@resnulli.us> References: <20180114113317.4706-1-jiri@resnulli.us> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Nogah Frankel Add the ability to offload PRIO qdisc by using ndo_setup_tc. There are three commands for PRIO offloading: * TC_PRIO_REPLACE: handles set and tune * TC_PRIO_DESTROY: handles qdisc destroy * TC_PRIO_STATS: updates the qdiscs counters (given as reference) Like RED qdisc, the indication of whether PRIO is being offloaded is being set and updated as part of the dump function. It is so because the driver could decide to offload or not based on the qdisc parent, which could change without notifying the qdisc. Signed-off-by: Nogah Frankel Reviewed-by: Yuval Mintz Signed-off-by: Jiri Pirko --- include/linux/netdevice.h | 1 + include/net/pkt_cls.h | 25 ++++++++++++++++++++ net/sched/sch_prio.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index ef7b348e8498..6d95477b962c 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -780,6 +780,7 @@ enum tc_setup_type { TC_SETUP_BLOCK, TC_SETUP_QDISC_CBS, TC_SETUP_QDISC_RED, + TC_SETUP_QDISC_PRIO, }; /* 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 0d1343cba84c..9c341f003091 100644 --- a/include/net/pkt_cls.h +++ b/include/net/pkt_cls.h @@ -761,4 +761,29 @@ struct tc_red_qopt_offload { }; }; +enum tc_prio_command { + TC_PRIO_REPLACE, + TC_PRIO_DESTROY, + TC_PRIO_STATS, +}; + +struct tc_prio_qopt_offload_params { + int bands; + u8 priomap[TC_PRIO_MAX + 1]; + /* In case that a prio qdisc is offloaded and now is changed to a + * non-offloadedable config, it needs to update the backlog & qlen + * values to negate the HW backlog & qlen values (and only them). + */ + struct gnet_stats_queue *qstats; +}; + +struct tc_prio_qopt_offload { + enum tc_prio_command command; + u32 handle; + u32 parent; + union { + struct tc_prio_qopt_offload_params replace_params; + struct tc_qopt_offload_stats stats; + }; +}; #endif diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c index fe1510eb111f..a398502899a9 100644 --- a/net/sched/sch_prio.c +++ b/net/sched/sch_prio.c @@ -142,6 +142,31 @@ prio_reset(struct Qdisc *sch) sch->q.qlen = 0; } +static int prio_offload(struct Qdisc *sch, bool enable) +{ + struct prio_sched_data *q = qdisc_priv(sch); + struct net_device *dev = qdisc_dev(sch); + struct tc_prio_qopt_offload opt = { + .handle = sch->handle, + .parent = sch->parent, + }; + + if (!tc_can_offload(dev) || !dev->netdev_ops->ndo_setup_tc) + return -EOPNOTSUPP; + + if (enable) { + opt.command = TC_PRIO_REPLACE; + opt.replace_params.bands = q->bands; + memcpy(&opt.replace_params.priomap, q->prio2band, + TC_PRIO_MAX + 1); + opt.replace_params.qstats = &sch->qstats; + } else { + opt.command = TC_PRIO_DESTROY; + } + + return dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_QDISC_PRIO, &opt); +} + static void prio_destroy(struct Qdisc *sch) { @@ -149,6 +174,7 @@ prio_destroy(struct Qdisc *sch) struct prio_sched_data *q = qdisc_priv(sch); tcf_block_put(q->block); + prio_offload(sch, false); for (prio = 0; prio < q->bands; prio++) qdisc_destroy(q->queues[prio]); } @@ -204,6 +230,7 @@ static int prio_tune(struct Qdisc *sch, struct nlattr *opt, } sch_tree_unlock(sch); + prio_offload(sch, true); return 0; } @@ -223,15 +250,47 @@ static int prio_init(struct Qdisc *sch, struct nlattr *opt, return prio_tune(sch, opt, extack); } +static int prio_dump_offload(struct Qdisc *sch) +{ + struct net_device *dev = qdisc_dev(sch); + struct tc_prio_qopt_offload hw_stats = { + .handle = sch->handle, + .parent = sch->parent, + .command = TC_PRIO_STATS, + .stats.bstats = &sch->bstats, + .stats.qstats = &sch->qstats, + }; + int err; + + sch->flags &= ~TCQ_F_OFFLOADED; + if (!tc_can_offload(dev) || !dev->netdev_ops->ndo_setup_tc) + return 0; + + err = dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_QDISC_PRIO, + &hw_stats); + if (err == -EOPNOTSUPP) + return 0; + + if (!err) + sch->flags |= TCQ_F_OFFLOADED; + + return err; +} + static int prio_dump(struct Qdisc *sch, struct sk_buff *skb) { struct prio_sched_data *q = qdisc_priv(sch); unsigned char *b = skb_tail_pointer(skb); struct tc_prio_qopt opt; + int err; opt.bands = q->bands; memcpy(&opt.priomap, q->prio2band, TC_PRIO_MAX + 1); + err = prio_dump_offload(sch); + if (err) + goto nla_put_failure; + if (nla_put(skb, TCA_OPTIONS, sizeof(opt), &opt)) goto nla_put_failure; From patchwork Sun Jan 14 11:33:16 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 860431 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=resnulli-us.20150623.gappssmtp.com header.i=@resnulli-us.20150623.gappssmtp.com header.b="mMfhdXJP"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zKDrd2sFpz9s7h for ; Sun, 14 Jan 2018 22:33:37 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751759AbeANLdb (ORCPT ); Sun, 14 Jan 2018 06:33:31 -0500 Received: from mail-wm0-f65.google.com ([74.125.82.65]:39236 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751483AbeANLd1 (ORCPT ); Sun, 14 Jan 2018 06:33:27 -0500 Received: by mail-wm0-f65.google.com with SMTP id i11so19385922wmf.4 for ; Sun, 14 Jan 2018 03:33:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=da0rxNXhipNOpnghG3T3pG0LmnDUaYveLnvlaWga2i4=; b=mMfhdXJPF9sQXF3fEHr5idfkANp8tPPNGSGI3m42SnFaKwPaJdFLz4M3h77bFv4BDj 97yQxzuU+qk2Veid/1wiTdl8Q79z3N++OebNt49nDc0HCHf7Kr/5+jFmwwLGWDYHpRZC 10hD2g4kPhhdLBUi1QWj3tS+ANHB7qnpBMOAnsG7hler1dgmZrJFUfLyunK3PGgw/RkA 0kQu//gkPMwbEuqKPUT7VHXLa0VkJr5ujok8J31ULPciDsOmO3wgFirtpgp175HQ+W1l /mBnrt2DxeS2ah3k30sBG5aNhDSQXWaUgM7dMI+YKgK0+fJ0c06tv8GRRImVvfJq/R30 hqMA== 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=da0rxNXhipNOpnghG3T3pG0LmnDUaYveLnvlaWga2i4=; b=Z0jxtvyHTRqPHoBE0dJmcCT44cj/sghJhMxg6lCUE3LK28OOv0O3ugc0zQZEoPe5+a 9Wu4iREnq6fdu/EQyrooTxhQQFwClEDUq8aLUjPRVTXjhnSZLZQMeRLnxva6UJ9ox5hh O3ux3yLgMq9Xb2VT7WWK0KJTOhw2MIr+oscJgqtfW4v0dxlmFpUIIcyJr2+JV+valizS AuCS7YwqF0vllY1zXkOxuplmV9SJ1Dk1NJ413pXj8j1Q78cj5tEJDD4x+hz040BCOTfR DJNtPZn1InZZk0poGaSx79vZ//KI/I4FtGDDjAlnuqu/FNMLAPndFbbQIsdWU61gQ1oz 3pAQ== X-Gm-Message-State: AKwxyte0e0ZC5bY6baDeKgtwf8mUB1miGZcUg6iHZkICUeqfW5tfgLDV CltVmod65F2dX1iKZQiCh2NXLg6jr+qXqg== X-Google-Smtp-Source: ACJfBouWmEAykH7toOIV4rS5jNXegfOZQVmBEmLZdxcZiqC0TgdDR447mZZLpGz+q35KJj328F1HIw== X-Received: by 10.28.206.12 with SMTP id e12mr5770139wmg.73.1515929605866; Sun, 14 Jan 2018 03:33:25 -0800 (PST) Received: from localhost (ip-160-218-244-106.eurotel.cz. [160.218.244.106]) by smtp.gmail.com with ESMTPSA id u13sm19287833wre.52.2018.01.14.03.33.25 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 14 Jan 2018 03:33:25 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: nogahf@mellanox.com, yuvalm@mellanox.com, davem@davemloft.net, idosch@mellanox.com, mlxsw@mellanox.com, jhs@mojatatu.com, xiyou.wangcong@gmail.com, kubakici@wp.pl Subject: [patch net-next v2 4/5] mlxsw: spectrum: qdiscs: Support PRIO qdisc offload Date: Sun, 14 Jan 2018 12:33:16 +0100 Message-Id: <20180114113317.4706-5-jiri@resnulli.us> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180114113317.4706-1-jiri@resnulli.us> References: <20180114113317.4706-1-jiri@resnulli.us> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Nogah Frankel Add support for offloading PRIO qdisc as root qdisc. The support is for up to 8 bands. Routed packets priority is determined by the DSCP field with the default translations. Bridged packets priority is determined by the PCP field, if exist, otherwise it is set to 0. Since both options have only priorities 0-7, higher priorities mapping are being ignored. Signed-off-by: Nogah Frankel Reviewed-by: Yuval Mintz Signed-off-by: Jiri Pirko --- drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 2 + drivers/net/ethernet/mellanox/mlxsw/spectrum.h | 2 + .../net/ethernet/mellanox/mlxsw/spectrum_qdisc.c | 82 ++++++++++++++++++++++ 3 files changed, 86 insertions(+) diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c index 54c7d9202e81..f78bfe394966 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c @@ -1830,6 +1830,8 @@ static int mlxsw_sp_setup_tc(struct net_device *dev, enum tc_setup_type type, return mlxsw_sp_setup_tc_block(mlxsw_sp_port, type_data); case TC_SETUP_QDISC_RED: return mlxsw_sp_setup_tc_red(mlxsw_sp_port, type_data); + case TC_SETUP_QDISC_PRIO: + return mlxsw_sp_setup_tc_prio(mlxsw_sp_port, type_data); default: return -EOPNOTSUPP; } diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h index b6f475e83474..16f8fbda0891 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h @@ -565,6 +565,8 @@ int mlxsw_sp_tc_qdisc_init(struct mlxsw_sp_port *mlxsw_sp_port); void mlxsw_sp_tc_qdisc_fini(struct mlxsw_sp_port *mlxsw_sp_port); int mlxsw_sp_setup_tc_red(struct mlxsw_sp_port *mlxsw_sp_port, struct tc_red_qopt_offload *p); +int mlxsw_sp_setup_tc_prio(struct mlxsw_sp_port *mlxsw_sp_port, + struct tc_prio_qopt_offload *p); /* spectrum_fid.c */ int mlxsw_sp_fid_flood_set(struct mlxsw_sp_fid *fid, diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_qdisc.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_qdisc.c index 971f689dd833..4dd20540fe5e 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_qdisc.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_qdisc.c @@ -41,9 +41,12 @@ #include "spectrum.h" #include "reg.h" +#define MLXSW_SP_PRIO_BAND_TO_TCLASS(band) (IEEE_8021QAZ_MAX_TCS - band - 1) + enum mlxsw_sp_qdisc_type { MLXSW_SP_QDISC_NO_QDISC, MLXSW_SP_QDISC_RED, + MLXSW_SP_QDISC_PRIO, }; struct mlxsw_sp_qdisc_ops { @@ -403,6 +406,85 @@ int mlxsw_sp_setup_tc_red(struct mlxsw_sp_port *mlxsw_sp_port, } } +static int +mlxsw_sp_qdisc_prio_destroy(struct mlxsw_sp_port *mlxsw_sp_port, + struct mlxsw_sp_qdisc *mlxsw_sp_qdisc) +{ + int i; + + for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) + mlxsw_sp_port_prio_tc_set(mlxsw_sp_port, i, + MLXSW_SP_PORT_DEFAULT_TCLASS); + + return 0; +} + +static int +mlxsw_sp_qdisc_prio_check_params(struct mlxsw_sp_port *mlxsw_sp_port, + struct mlxsw_sp_qdisc *mlxsw_sp_qdisc, + void *params) +{ + struct tc_prio_qopt_offload_params *p = params; + + if (p->bands > IEEE_8021QAZ_MAX_TCS) + return -EOPNOTSUPP; + + return 0; +} + +static int +mlxsw_sp_qdisc_prio_replace(struct mlxsw_sp_port *mlxsw_sp_port, + struct mlxsw_sp_qdisc *mlxsw_sp_qdisc, + void *params) +{ + struct tc_prio_qopt_offload_params *p = params; + int tclass, i; + int err; + + for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) { + tclass = MLXSW_SP_PRIO_BAND_TO_TCLASS(p->priomap[i]); + err = mlxsw_sp_port_prio_tc_set(mlxsw_sp_port, i, tclass); + if (err) + return err; + } + + return 0; +} + +static struct mlxsw_sp_qdisc_ops mlxsw_sp_qdisc_ops_prio = { + .type = MLXSW_SP_QDISC_PRIO, + .check_params = mlxsw_sp_qdisc_prio_check_params, + .replace = mlxsw_sp_qdisc_prio_replace, + .destroy = mlxsw_sp_qdisc_prio_destroy, +}; + +int mlxsw_sp_setup_tc_prio(struct mlxsw_sp_port *mlxsw_sp_port, + struct tc_prio_qopt_offload *p) +{ + struct mlxsw_sp_qdisc *mlxsw_sp_qdisc; + + if (p->parent != TC_H_ROOT) + return -EOPNOTSUPP; + + mlxsw_sp_qdisc = mlxsw_sp_port->root_qdisc; + if (p->command == TC_PRIO_REPLACE) + return mlxsw_sp_qdisc_replace(mlxsw_sp_port, p->handle, + mlxsw_sp_qdisc, + &mlxsw_sp_qdisc_ops_prio, + &p->replace_params); + + if (!mlxsw_sp_qdisc_compare(mlxsw_sp_qdisc, p->handle, + MLXSW_SP_QDISC_PRIO)) + return -EOPNOTSUPP; + + switch (p->command) { + case TC_PRIO_DESTROY: + return mlxsw_sp_qdisc_destroy(mlxsw_sp_port, mlxsw_sp_qdisc); + default: + return -EOPNOTSUPP; + } +} + int mlxsw_sp_tc_qdisc_init(struct mlxsw_sp_port *mlxsw_sp_port) { mlxsw_sp_port->root_qdisc = kzalloc(sizeof(*mlxsw_sp_port->root_qdisc), From patchwork Sun Jan 14 11:33:17 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 860433 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=resnulli-us.20150623.gappssmtp.com header.i=@resnulli-us.20150623.gappssmtp.com header.b="ZhHxBnk5"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zKDrk5c8Cz9s7h for ; Sun, 14 Jan 2018 22:33:42 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751799AbeANLde (ORCPT ); Sun, 14 Jan 2018 06:33:34 -0500 Received: from mail-wr0-f196.google.com ([209.85.128.196]:34946 "EHLO mail-wr0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750979AbeANLd2 (ORCPT ); Sun, 14 Jan 2018 06:33:28 -0500 Received: by mail-wr0-f196.google.com with SMTP id g38so5851730wrd.2 for ; Sun, 14 Jan 2018 03:33:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=77Dr/aqL71HXrqEs+bvQhfDHsS2rTssRr8M/LWfCVN8=; b=ZhHxBnk5bh2T9LLUGSJaGoUjfsLylR5X29Js80/j8BCyyLZQ74mNGyN12AgmSo1vWF EnsRdmGv7VkFm/psVo8W0YMVWPnD875mor/gJ50afCQaG+bwmA0pOOGFOZ4XoVY1CfS0 9l5glYaQ4Ym/TOZzvj6+ysio73ZmOW/oq8RJRzkaK/PSgvuCmZBfMcqnMF6R6ZUSF107 kbDD+Q2Ubp2ax98SdjKfjh+jUg0Sep/lfkDeMSl0jlwR/MkI0yEBDxZtKHnJjDTab/eG +fWF7gswteYPto7bUdYFD7G60Jl4VCRz0eCoSmvqweltfFvAdBaTTcVeQ4JvEpiUSU0z h9Tw== 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=77Dr/aqL71HXrqEs+bvQhfDHsS2rTssRr8M/LWfCVN8=; b=ObO6ReXkZ28shUY3hJd2k5Jay+7yd4s3rDI9BnHRhFqRHcdEe9LEk4i8yyW55hTv96 3T1+awiRMBzOqjT/NaIkY56nRVE1qTX6TM1IW/w3/WGS2WXKE4VrkSjMK7NAtmyH+7kO /3UfDOkqzP/p7l6gGbohYAQGG6qj9GKU9kCpN+vA5yJI2gn7cxdk9O/4i/Dr/eiKj6NF H8OBltssomIrRmLavIV6L/iLuXVuWUfkkPhjDxmv2nUWWIf7B7aDpSWa4goWP6ES1RXE F2CwFTsk/KuFvzMYhP3NzR7+HeAVD2eIWU7gzbY4Mhfju4imEHw/XWtkbNlQulp2pbvo q1PQ== X-Gm-Message-State: AKwxytefdvO0XjiK1NWBUrsMWoFa26UWg3VkVMYFYWJrX8S5mzX5Wql1 CkssFOOT5qs8Ut3iXxUs52hurK4vuFO8pA== X-Google-Smtp-Source: ACJfBotnXoiTZ22ZnduZL6dWsuhS9489qLBpypUF0gFhKypAbakDDU0dWKh+v1BeMQGW7zxuNMCKJw== X-Received: by 10.223.151.140 with SMTP id s12mr1162071wrb.80.1515929607426; Sun, 14 Jan 2018 03:33:27 -0800 (PST) Received: from localhost (ip-160-218-244-106.eurotel.cz. [160.218.244.106]) by smtp.gmail.com with ESMTPSA id 58sm6872543wru.56.2018.01.14.03.33.26 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 14 Jan 2018 03:33:27 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: nogahf@mellanox.com, yuvalm@mellanox.com, davem@davemloft.net, idosch@mellanox.com, mlxsw@mellanox.com, jhs@mojatatu.com, xiyou.wangcong@gmail.com, kubakici@wp.pl Subject: [patch net-next v2 5/5] mlxsw: spectrum: qdiscs: Support stats for PRIO qdisc Date: Sun, 14 Jan 2018 12:33:17 +0100 Message-Id: <20180114113317.4706-6-jiri@resnulli.us> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180114113317.4706-1-jiri@resnulli.us> References: <20180114113317.4706-1-jiri@resnulli.us> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Nogah Frankel Support basic stats for PRIO qdisc, which includes tx packets and bytes count, drops count and backlog size. The rest of the stats are irrelevant for this qdisc offload. Since backlog is not only incremental but reflecting momentary value, in case of a qdisc that stops being offloaded but is not destroyed, backlog value needs to be updated about the un-offloading. For that reason an unoffload function is being added to the ops struct. Signed-off-by: Nogah Frankel Reviewed-by: Yuval Mintz Signed-off-by: Jiri Pirko --- .../net/ethernet/mellanox/mlxsw/spectrum_qdisc.c | 89 ++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_qdisc.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_qdisc.c index 4dd20540fe5e..e11a0abfc663 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_qdisc.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_qdisc.c @@ -66,6 +66,11 @@ struct mlxsw_sp_qdisc_ops { void *xstats_ptr); void (*clean_stats)(struct mlxsw_sp_port *mlxsw_sp_port, struct mlxsw_sp_qdisc *mlxsw_sp_qdisc); + /* unoffload - to be used for a qdisc that stops being offloaded without + * being destroyed. + */ + void (*unoffload)(struct mlxsw_sp_port *mlxsw_sp_port, + struct mlxsw_sp_qdisc *mlxsw_sp_qdisc, void *params); }; struct mlxsw_sp_qdisc { @@ -79,6 +84,7 @@ struct mlxsw_sp_qdisc { u64 tx_packets; u64 drops; u64 overlimits; + u64 backlog; } stats_base; struct mlxsw_sp_qdisc_ops *ops; @@ -144,6 +150,9 @@ mlxsw_sp_qdisc_replace(struct mlxsw_sp_port *mlxsw_sp_port, u32 handle, err_bad_param: err_config: + if (mlxsw_sp_qdisc->handle == handle && ops->unoffload) + ops->unoffload(mlxsw_sp_port, mlxsw_sp_qdisc, params); + mlxsw_sp_qdisc_destroy(mlxsw_sp_port, mlxsw_sp_qdisc); return err; } @@ -451,11 +460,88 @@ mlxsw_sp_qdisc_prio_replace(struct mlxsw_sp_port *mlxsw_sp_port, return 0; } +void +mlxsw_sp_qdisc_prio_unoffload(struct mlxsw_sp_port *mlxsw_sp_port, + struct mlxsw_sp_qdisc *mlxsw_sp_qdisc, + void *params) +{ + struct tc_prio_qopt_offload_params *p = params; + u64 backlog; + + backlog = mlxsw_sp_cells_bytes(mlxsw_sp_port->mlxsw_sp, + mlxsw_sp_qdisc->stats_base.backlog); + p->qstats->backlog -= backlog; +} + +static int +mlxsw_sp_qdisc_get_prio_stats(struct mlxsw_sp_port *mlxsw_sp_port, + struct mlxsw_sp_qdisc *mlxsw_sp_qdisc, + struct tc_qopt_offload_stats *stats_ptr) +{ + u64 tx_bytes, tx_packets, drops = 0, backlog = 0; + struct mlxsw_sp_qdisc_stats *stats_base; + struct mlxsw_sp_port_xstats *xstats; + struct rtnl_link_stats64 *stats; + int i; + + xstats = &mlxsw_sp_port->periodic_hw_stats.xstats; + stats = &mlxsw_sp_port->periodic_hw_stats.stats; + stats_base = &mlxsw_sp_qdisc->stats_base; + + tx_bytes = stats->tx_bytes - stats_base->tx_bytes; + tx_packets = stats->tx_packets - stats_base->tx_packets; + + for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) { + drops += xstats->tail_drop[i]; + backlog += xstats->backlog[i]; + } + drops = drops - stats_base->drops; + + _bstats_update(stats_ptr->bstats, tx_bytes, tx_packets); + stats_ptr->qstats->drops += drops; + stats_ptr->qstats->backlog += + mlxsw_sp_cells_bytes(mlxsw_sp_port->mlxsw_sp, + backlog) - + mlxsw_sp_cells_bytes(mlxsw_sp_port->mlxsw_sp, + stats_base->backlog); + stats_base->backlog = backlog; + stats_base->drops += drops; + stats_base->tx_bytes += tx_bytes; + stats_base->tx_packets += tx_packets; + return 0; +} + +static void +mlxsw_sp_setup_tc_qdisc_prio_clean_stats(struct mlxsw_sp_port *mlxsw_sp_port, + struct mlxsw_sp_qdisc *mlxsw_sp_qdisc) +{ + struct mlxsw_sp_qdisc_stats *stats_base; + struct mlxsw_sp_port_xstats *xstats; + struct rtnl_link_stats64 *stats; + int i; + + xstats = &mlxsw_sp_port->periodic_hw_stats.xstats; + stats = &mlxsw_sp_port->periodic_hw_stats.stats; + stats_base = &mlxsw_sp_qdisc->stats_base; + + stats_base->tx_packets = stats->tx_packets; + stats_base->tx_bytes = stats->tx_bytes; + + stats_base->drops = 0; + for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) + stats_base->drops += xstats->tail_drop[i]; + + mlxsw_sp_qdisc->stats_base.backlog = 0; +} + static struct mlxsw_sp_qdisc_ops mlxsw_sp_qdisc_ops_prio = { .type = MLXSW_SP_QDISC_PRIO, .check_params = mlxsw_sp_qdisc_prio_check_params, .replace = mlxsw_sp_qdisc_prio_replace, + .unoffload = mlxsw_sp_qdisc_prio_unoffload, .destroy = mlxsw_sp_qdisc_prio_destroy, + .get_stats = mlxsw_sp_qdisc_get_prio_stats, + .clean_stats = mlxsw_sp_setup_tc_qdisc_prio_clean_stats, }; int mlxsw_sp_setup_tc_prio(struct mlxsw_sp_port *mlxsw_sp_port, @@ -480,6 +566,9 @@ int mlxsw_sp_setup_tc_prio(struct mlxsw_sp_port *mlxsw_sp_port, switch (p->command) { case TC_PRIO_DESTROY: return mlxsw_sp_qdisc_destroy(mlxsw_sp_port, mlxsw_sp_qdisc); + case TC_PRIO_STATS: + return mlxsw_sp_qdisc_get_stats(mlxsw_sp_port, mlxsw_sp_qdisc, + &p->stats); default: return -EOPNOTSUPP; }