From patchwork Thu Jul 22 15:55:38 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Oltean X-Patchwork-Id: 484294 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, MSGID_FROM_MTA_HEADER, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5AFB8C6377D for ; Thu, 22 Jul 2021 15:56:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3C68D6128A for ; Thu, 22 Jul 2021 15:56:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232715AbhGVPPf (ORCPT ); Thu, 22 Jul 2021 11:15:35 -0400 Received: from mail-eopbgr40086.outbound.protection.outlook.com ([40.107.4.86]:15366 "EHLO EUR03-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S232654AbhGVPPb (ORCPT ); Thu, 22 Jul 2021 11:15:31 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=G0JWspTbUuMNaazEf27b2FeGYYwXNoILq6GfxRIALp7kTa2SWHTbcBelvd/3opMYWoYzoOrK8/68Js4G1+KfZqgG+yPxWVcbfPuevLbXo0Sb5k46hWV4bqqPU+OcYUzhvPFRDqRUTki0/NTiJQuhoKzBtDNVbg9t7n8N6NkcdZOoLCCvgJI+L2rsE6R5tq7sZsT+JKtVZcHpRaRw1EXpLjFxxfEPpFXbpUJOCJccpD+hN2gvYvkvI3grBpAtHvZ5xvQIOSOiHuVtPPLaNTDMSWcOcn/azsqEQhK+KPbrrEptPCIWltHdP2dQQXmrmusCbpygo3Wf/9vsUKY+ri/5xA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=vQ0Lgp2ShHFERYxxM/ceeNDHOhJDkW+YYNtp+/AnMno=; b=gKI6f1kVPmVVZXPGFY5U5oOy0crtP9vgWJSNyKi8jOBW4gtUTHBhtocoa5V5yNTF6darOdIdbURe5xA1cWteAD2OZRdC7DUbrbf/wpBeyYMxee3PkDbZQp1jbPu/mQkpcfqchwZN6yGmlkUVZc6S8d44BgEPOkTsWc9o0nzYlvohRXziE3qpIQj5VZU4155iTPoaSxoY118pzNvyq306JMeHRPCxtaCGHr1yx6DGZAwVntS2SOi7rQbhh4UuG1kPM1aVSsm8Eo2xeHvDGOmjuSLU2ISGaWx0dglqR3rCSVvBR8uw+YBV+790s4b2s5qIdlVzu+NQJLzngIAGM0pR1g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=vQ0Lgp2ShHFERYxxM/ceeNDHOhJDkW+YYNtp+/AnMno=; b=TVE8JmyZeT/rKVk7FEGTjRamNRrLutBccXs0m+dlXaZoJT9ApZylmoTwd8q7FVLniEqghxY0xqchiQPvyq+dZlQx5ovQBESIQrOhYbSgaT1mwMtxO0j21RiuoI1nxGfUhYD1rQGNqq4HktYu0pfwBAQsoOsNn/1aJXJQiBO0qtI= Authentication-Results: vger.kernel.org; dkim=none (message not signed) header.d=none; vger.kernel.org; dmarc=none action=none header.from=nxp.com; Received: from VI1PR04MB5136.eurprd04.prod.outlook.com (2603:10a6:803:55::19) by VE1PR04MB6639.eurprd04.prod.outlook.com (2603:10a6:803:129::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4331.26; Thu, 22 Jul 2021 15:56:03 +0000 Received: from VI1PR04MB5136.eurprd04.prod.outlook.com ([fe80::109:1995:3e6b:5bd0]) by VI1PR04MB5136.eurprd04.prod.outlook.com ([fe80::109:1995:3e6b:5bd0%2]) with mapi id 15.20.4352.026; Thu, 22 Jul 2021 15:56:03 +0000 From: Vladimir Oltean To: netdev@vger.kernel.org, Jakub Kicinski , "David S. Miller" Cc: Andrew Lunn , Florian Fainelli , Vivien Didelot , Jiri Pirko , Ido Schimmel , Tobias Waldekranz , Roopa Prabhu , Nikolay Aleksandrov , Stephen Hemminger , bridge@lists.linux-foundation.org, Grygorii Strashko , Marek Behun , DENG Qingfang Subject: [PATCH v5 net-next 1/5] net: bridge: switchdev: allow the TX data plane forwarding to be offloaded Date: Thu, 22 Jul 2021 18:55:38 +0300 Message-Id: <20210722155542.2897921-2-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210722155542.2897921-1-vladimir.oltean@nxp.com> References: <20210722155542.2897921-1-vladimir.oltean@nxp.com> X-ClientProxiedBy: AM3PR07CA0099.eurprd07.prod.outlook.com (2603:10a6:207:6::33) To VI1PR04MB5136.eurprd04.prod.outlook.com (2603:10a6:803:55::19) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from localhost.localdomain (82.76.66.29) by AM3PR07CA0099.eurprd07.prod.outlook.com (2603:10a6:207:6::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4373.9 via Frontend Transport; Thu, 22 Jul 2021 15:56:02 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 91038525-9339-43cf-ffdc-08d94d293550 X-MS-TrafficTypeDiagnostic: VE1PR04MB6639: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:8273; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 95wM82zpyPdn+dwAHsuwExBHmtvypqa0TDa+1FRruiJaLgbI5zqmENzuUtPQxjrGUrtdBPtWB6p50kk+cgvferOOn90YA5Lhst9Jml48r8F4hfqFGbCICNbH2+daybUlqoRww5XdCjJcDQL3W8CRbHwZ0cr/ymhvI6dGR/McmFBnT6DUNUpmFMZ7ehZucilLLyiX4RJRA0yRzjPFnmphI5g+C9YlaqZ29ymezcF1u3fvto3bt+p+owFjHOzAYNLa9yS16XqI9tHOafXrxjtTLWqWBrLUdNDpFcFvyNE+H5II624DffJXqNtSX4ZbS4b6Cb4tVH9unBBcJyJ/Uwx7TpNBKuADsEsE8+E5Sv1FoCGCgsIRGZEjQSU7iy9kBbPCWGKoK0KOog+rxCMntJOlDEjfRaCtWFwqf+Rx2I/6ylwE+lzUP1786I40EsMYSIpP5r9uWGXhCKImxmz9NDaSHn+bbCW526gsIfTpCww4bZkgfA7Vljn8GEVnJS7TtmXN6afdYD5D0Jv6aZc9Tcc348BR84Z2mHo29DrOMqjoqoFDH/w82coos0Islodwg96t7lXZsy7x5Scdy9xXuEPtFQR1Hq1LX3tgFkIpoWOuPIFoMalorSyC82OMGs+DjEjs8jLCFI6XTd2Jfzm8IZfEeCn74yfT6mMkGZB6Zt6kWzkGlR6WZAnL8Tf1+ieu9jiZEG2yeRiuSx0DvrAGtRbQLA== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:VI1PR04MB5136.eurprd04.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(39860400002)(376002)(136003)(366004)(346002)(396003)(110136005)(6506007)(1076003)(4326008)(8936002)(478600001)(52116002)(83380400001)(6486002)(6666004)(36756003)(44832011)(66556008)(38350700002)(30864003)(66946007)(316002)(38100700002)(86362001)(5660300002)(8676002)(26005)(7416002)(54906003)(66476007)(956004)(6512007)(2906002)(2616005)(186003); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: JJXM6vqQvzXzO2/bpmvgE5eLTZbeIfAFBmRHX46ZMwfi14l6YvxGa1CHa1gS+1121IXUzp8l4orySZMaSSV0e5Yw8J0RPiSoqhxTDORJMinPAxQWamMNij7ALGlai81YBwbvr6LrHCmv4hIGf11ZkRuVvOyNxdeKsDScE4CQpDO4b8P4XtpQJ+eGkUyTVN2JCqZ0DWGvoC6luntVrEreckmLX0GAk56RTljxIHEsQDF50kV8wFxHTGiv0THV9ImUiYVSr5TzzJP1CTwkkqmzuMOvgNy53Fj4RcM8l0OfQcs1cOrN/sNXKTrgUQWNZW6yV4l/xGhElsoIEBDRcdRJuDwu/XFrWQO3Dmi0hQY5ipigFNKMl8LLF/m3jYoPEZyakCgw1fktb/uwQ45YK1nvtP4vZvttm3LtzOKfI7rzO/tXs9rvn3bNnesCseeQxowKS1mZyVWhC2oNeraKfcDpgkXyDvhajT8RbXmhd7lk07mphgPXy8sVoJxIlj9l8Jd4iBWg1WZe9kskWnvKeJoP3cyr9Syv11L1k+qLIgVH4BXiVlCFDEeCQO98iZji+RUasgZBE3PL+t2pSbXfsYUp3hIiTsGNW5QAppksjMChNzXy1vMdrooBd9HuSzqbG6RGoe8bZDD3YLVsCftQTAaVIRl4hQxPFSChOW5rUpfz00+740hJvfM3iPBjx9OU4iaXya+EpHx0UDfhnZEUh35sU1dTLqMM9j5CHewxuS0kSsIssJkd5b7gLfngZxfkw9AyOeLoJK+feQC2LtLSaZkA15pM1grCSkXyYjQ9WtuvMlgCE0pQq8EBNavtTNOhSW+fY/CV0FoNyk9Qje7zujX2A9eqt4lOE69BUdEzCJf/jzRvjjd7uhdSrXW0JEm28D9GHZFSI0EA2r1D73NwjEK6PpHGhT8UfhnTlRgyNO82kn+OydqCPlR09wFwJzUgiQzCJYlquApSzZXKfPZmjBGeNNcgnmY5ETVgdSRGKWGDyBWCm6vnqYYkpAdbeVJudfzitHRivHBt0GugRw+b2+kGtbFHkyJCbX1FEZt3EEq/o7zog0LgGDhPwnQDM6HDT9BdeH4ZnuCF2P+35mCbPt0mkPVt45S2VHfV6jzgmLg1yiCc67SNJO5ERf7YVwl1m8nxDEyHb2X8scr61hFW5lIPY9UM2cOOtxuQPkSTR4gxvYCD0xyNJiWQjVkuCyk3kxqj3Rh9qip4dAM+FMg6pM19qX8ZLntJkFsIqvgRUIU8xSOgQczwSELfINlnHXouIsRoqoj8RXf+/uzPisWUec1S8+qdoKCSvE2j8jNNPXm1wjO2t/jr4ibk3AH9LseS/xr1 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 91038525-9339-43cf-ffdc-08d94d293550 X-MS-Exchange-CrossTenant-AuthSource: VI1PR04MB5136.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jul 2021 15:56:03.5183 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: xMdlW6waFOxg6Njxx0NZpv2aHgQcwy/9GQz2bh1ls9UsnCWZKm1OcAyFl/98t8ddBvikUE3nwm3B7D67onGrAQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: VE1PR04MB6639 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Tobias Waldekranz Allow switchdevs to forward frames from the CPU in accordance with the bridge configuration in the same way as is done between bridge ports. This means that the bridge will only send a single skb towards one of the ports under the switchdev's control, and expects the driver to deliver the packet to all eligible ports in its domain. Primarily this improves the performance of multicast flows with multiple subscribers, as it allows the hardware to perform the frame replication. The basic flow between the driver and the bridge is as follows: - When joining a bridge port, the switchdev driver calls switchdev_bridge_port_offload() with tx_fwd_offload = true. - The bridge sends offloadable skbs to one of the ports under the switchdev's control using skb->offload_fwd_mark = true. - The switchdev driver checks the skb->offload_fwd_mark field and lets its FDB lookup select the destination port mask for this packet. v1->v2: - convert br_input_skb_cb::fwd_hwdoms to a plain unsigned long - introduce a static key "br_switchdev_fwd_offload_used" to minimize the impact of the newly introduced feature on all the setups which don't have hardware that can make use of it - introduce a check for nbp->flags & BR_FWD_OFFLOAD to optimize cache line access - reorder nbp_switchdev_frame_mark_accel() and br_handle_vlan() in __br_forward() - do not strip VLAN on egress if forwarding offload on VLAN-aware bridge is being used - propagate errors from .ndo_dfwd_add_station() if not EOPNOTSUPP v2->v3: - replace the solution based on .ndo_dfwd_add_station with a solution based on switchdev_bridge_port_offload - rename BR_FWD_OFFLOAD to BR_TX_FWD_OFFLOAD v3->v4: rebase v4->v5: - make sure the static key is decremented on bridge port unoffload - more function and variable renaming and comments for them: br_switchdev_fwd_offload_used to br_switchdev_tx_fwd_offload br_switchdev_accels_skb to br_switchdev_frame_uses_tx_fwd_offload nbp_switchdev_frame_mark_tx_fwd to nbp_switchdev_frame_mark_tx_fwd_to_hwdom nbp_switchdev_frame_mark_accel to nbp_switchdev_frame_mark_tx_fwd_offload fwd_accel to tx_fwd_offload Signed-off-by: Tobias Waldekranz Signed-off-by: Vladimir Oltean Reviewed-by: Florian Fainelli --- .../ethernet/freescale/dpaa2/dpaa2-switch.c | 2 +- .../marvell/prestera/prestera_switchdev.c | 2 +- .../mellanox/mlxsw/spectrum_switchdev.c | 2 +- .../microchip/sparx5/sparx5_switchdev.c | 2 +- drivers/net/ethernet/mscc/ocelot_net.c | 2 +- drivers/net/ethernet/rocker/rocker_ofdpa.c | 2 +- drivers/net/ethernet/ti/am65-cpsw-nuss.c | 2 +- drivers/net/ethernet/ti/cpsw_new.c | 2 +- include/linux/if_bridge.h | 3 + net/bridge/br_forward.c | 9 +++ net/bridge/br_private.h | 31 +++++++++ net/bridge/br_switchdev.c | 68 +++++++++++++++++-- net/bridge/br_vlan.c | 10 ++- net/dsa/port.c | 2 +- 14 files changed, 125 insertions(+), 14 deletions(-) diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c index 2138239facfd..5a09f85b7742 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c @@ -1936,7 +1936,7 @@ static int dpaa2_switch_port_bridge_join(struct net_device *netdev, err = switchdev_bridge_port_offload(netdev, netdev, NULL, &dpaa2_switch_port_switchdev_nb, &dpaa2_switch_port_switchdev_blocking_nb, - extack); + false, extack); if (err) goto err_switchdev_offload; diff --git a/drivers/net/ethernet/marvell/prestera/prestera_switchdev.c b/drivers/net/ethernet/marvell/prestera/prestera_switchdev.c index 7fe1287228e5..be01ec8284e6 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera_switchdev.c +++ b/drivers/net/ethernet/marvell/prestera/prestera_switchdev.c @@ -502,7 +502,7 @@ int prestera_bridge_port_join(struct net_device *br_dev, } err = switchdev_bridge_port_offload(br_port->dev, port->dev, NULL, - NULL, NULL, extack); + NULL, NULL, false, extack); if (err) goto err_switchdev_offload; diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c index 0a53f1d8e7e1..f5d0d392efbf 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c @@ -362,7 +362,7 @@ mlxsw_sp_bridge_port_create(struct mlxsw_sp_bridge_device *bridge_device, bridge_port->ref_count = 1; err = switchdev_bridge_port_offload(brport_dev, mlxsw_sp_port->dev, - NULL, NULL, NULL, extack); + NULL, NULL, NULL, false, extack); if (err) goto err_switchdev_offload; diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c b/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c index 807dc45cfae4..649ca609884a 100644 --- a/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c +++ b/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c @@ -113,7 +113,7 @@ static int sparx5_port_bridge_join(struct sparx5_port *port, set_bit(port->portno, sparx5->bridge_mask); err = switchdev_bridge_port_offload(ndev, ndev, NULL, NULL, NULL, - extack); + false, extack); if (err) goto err_switchdev_offload; diff --git a/drivers/net/ethernet/mscc/ocelot_net.c b/drivers/net/ethernet/mscc/ocelot_net.c index 3558ee8d9212..c52f175df389 100644 --- a/drivers/net/ethernet/mscc/ocelot_net.c +++ b/drivers/net/ethernet/mscc/ocelot_net.c @@ -1200,7 +1200,7 @@ static int ocelot_netdevice_bridge_join(struct net_device *dev, err = switchdev_bridge_port_offload(brport_dev, dev, priv, &ocelot_netdevice_nb, &ocelot_switchdev_blocking_nb, - extack); + false, extack); if (err) goto err_switchdev_offload; diff --git a/drivers/net/ethernet/rocker/rocker_ofdpa.c b/drivers/net/ethernet/rocker/rocker_ofdpa.c index 03df6a24d0ba..b82e169b7836 100644 --- a/drivers/net/ethernet/rocker/rocker_ofdpa.c +++ b/drivers/net/ethernet/rocker/rocker_ofdpa.c @@ -2599,7 +2599,7 @@ static int ofdpa_port_bridge_join(struct ofdpa_port *ofdpa_port, return err; return switchdev_bridge_port_offload(dev, dev, NULL, NULL, NULL, - extack); + false, extack); } static int ofdpa_port_bridge_leave(struct ofdpa_port *ofdpa_port) diff --git a/drivers/net/ethernet/ti/am65-cpsw-nuss.c b/drivers/net/ethernet/ti/am65-cpsw-nuss.c index b285606f963d..229e2f09d605 100644 --- a/drivers/net/ethernet/ti/am65-cpsw-nuss.c +++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.c @@ -2097,7 +2097,7 @@ static int am65_cpsw_netdevice_port_link(struct net_device *ndev, } err = switchdev_bridge_port_offload(ndev, ndev, NULL, NULL, NULL, - extack); + false, extack); if (err) return err; diff --git a/drivers/net/ethernet/ti/cpsw_new.c b/drivers/net/ethernet/ti/cpsw_new.c index 31030f73840d..4448a91cce54 100644 --- a/drivers/net/ethernet/ti/cpsw_new.c +++ b/drivers/net/ethernet/ti/cpsw_new.c @@ -1518,7 +1518,7 @@ static int cpsw_netdevice_port_link(struct net_device *ndev, } err = switchdev_bridge_port_offload(ndev, ndev, NULL, NULL, NULL, - extack); + false, extack); if (err) return err; diff --git a/include/linux/if_bridge.h b/include/linux/if_bridge.h index bbf680093823..f0b4ffbd8582 100644 --- a/include/linux/if_bridge.h +++ b/include/linux/if_bridge.h @@ -57,6 +57,7 @@ struct br_ip_list { #define BR_MRP_AWARE BIT(17) #define BR_MRP_LOST_CONT BIT(18) #define BR_MRP_LOST_IN_CONT BIT(19) +#define BR_TX_FWD_OFFLOAD BIT(20) #define BR_DEFAULT_AGEING_TIME (300 * HZ) @@ -182,6 +183,7 @@ int switchdev_bridge_port_offload(struct net_device *brport_dev, struct net_device *dev, const void *ctx, struct notifier_block *atomic_nb, struct notifier_block *blocking_nb, + bool tx_fwd_offload, struct netlink_ext_ack *extack); void switchdev_bridge_port_unoffload(struct net_device *brport_dev, const void *ctx, @@ -195,6 +197,7 @@ switchdev_bridge_port_offload(struct net_device *brport_dev, struct net_device *dev, const void *ctx, struct notifier_block *atomic_nb, struct notifier_block *blocking_nb, + bool tx_fwd_offload, struct netlink_ext_ack *extack) { return -EINVAL; diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c index bfdbaf3015b9..bc14b1b384e9 100644 --- a/net/bridge/br_forward.c +++ b/net/bridge/br_forward.c @@ -48,6 +48,8 @@ int br_dev_queue_push_xmit(struct net *net, struct sock *sk, struct sk_buff *skb skb_set_network_header(skb, depth); } + skb->offload_fwd_mark = br_switchdev_frame_uses_tx_fwd_offload(skb); + dev_queue_xmit(skb); return 0; @@ -76,6 +78,11 @@ static void __br_forward(const struct net_bridge_port *to, struct net *net; int br_hook; + /* Mark the skb for forwarding offload early so that br_handle_vlan() + * can know whether to pop the VLAN header on egress or keep it. + */ + nbp_switchdev_frame_mark_tx_fwd_offload(to, skb); + vg = nbp_vlan_group_rcu(to); skb = br_handle_vlan(to->br, to, vg, skb); if (!skb) @@ -174,6 +181,8 @@ static struct net_bridge_port *maybe_deliver( if (!should_deliver(p, skb)) return prev; + nbp_switchdev_frame_mark_tx_fwd_to_hwdom(p, skb); + if (!prev) goto out; diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h index 2f32d330b648..86ca617fec7a 100644 --- a/net/bridge/br_private.h +++ b/net/bridge/br_private.h @@ -552,12 +552,20 @@ struct br_input_skb_cb { #endif #ifdef CONFIG_NET_SWITCHDEV + /* Set if TX data plane offloading is used towards at least one + * hardware domain. + */ + u8 tx_fwd_offload:1; /* The switchdev hardware domain from which this packet was received. * If skb->offload_fwd_mark was set, then this packet was already * forwarded by hardware to the other ports in the source hardware * domain, otherwise it wasn't. */ int src_hwdom; + /* Bit mask of hardware domains towards this packet has already been + * transmitted using the TX data plane offload. + */ + unsigned long fwd_hwdoms; #endif }; @@ -1871,6 +1879,12 @@ static inline void br_sysfs_delbr(struct net_device *dev) { return; } /* br_switchdev.c */ #ifdef CONFIG_NET_SWITCHDEV +bool br_switchdev_frame_uses_tx_fwd_offload(struct sk_buff *skb); + +void nbp_switchdev_frame_mark_tx_fwd_offload(const struct net_bridge_port *p, + struct sk_buff *skb); +void nbp_switchdev_frame_mark_tx_fwd_to_hwdom(const struct net_bridge_port *p, + struct sk_buff *skb); void nbp_switchdev_frame_mark(const struct net_bridge_port *p, struct sk_buff *skb); bool nbp_switchdev_allowed_egress(const struct net_bridge_port *p, @@ -1891,6 +1905,23 @@ static inline void br_switchdev_frame_unmark(struct sk_buff *skb) skb->offload_fwd_mark = 0; } #else +static inline bool br_switchdev_frame_uses_tx_fwd_offload(struct sk_buff *skb) +{ + return false; +} + +static inline void +nbp_switchdev_frame_mark_tx_fwd_offload(const struct net_bridge_port *p, + struct sk_buff *skb) +{ +} + +static inline void +nbp_switchdev_frame_mark_tx_fwd_to_hwdom(const struct net_bridge_port *p, + struct sk_buff *skb) +{ +} + static inline void nbp_switchdev_frame_mark(const struct net_bridge_port *p, struct sk_buff *skb) { diff --git a/net/bridge/br_switchdev.c b/net/bridge/br_switchdev.c index 6bfff28ede23..96ce069d0c8c 100644 --- a/net/bridge/br_switchdev.c +++ b/net/bridge/br_switchdev.c @@ -8,6 +8,46 @@ #include "br_private.h" +static struct static_key_false br_switchdev_tx_fwd_offload; + +static bool nbp_switchdev_can_offload_tx_fwd(const struct net_bridge_port *p, + const struct sk_buff *skb) +{ + if (!static_branch_unlikely(&br_switchdev_tx_fwd_offload)) + return false; + + return (p->flags & BR_TX_FWD_OFFLOAD) && + (p->hwdom != BR_INPUT_SKB_CB(skb)->src_hwdom); +} + +bool br_switchdev_frame_uses_tx_fwd_offload(struct sk_buff *skb) +{ + if (!static_branch_unlikely(&br_switchdev_tx_fwd_offload)) + return false; + + return BR_INPUT_SKB_CB(skb)->tx_fwd_offload; +} + +/* Mark the frame for TX forwarding offload if this egress port supports it */ +void nbp_switchdev_frame_mark_tx_fwd_offload(const struct net_bridge_port *p, + struct sk_buff *skb) +{ + if (nbp_switchdev_can_offload_tx_fwd(p, skb)) + BR_INPUT_SKB_CB(skb)->tx_fwd_offload = true; +} + +/* Lazily adds the hwdom of the egress bridge port to the bit mask of hwdoms + * that the skb has been already forwarded to, to avoid further cloning to + * other ports in the same hwdom by making nbp_switchdev_allowed_egress() + * return false. + */ +void nbp_switchdev_frame_mark_tx_fwd_to_hwdom(const struct net_bridge_port *p, + struct sk_buff *skb) +{ + if (nbp_switchdev_can_offload_tx_fwd(p, skb)) + set_bit(p->hwdom, &BR_INPUT_SKB_CB(skb)->fwd_hwdoms); +} + void nbp_switchdev_frame_mark(const struct net_bridge_port *p, struct sk_buff *skb) { @@ -18,8 +58,10 @@ void nbp_switchdev_frame_mark(const struct net_bridge_port *p, bool nbp_switchdev_allowed_egress(const struct net_bridge_port *p, const struct sk_buff *skb) { - return !skb->offload_fwd_mark || - BR_INPUT_SKB_CB(skb)->src_hwdom != p->hwdom; + struct br_input_skb_cb *cb = BR_INPUT_SKB_CB(skb); + + return !test_bit(p->hwdom, &cb->fwd_hwdoms) && + (!skb->offload_fwd_mark || cb->src_hwdom != p->hwdom); } /* Flags that can be offloaded to hardware */ @@ -164,8 +206,11 @@ static void nbp_switchdev_hwdom_put(struct net_bridge_port *leaving) static int nbp_switchdev_add(struct net_bridge_port *p, struct netdev_phys_item_id ppid, + bool tx_fwd_offload, struct netlink_ext_ack *extack) { + int err; + if (p->offload_count) { /* Prevent unsupported configurations such as a bridge port * which is a bonding interface, and the member ports are from @@ -189,7 +234,16 @@ static int nbp_switchdev_add(struct net_bridge_port *p, p->ppid = ppid; p->offload_count = 1; - return nbp_switchdev_hwdom_set(p); + err = nbp_switchdev_hwdom_set(p); + if (err) + return err; + + if (tx_fwd_offload) { + p->flags |= BR_TX_FWD_OFFLOAD; + static_branch_inc(&br_switchdev_tx_fwd_offload); + } + + return 0; } static void nbp_switchdev_del(struct net_bridge_port *p) @@ -204,6 +258,11 @@ static void nbp_switchdev_del(struct net_bridge_port *p) if (p->hwdom) nbp_switchdev_hwdom_put(p); + + if (p->flags & BR_TX_FWD_OFFLOAD) { + p->flags &= ~BR_TX_FWD_OFFLOAD; + static_branch_dec(&br_switchdev_tx_fwd_offload); + } } static int nbp_switchdev_sync_objs(struct net_bridge_port *p, const void *ctx, @@ -262,6 +321,7 @@ int switchdev_bridge_port_offload(struct net_device *brport_dev, struct net_device *dev, const void *ctx, struct notifier_block *atomic_nb, struct notifier_block *blocking_nb, + bool tx_fwd_offload, struct netlink_ext_ack *extack) { struct netdev_phys_item_id ppid; @@ -278,7 +338,7 @@ int switchdev_bridge_port_offload(struct net_device *brport_dev, if (err) return err; - err = nbp_switchdev_add(p, ppid, extack); + err = nbp_switchdev_add(p, ppid, tx_fwd_offload, extack); if (err) return err; diff --git a/net/bridge/br_vlan.c b/net/bridge/br_vlan.c index 382ab992badf..325600361487 100644 --- a/net/bridge/br_vlan.c +++ b/net/bridge/br_vlan.c @@ -465,7 +465,15 @@ struct sk_buff *br_handle_vlan(struct net_bridge *br, u64_stats_update_end(&stats->syncp); } - if (v->flags & BRIDGE_VLAN_INFO_UNTAGGED) + /* If the skb will be sent using forwarding offload, the assumption is + * that the switchdev will inject the packet into hardware together + * with the bridge VLAN, so that it can be forwarded according to that + * VLAN. The switchdev should deal with popping the VLAN header in + * hardware on each egress port as appropriate. So only strip the VLAN + * header if forwarding offload is not being used. + */ + if (v->flags & BRIDGE_VLAN_INFO_UNTAGGED && + !br_switchdev_frame_uses_tx_fwd_offload(skb)) __vlan_hwaccel_clear_tag(skb); if (p && (p->flags & BR_VLAN_TUNNEL) && diff --git a/net/dsa/port.c b/net/dsa/port.c index d81c283b7358..f2704f101ccf 100644 --- a/net/dsa/port.c +++ b/net/dsa/port.c @@ -257,7 +257,7 @@ int dsa_port_bridge_join(struct dsa_port *dp, struct net_device *br, err = switchdev_bridge_port_offload(brport_dev, dev, dp, &dsa_slave_switchdev_notifier, &dsa_slave_switchdev_blocking_notifier, - extack); + false, extack); if (err) goto out_rollback_unbridge; From patchwork Thu Jul 22 15:55:39 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Oltean X-Patchwork-Id: 485077 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, MSGID_FROM_MTA_HEADER, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 041DBC63797 for ; Thu, 22 Jul 2021 15:56:15 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E4F1D6101E for ; Thu, 22 Jul 2021 15:56:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232717AbhGVPPj (ORCPT ); Thu, 22 Jul 2021 11:15:39 -0400 Received: from mail-eopbgr40086.outbound.protection.outlook.com ([40.107.4.86]:15366 "EHLO EUR03-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S232691AbhGVPPc (ORCPT ); Thu, 22 Jul 2021 11:15:32 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Zq2mKolcHJusQFuz6nD7I+ZV0Eoe4XQTQ37BxC9mlbC6wwLQhj8NpsThFpsln5TDK69CyzMYXk4r+PXsI7X+uwGgF56gXNCe161YBZO1nr9zSqV3MWpkmEBW9AeMne6ybwhAEzZPZMfCkeGockX81mAJPRTz3xEehlII13Y7bE3c13p0YSnDM0/aUHiBfe+LGDJ/29m53Qu5CLROjIajWsxmr1n5AO7Je8RCIAMIF6tcPl0HgYNArZFc8XC9FP+0vPHv33OQqDpT2xiRQaan5j5eC0UiBkLhO7TeqQNSLpK6tt28e+Fj6Ny27Arh1vZApNeMrKKpaDYieKNCiBZxQw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=AR6WD//KZxTUypdrDFJcein6r6LNsvooxui9tCi46OE=; b=N+TwFl3MbjQK3xc2RKoXNZjLGpU+98u1sgsP9Ik8oxKjokI5bSigxzerGlQHPdNDCUX/c+KcebufW10Ju8vqO3AnIMpTMlYoX+0+A2ZHGklZYNz7JU9MHKHVZsyd9U4DV29+7Ni7BKWHvP1QhZFu8g2iI1ndYJz9zf2ho6tjRZosT74p8MpvMrvNqk1IGpfhJKBynYwarUzyQOTvbFF3LhVrrhUlPCWHQHX6xqSVGoKdQ6x8KCTDipeHH66MMaaTOqiWYe6GrXl+gyF83SV2mgtOys7fo8Bde5ZbGBsheRqxltUhOPvnAO5qEZre6J2Riu2KivwhL6NGQ+J5/dPryg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=AR6WD//KZxTUypdrDFJcein6r6LNsvooxui9tCi46OE=; b=lCJ5Eyk/QfO5IqZgx3M68GKOYqipGfBgBsE4nra2ALtvvcReVA5RtwhWm95RA4Kb0KHZcBc66j1OmxaRJnuAPEbtp4eCKPbEbfrYXov1D1R0eZJ4xpOPZcB0eUa/7sK0oteOTPK+65WLaYIJyST0UIpdIZU/SSYiEPADITXdWyQ= Authentication-Results: vger.kernel.org; dkim=none (message not signed) header.d=none; vger.kernel.org; dmarc=none action=none header.from=nxp.com; Received: from VI1PR04MB5136.eurprd04.prod.outlook.com (2603:10a6:803:55::19) by VE1PR04MB6639.eurprd04.prod.outlook.com (2603:10a6:803:129::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4331.26; Thu, 22 Jul 2021 15:56:05 +0000 Received: from VI1PR04MB5136.eurprd04.prod.outlook.com ([fe80::109:1995:3e6b:5bd0]) by VI1PR04MB5136.eurprd04.prod.outlook.com ([fe80::109:1995:3e6b:5bd0%2]) with mapi id 15.20.4352.026; Thu, 22 Jul 2021 15:56:05 +0000 From: Vladimir Oltean To: netdev@vger.kernel.org, Jakub Kicinski , "David S. Miller" Cc: Andrew Lunn , Florian Fainelli , Vivien Didelot , Jiri Pirko , Ido Schimmel , Tobias Waldekranz , Roopa Prabhu , Nikolay Aleksandrov , Stephen Hemminger , bridge@lists.linux-foundation.org, Grygorii Strashko , Marek Behun , DENG Qingfang Subject: [PATCH v5 net-next 2/5] net: dsa: track the number of switches in a tree Date: Thu, 22 Jul 2021 18:55:39 +0300 Message-Id: <20210722155542.2897921-3-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210722155542.2897921-1-vladimir.oltean@nxp.com> References: <20210722155542.2897921-1-vladimir.oltean@nxp.com> X-ClientProxiedBy: AM3PR07CA0099.eurprd07.prod.outlook.com (2603:10a6:207:6::33) To VI1PR04MB5136.eurprd04.prod.outlook.com (2603:10a6:803:55::19) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from localhost.localdomain (82.76.66.29) by AM3PR07CA0099.eurprd07.prod.outlook.com (2603:10a6:207:6::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4373.9 via Frontend Transport; Thu, 22 Jul 2021 15:56:03 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: e1129896-9236-4da7-9c16-08d94d293645 X-MS-TrafficTypeDiagnostic: VE1PR04MB6639: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:8882; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: r9PHUGV72Ul+xR1Rc0cNQ9Ms86N41Eg695mbENAQ39tkBYTmSYuMFdA8bP5Z7GmAXxcSDx3vQCwKl6tw1SVc2OM6bDlHK7PjV/zavSXY3Ok2BzrXze2Q7D7qa0K+pnzJVQ/09YaeY/RoZjU/RMIiXKGKN0Cqm5EzZsHpLGYHazj1vpUW52t/xJRSUBD0R58C73TiYmVYzz1jSSNCQfqf1GLISKiSd9cs4BA9tD+vZrTaLBdJO2Dx3rVBfJvrXJ+StP+GKPkzsQxt73/p0fNEkBwaR8YIa1h/lTZn/Wcu1pt/FV8NLKO4rvZ8j1KAV7jtDFAFklBzQCTlt3Ne3tfSUwwX36OaXhZNMYwbAswz9KWDFeLXMxRxytrY3yf1q80A0L7JD5c/ECZ/p9A1uBKssylrdPQ47fJqf9MODqTgAYSRo/fntr1wPWMHzQru4h3dDfLT2yZsJcslF7lide07BC6JQ6ZAGJCl+93uou2tPLnNZcsAtL8zdJo7BVg3JhQd5EBrB2KxF1mnWUadjltWXrwhhRARlURC0MPP25vmZbBeIyUhuLQeEnhgovKDtokWai6xG/XR0voK3ZzYkVF4eLfTdRf2Tzu8ncjxqj/Sr/ne/adXYyO+TK5D/rDlQyq/0oVtlEZVmeCbBk9X9s6Hnqj7q1l9L4do4/6Xa3953s73qlUuyo7p0wSKSOYHmEH21zGFPnVh9sjVSsMTfKkRIg== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:VI1PR04MB5136.eurprd04.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(39860400002)(376002)(136003)(366004)(346002)(396003)(110136005)(6506007)(1076003)(4326008)(8936002)(478600001)(52116002)(6486002)(6666004)(36756003)(44832011)(66556008)(38350700002)(66946007)(316002)(38100700002)(86362001)(5660300002)(8676002)(26005)(7416002)(54906003)(66476007)(956004)(6512007)(2906002)(2616005)(186003); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: rvcp1vBCMqbUGG9ImLQC4dYyn/fuWb4lzMu8cqE0xJao847bIXLVYBgrIzv5rG4QqrYk2+mmXU3tGpDZenbOGAEiqGv6vg91Uempk7RzrCxfVidX8Ht06b2p5GfsZWUrZM6jSV7bHVWTgFZMRqXiWm04N4IcPShu2RQKuREjtgCXqOTXrqlIbxtYR1FruxZhG4/enAI8vJ6k1QXVexAmXEWDziqxJgpC8QljOS8HUQK9CoHjqzmOs+Bjx3MTtVBZQl+wNl/ULr7+anrzpDyt9Xea9BNzbDW9SS0zuH59GcQYj2s/KX7yLPujm2baDrtglfK+GUvZQuaxKhJw4lSpSyFp8U1y9mPU6cvzU4YfvMfEjL/fkIcc8ybfqSZ5F8SKXHqtMipGZ8HiGWA0sdUndCLi1Mb3IxSWFh1qIbvoGG1X8AkOV8+9kvVV/o8ZSjHEVE05kFL+T0JFSaOr4XQjgikQtKFcp6+/7iPbMhndssOGqhxPOPswg2QWI4qzufZndqqqlKQaENF746jEPuKI+Bvc6/fq0lKZ8l3IoHNHU7CARQYGKq9TOdYwB1chU4niP8TPUjL+exsMIxwoRT4c/QBcxJS3lrriFBFGuCZjzifxQARLdjq5ugofKQw+leJSSEZaaUzwAKFZcOInb/jr34YTDKGuERrU6LkTUl0H/eGjqDhbxNjUCyjh5PzF9M+PZ0Tdytdw+zufrNQuIPDwEs/QbNqCGVM23ARp8gTE/c6I3/ppDKdnohxET9gif5WJzlWKBQOydMJ2ws3R5OnOjRKQ9tDSoIVClm4lZGsai2TZ8T0BgHN3nKTx9vWsce480fRlwmcQ57W78k8Ofj29fllvodnO5rN1nYmZl7ip27i9Tsh4rDGuaHT66uNTZyOr/+Z7dvLBGUcfEWtUjY9/3WSbwY0p9Tm3tjg2yPjBAxbQ5DE4Znfqd7vudNQR8iI/39aA9fYq84NdG7qSwyr+B2nY0RXLsMq/ZIPgm6F0DMj8PXCgm0sPxaQiWvA7bysF160/FvyweZtekrOVZhMtsJQr1+Q1cie3buZN52cDFVOhhdk0tAyHy0TkNXJAq0BN+GBJyEC6AiRHylN+qsCPLtfziM89PaFO3V5b64FMaLfhxWMecdrx03Ab/rcDUyBJeSvwlcsCLJKMOxzndsLsh8YC34aLk04aPtUela2n7aW1pSfU+4BksnmewHulTGQOcyD0x9la0Rr+JNJrBNRRlX967kbLez8l8DlGR+fDlkA1r/htxKk3yb9RS2fXtb1UKaTs+8qA++u5oNFTnAlwXhLLaoOfTSgzgZgYGWYSOdy0LzIwHkzZv7alkGsZVde+ X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: e1129896-9236-4da7-9c16-08d94d293645 X-MS-Exchange-CrossTenant-AuthSource: VI1PR04MB5136.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jul 2021 15:56:05.0934 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: ZJZNTpvz/eON7Op/G/SD4yNiNV+91OEqZTShe7qjvx7J2dNvFciPPQVjzUSYKO1pD6DlEiHHLZEpxHJc9LAVZw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: VE1PR04MB6639 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org In preparation of supporting data plane forwarding on behalf of a software bridge, some drivers might need to view bridges as virtual switches behind the CPU port in a cross-chip topology. Give them some help and let them know how many physical switches there are in the tree, so that they can count the virtual switches starting from that number on. Note that the first dsa_switch_ops method where this information is reliably available is .setup(). This is because of how DSA works: in a tree with 3 switches, each calling dsa_register_switch(), the first 2 will advance until dsa_tree_setup() -> dsa_tree_setup_routing_table() and exit with error code 0 because the topology is not complete. Since probing is parallel at this point, one switch does not know about the existence of the other. Then the third switch comes, and for it, dsa_tree_setup_routing_table() returns complete = true. This switch goes ahead and calls dsa_tree_setup_switches() for everybody else, calling their .setup() methods too. This acts as the synchronization point. Signed-off-by: Vladimir Oltean Reviewed-by: Florian Fainelli --- v2->v3: patch is new v3->v5: none include/net/dsa.h | 3 +++ net/dsa/dsa2.c | 3 +++ 2 files changed, 6 insertions(+) diff --git a/include/net/dsa.h b/include/net/dsa.h index 9e5593885357..929bcaec4d41 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -159,6 +159,9 @@ struct dsa_switch_tree { */ struct net_device **lags; unsigned int lags_len; + + /* Track the largest switch index within a tree */ + unsigned int last_switch; }; #define dsa_lags_foreach_id(_id, _dst) \ diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c index 185629f27f80..de5e93ba2a9d 100644 --- a/net/dsa/dsa2.c +++ b/net/dsa/dsa2.c @@ -1265,6 +1265,9 @@ static int dsa_switch_parse_member_of(struct dsa_switch *ds, return -EEXIST; } + if (ds->dst->last_switch < ds->index) + ds->dst->last_switch = ds->index; + return 0; } From patchwork Thu Jul 22 15:55:40 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Oltean X-Patchwork-Id: 484293 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, MSGID_FROM_MTA_HEADER, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 28A97C6377D for ; Thu, 22 Jul 2021 15:56:18 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 0F33661279 for ; Thu, 22 Jul 2021 15:56:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232752AbhGVPPm (ORCPT ); Thu, 22 Jul 2021 11:15:42 -0400 Received: from mail-eopbgr150058.outbound.protection.outlook.com ([40.107.15.58]:4577 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S232702AbhGVPPe (ORCPT ); Thu, 22 Jul 2021 11:15:34 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=AmBtcLXDUWQLwwBwKchJhHIF51Ot/bWGa58EZ0zhQu92bbdWLX1QBSfeSwkVbsuAGKl5wRGKy5tDIXpa0Sg6lgHP3CDnUtkqUQuOC+4iy/zc88rixgi24Q1phtz85KjbsPMwZLaPTICixuB589oljcUHtgi2JI+/oXRXR8cVJARBmyf91JltTwVSaDiReTh1eGGQsQmumK06Hp42KSDobQTAywPrHYykDLM1ygGjo4YpmY04PV314rczs9iP3dsCy57u2S96Ry16FL6u/h/FiXVo2pmdDgmuRgEqdVt3gcySzziif72Vtm2zWbeDvi+laMlfdhgkH7shEjExBC4Dzg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=VIyOdgOJmzR2/wDE+ObKRA/618GSd4mK0KWd8UjTGS0=; b=Q/jJMB5UFxAq8nxP23Vo66tWk5Bl24+jhw+8uy8NdIiTnreWlLg94inRtuVWVpqSkWg9GNLO+3ODeQuFadZ9pWCyBLfZFzu0/OWRKmJV6QAL/OeFqPS9eMDlPbl04q2LE3hz8tJL4tPIu2ab+REDk6+A//FCDmhYBokNASHLDK/DJ/OUHfxZjYqDthlWr5kaSpXAW0PpSZI8rQj0H1iezxCVLxAUsXqS6mnSaMYz7FUHvuk0x5NI6QcwyNysaEUShuC5ALIPyvYbvJuwQ01+vVoMCCzVapZD8JFVxqPRkrFKaOuwxVFvy0EU8Lngq5maa7yuC55UGSltLHPUYYYVLA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=VIyOdgOJmzR2/wDE+ObKRA/618GSd4mK0KWd8UjTGS0=; b=JaIniru+1ysTrkV4bra6cE3NeKSXfo6hAbUcY6xOAB9Cl09AaYZhfN3GQApWbsRmAXMd9yvAWs/hr4bUEUWBf50B46i5u11XfA6lWC1RLfevdLQFPcjCWr2QIkzkzj0irxJzyVUDtnWU8eUk+BiBSob6HdUKoYOLPhkV77wxEGk= Authentication-Results: vger.kernel.org; dkim=none (message not signed) header.d=none; vger.kernel.org; dmarc=none action=none header.from=nxp.com; Received: from VI1PR04MB5136.eurprd04.prod.outlook.com (2603:10a6:803:55::19) by VI1PR04MB3966.eurprd04.prod.outlook.com (2603:10a6:803:4e::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4331.29; Thu, 22 Jul 2021 15:56:06 +0000 Received: from VI1PR04MB5136.eurprd04.prod.outlook.com ([fe80::109:1995:3e6b:5bd0]) by VI1PR04MB5136.eurprd04.prod.outlook.com ([fe80::109:1995:3e6b:5bd0%2]) with mapi id 15.20.4352.026; Thu, 22 Jul 2021 15:56:06 +0000 From: Vladimir Oltean To: netdev@vger.kernel.org, Jakub Kicinski , "David S. Miller" Cc: Andrew Lunn , Florian Fainelli , Vivien Didelot , Jiri Pirko , Ido Schimmel , Tobias Waldekranz , Roopa Prabhu , Nikolay Aleksandrov , Stephen Hemminger , bridge@lists.linux-foundation.org, Grygorii Strashko , Marek Behun , DENG Qingfang Subject: [PATCH v5 net-next 3/5] net: dsa: add support for bridge TX forwarding offload Date: Thu, 22 Jul 2021 18:55:40 +0300 Message-Id: <20210722155542.2897921-4-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210722155542.2897921-1-vladimir.oltean@nxp.com> References: <20210722155542.2897921-1-vladimir.oltean@nxp.com> X-ClientProxiedBy: AM3PR07CA0099.eurprd07.prod.outlook.com (2603:10a6:207:6::33) To VI1PR04MB5136.eurprd04.prod.outlook.com (2603:10a6:803:55::19) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from localhost.localdomain (82.76.66.29) by AM3PR07CA0099.eurprd07.prod.outlook.com (2603:10a6:207:6::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4373.9 via Frontend Transport; Thu, 22 Jul 2021 15:56:05 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: f470829d-e92e-4e85-6850-08d94d293736 X-MS-TrafficTypeDiagnostic: VI1PR04MB3966: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:10000; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 3eiDYtBRbH3E3HAsA4XYmKbmajR3+zqKUQamW8VhfjFtPzTXWd2/QewhRWs9hI1G6Yc46B0JxjC6lkGc1JDshW+aspa7KremZchW7Os2BCC8N1cxSyAkc1IFarOhoVUhc8cVwfOoITQpjov40YdNUihzFr7nj0SqUkE+c0PcvyREWfASYXnrUt8pROh3xxZHKl/fjt9pVu+X0vqA10mQIzswMM9XLZNfBQVIo7URts+G26nWlofDugzGoDeCuNsplWUlaSKjI8duIXkvLPknAcO7FC2orRwx8nMRc1G4OvXO54sddQSgX5Sr6nXEF1w58tX78e2DbS2qLRLiqQuXKko2/1sThVBPzM6h2Tc1UORlGBHn1CilotBGBKcYe7FNzi5q5O7qmSgSTw74DaA8yhusd8ljBvIBOtc7npCgTZ/hDGMlRWwIhtJewyg3Z0f0B4gydBGBtg/IjgPuUFJ+CNqnuMpws/oQXX28eE8t5qxZMqvVq853l/mLvB0qDA+7rPC+0vlAzWXAAsYNetriIjfV71QWvtabb27CCKC5qAaLfj93wzfDswbmwVCneWLqH0ssUJRaiFbx903f5K/6v101iPAJWaWLm9TSDrz6+MfGCJ0e7WB4VB8RpXblxc8FEgZBO/RGkEQ7Ed4ibIydKbo01B75j98o9VgZu2+5UK/Pj2C/VzxUrtqwW3CSaxLg3A+rN/umW5cTog0G2/ShYQ== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:VI1PR04MB5136.eurprd04.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(366004)(83380400001)(38350700002)(2616005)(7416002)(316002)(508600001)(86362001)(44832011)(66946007)(110136005)(6506007)(8936002)(4326008)(5660300002)(6512007)(8676002)(54906003)(186003)(66556008)(36756003)(1076003)(6486002)(6666004)(66476007)(52116002)(26005)(2906002)(38100700002)(956004); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: VNHZ+S3Rz6lyQW77fCvnVBR45Iq18HkOJmX7imRB1I0ZuVccuHpIlGh8IbKEvsFXJ0MTUiIiW0FFjaHNF2NSF2r4hCWT3udALxlYh1XIr0o6Tz1aoCCxk5pI37nAjG9STzx/G/uRMwWJnVhvxbDUF91cchNT0Siz6Fc5z9OFqbOOujpe4d+nRMcuXS8oR05A88sKmv/yvhGBaSCXHFMNj5LhPqzkU3tEJulVyESDZEJs5cr7u8N73FqpaPm5qjY2UiwtizHZDxgmvY3LuMgDy2HWi5Uj8AMeg8YCyCZi/HSFzfCeglsvuDxA18yX7E8kr6aTVj6I7ng76l5Z+trpQdj8gUp4lZ0g3hnBc3C4MK2TNvnQyWLe52pSG3UOfaQadGrzZWvAiRKSxq7UE5F74sQND788Xm9IfpG7NEV/sC9FZSoSgZHIwAyJ9XoLI2Zqk5V1js7FAO27NzQKoTJ2LgMa2Vc0FAx/zPuplIoNChN9r6drRlMKGF6AWao61SkVySAgxx6CU0vII0ZxGdSy6vvTXh7f/GlwR9qBbza0OA1Dn8LLwQXfpM6EBB8jSbgXe7IkWSGVCJqa1lzD1BlyxFgS0BiVx3Ufsrnqx6/sK3Q2AT9OmETsa7bqUYWpVxCuFZEZA7QOU3i/dUH3ZiMJt1PQIbokuhSniS5EWdYpWQFC0xW2+h1Djifb6ylrFEAGtWp9SK1HRNHolkXXoI3daVg9LS3G41ggnrPUpxLx49kamqKVg/BwK0pTwO1d7ew7aLlxTgWf09QShAnsEcOmNbddMe65WOITIdR71PpakhePgIbAXqd8ss+aTlXx7mMCFLIPENVgQxLlmz4hay6Sl6Kj9suabTo6G8mBZZclW0llFhuwskgEf1CXOSP/kjjN+htCC9G0IERFWasudHbMOm5hdcJ3uwUkiHJQRRW63trE4tFywHQjzt6sEIDRrD9l02GjaxgY59wFXqvzbQUUmfeqbqqaaeGJqiCSMTNHmXewxFpMmBRGDzcs65BCyq/fQddM+I2FM81XKLUG/jWKxKOtUtY9F6vAA8HboCosmTopaQRUhxjr8nFjDilHauL+Kz6o1QnCFlGh+aoK5COOi629/xHqAFNhUHmFBkWF5kcGEQkT8WofMev2xKow8hNXDE4mrIbriiznwNKKqWq+89/d0UEBHrK2bs1KWSszITKZP5gwq9kxFoi62anCUsMq8hjhbPuGUYg+HE8QgJkngMMkvCXO8hIiyssQDCuguIJS7Vc94eZCbFAXPM/IRlu0CU35DA+Dup9GkfHm/1MqMBzFjXuPpSJOwM4WlWB/RKXNLufzNNWJeYuCn946nACC X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: f470829d-e92e-4e85-6850-08d94d293736 X-MS-Exchange-CrossTenant-AuthSource: VI1PR04MB5136.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jul 2021 15:56:06.6895 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: n4GMHyxbbB5MT2ZrelYtVUWKt/zCp9B4/sIZ3ffRqDTmupsAD6yQvmXvZFZHoqFX/d+Sq3NV9pqH5d/wIx3ybA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR04MB3966 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org For a DSA switch, to offload the forwarding process of a bridge device means to send the packets coming from the software bridge as data plane packets. This is contrary to everything that DSA has done so far, because the current taggers only know to send control packets (ones that target a specific destination port), whereas data plane packets are supposed to be forwarded according to the FDB lookup, much like packets ingressing on any regular ingress port. If the FDB lookup process returns multiple destination ports (flooding, multicast), then replication is also handled by the switch hardware - the bridge only sends a single packet and avoids the skb_clone(). DSA keeps for each bridge port a zero-based index (the number of the bridge). Multiple ports performing TX forwarding offload to the same bridge have the same dp->bridge_num value, and ports not offloading the TX data plane of a bridge have dp->bridge_num = -1. The tagger can check if the packet that is being transmitted on has skb->offload_fwd_mark = true or not. If it does, it can be sure that the packet belongs to the data plane of a bridge, further information about which can be obtained based on dp->bridge_dev and dp->bridge_num. It can then compose a DSA tag for injecting a data plane packet into that bridge number. For the switch driver side, we offer two new dsa_switch_ops methods, called .port_bridge_fwd_offload_{add,del}, which are modeled after .port_bridge_{join,leave}. These methods are provided in case the driver needs to configure the hardware to treat packets coming from that bridge software interface as data plane packets. The switchdev <-> bridge interaction happens during the netdev_master_upper_dev_link() call, so to switch drivers, the effect is that the .port_bridge_fwd_offload_add() method is called immediately after .port_bridge_join(). If the bridge number exceeds the number of bridges for which the switch driver can offload the TX data plane (and this includes the case where the driver can offload none), DSA falls back to simply returning tx_fwd_offload = false in the switchdev_bridge_port_offload() call. Signed-off-by: Vladimir Oltean Reviewed-by: Florian Fainelli --- v2->v3: - signal the offloading capability via switchdev_bridge_port_offload() - drop "bool bridge_fwd_offload" from the tagger - drop "struct dsa_bridge_fwd_accel_priv" from struct dsa_port and replace it with a simple "int bridge_num" - drop .crosschip_bridge_fwd_offload_{add,del}() - drop the DSA_NOTIFIER_BRIDGE_FWD_OFFLOAD_{ADD,DEL} cross-chip notifier and call the driver directly on the port v3->v4: - use dsa_tree_find_bridge_dev() in the unprepare code path to allow the bridge_num to be properly reused when there is no port offloading a given bridge anymore - drop the stray netif_set_real_num_tx_queues() change from v2 - properly call dsa_port_bridge_tx_fwd_unprepare() instead of prepare() in dsa_port_pre_bridge_leave() - fix dp->bridge_num remaining -1 in dsa_port_bridge_tx_fwd_prepare() by removing the stray "int bridge_num" declaration which was shadowing the variable which had the function-wide scope v4->v5: - rename functions for naming consistency - move dsa_port_bridge_tx_fwd_unoffload to dsa_port_bridge_leave instead of pre_leave, so that we won't have the problem with dp->bridge_dev still being populated include/net/dsa.h | 18 ++++++++++ net/dsa/dsa2.c | 1 + net/dsa/dsa_priv.h | 2 ++ net/dsa/port.c | 84 +++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 104 insertions(+), 1 deletion(-) diff --git a/include/net/dsa.h b/include/net/dsa.h index 929bcaec4d41..f8eb2dc3fbef 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -162,6 +162,9 @@ struct dsa_switch_tree { /* Track the largest switch index within a tree */ unsigned int last_switch; + + /* Track the bridges with forwarding offload enabled */ + unsigned long fwd_offloading_bridges; }; #define dsa_lags_foreach_id(_id, _dst) \ @@ -262,6 +265,7 @@ struct dsa_port { bool vlan_filtering; u8 stp_state; struct net_device *bridge_dev; + int bridge_num; struct devlink_port devlink_port; bool devlink_port_setup; struct phylink *pl; @@ -413,6 +417,12 @@ struct dsa_switch { */ unsigned int num_lag_ids; + /* Drivers that support bridge forwarding offload should set this to + * the maximum number of bridges spanning the same switch tree that can + * be offloaded. + */ + unsigned int num_fwd_offloading_bridges; + size_t num_ports; }; @@ -696,6 +706,14 @@ struct dsa_switch_ops { struct net_device *bridge); void (*port_bridge_leave)(struct dsa_switch *ds, int port, struct net_device *bridge); + /* Called right after .port_bridge_join() */ + int (*port_bridge_tx_fwd_offload)(struct dsa_switch *ds, int port, + struct net_device *bridge, + int bridge_num); + /* Called right before .port_bridge_leave() */ + void (*port_bridge_tx_fwd_unoffload)(struct dsa_switch *ds, int port, + struct net_device *bridge, + int bridge_num); void (*port_stp_state_set)(struct dsa_switch *ds, int port, u8 state); void (*port_fast_age)(struct dsa_switch *ds, int port); diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c index de5e93ba2a9d..c7fa85fb3086 100644 --- a/net/dsa/dsa2.c +++ b/net/dsa/dsa2.c @@ -1044,6 +1044,7 @@ static struct dsa_port *dsa_port_touch(struct dsa_switch *ds, int index) dp->ds = ds; dp->index = index; + dp->bridge_num = -1; INIT_LIST_HEAD(&dp->list); list_add_tail(&dp->list, &dst->ports); diff --git a/net/dsa/dsa_priv.h b/net/dsa/dsa_priv.h index 78c70f5bdab5..b1d9aa4d313c 100644 --- a/net/dsa/dsa_priv.h +++ b/net/dsa/dsa_priv.h @@ -14,6 +14,8 @@ #include #include +#define DSA_MAX_NUM_OFFLOADING_BRIDGES BITS_PER_LONG + enum { DSA_NOTIFIER_AGEING_TIME, DSA_NOTIFIER_BRIDGE_JOIN, diff --git a/net/dsa/port.c b/net/dsa/port.c index f2704f101ccf..7b9bf45a76b6 100644 --- a/net/dsa/port.c +++ b/net/dsa/port.c @@ -230,6 +230,83 @@ static void dsa_port_switchdev_unsync_attrs(struct dsa_port *dp) */ } +static int dsa_tree_find_bridge_num(struct dsa_switch_tree *dst, + struct net_device *bridge_dev) +{ + struct dsa_port *dp; + + /* When preparing the offload for a port, it will have a valid + * dp->bridge_dev pointer but a not yet valid dp->bridge_num. + * However there might be other ports having the same dp->bridge_dev + * and a valid dp->bridge_num, so just ignore this port. + */ + list_for_each_entry(dp, &dst->ports, list) + if (dp->bridge_dev == bridge_dev && dp->bridge_num != -1) + return dp->bridge_num; + + return -1; +} + +static void dsa_port_bridge_tx_fwd_unoffload(struct dsa_port *dp, + struct net_device *bridge_dev) +{ + struct dsa_switch_tree *dst = dp->ds->dst; + int bridge_num = dp->bridge_num; + struct dsa_switch *ds = dp->ds; + + /* No bridge TX forwarding offload => do nothing */ + if (!ds->ops->port_bridge_tx_fwd_unoffload || dp->bridge_num == -1) + return; + + dp->bridge_num = -1; + + /* Check if the bridge is still in use, otherwise it is time + * to clean it up so we can reuse this bridge_num later. + */ + if (!dsa_tree_find_bridge_num(dst, bridge_dev)) + clear_bit(bridge_num, &dst->fwd_offloading_bridges); + + /* Notify the chips only once the offload has been deactivated, so + * that they can update their configuration accordingly. + */ + ds->ops->port_bridge_tx_fwd_unoffload(ds, dp->index, bridge_dev, + bridge_num); +} + +static bool dsa_port_bridge_tx_fwd_offload(struct dsa_port *dp, + struct net_device *bridge_dev) +{ + struct dsa_switch_tree *dst = dp->ds->dst; + struct dsa_switch *ds = dp->ds; + int bridge_num, err; + + if (!ds->ops->port_bridge_tx_fwd_offload) + return false; + + bridge_num = dsa_tree_find_bridge_num(dst, bridge_dev); + if (bridge_num < 0) { + /* First port that offloads TX forwarding for this bridge */ + bridge_num = find_first_zero_bit(&dst->fwd_offloading_bridges, + DSA_MAX_NUM_OFFLOADING_BRIDGES); + if (bridge_num >= ds->num_fwd_offloading_bridges) + return false; + + set_bit(bridge_num, &dst->fwd_offloading_bridges); + } + + dp->bridge_num = bridge_num; + + /* Notify the driver */ + err = ds->ops->port_bridge_tx_fwd_offload(ds, dp->index, bridge_dev, + bridge_num); + if (err) { + dsa_port_bridge_tx_fwd_unoffload(dp, bridge_dev); + return false; + } + + return true; +} + int dsa_port_bridge_join(struct dsa_port *dp, struct net_device *br, struct netlink_ext_ack *extack) { @@ -241,6 +318,7 @@ int dsa_port_bridge_join(struct dsa_port *dp, struct net_device *br, }; struct net_device *dev = dp->slave; struct net_device *brport_dev; + bool tx_fwd_offload; int err; /* Here the interface is already bridged. Reflect the current @@ -254,10 +332,12 @@ int dsa_port_bridge_join(struct dsa_port *dp, struct net_device *br, if (err) goto out_rollback; + tx_fwd_offload = dsa_port_bridge_tx_fwd_offload(dp, br); + err = switchdev_bridge_port_offload(brport_dev, dev, dp, &dsa_slave_switchdev_notifier, &dsa_slave_switchdev_blocking_notifier, - false, extack); + tx_fwd_offload, extack); if (err) goto out_rollback_unbridge; @@ -302,6 +382,8 @@ void dsa_port_bridge_leave(struct dsa_port *dp, struct net_device *br) */ dp->bridge_dev = NULL; + dsa_port_bridge_tx_fwd_unoffload(dp, br); + err = dsa_broadcast(DSA_NOTIFIER_BRIDGE_LEAVE, &info); if (err) pr_err("DSA: failed to notify DSA_NOTIFIER_BRIDGE_LEAVE\n"); From patchwork Thu Jul 22 15:55:41 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Oltean X-Patchwork-Id: 485076 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, MSGID_FROM_MTA_HEADER, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 55FE7C63793 for ; Thu, 22 Jul 2021 15:56:21 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3E85D61279 for ; Thu, 22 Jul 2021 15:56:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232706AbhGVPPp (ORCPT ); Thu, 22 Jul 2021 11:15:45 -0400 Received: from mail-eopbgr150058.outbound.protection.outlook.com ([40.107.15.58]:4577 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S232729AbhGVPPi (ORCPT ); Thu, 22 Jul 2021 11:15:38 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=BUNK6+o+2Nvt/v7KrJEHRAaZfrtk7Dt8HB39LY2G3SLzPg3Pv9TPNnAfOGWYieVjnXeHo0+R6Jm4H0auhSVMqXmUn4uk04LD2DX1XLK69wtrSs2iFGjBzz6p3NyM/ZGiFUdzFQIvsMWMAK7IER7y3GmKZmu+VfiHjHtAUJkiHuCo6oig92mzgkyUHk08oPqi9hCoNy1MTE5Kp9YU1mAZAg4EJCmxeS9gNlyeHF7ErJ0DhQyuzcikH5gw4bWaCSKcDMnjsg297nrQn1oY513Kq/LlM2vIyawJbbEfHWXQDghYsUjogSfTVKZkupNfJ4MJUvMuqWekjG+Vwg8xfv6oAw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=bT++v7JIFEgiUTptbNQ1BXpNA0iMewfhGYU1bgX7trE=; b=GGtuX5jfwpT8CsbRE2kNoEHw0Ub5jFy2NJ1/zXDoGq013ApMCLs25Uf+GMe25B04Deo8AQWv/R6qZD188nRaYiKL4J4+iOuKW/r8kyjgK/pGR7pF87cQA5XXj5zGsre+6dYpSWN+W0R+hnBo8tK1ilFhGVK1a1LQsmJCkqI7TAkPBnxxUzBEjha1zgwUhP2ApPSAlUhT/M31XT8RY+t5jeGKGcAkmCPthjVMLJQYLomLQ7VqQWxIFhUv8b3xKCYkMsu4ea9VnlQX6jMkXZdV8+ICekKbOJK37ajbC2AdN+zIit/6pAOS/i+Q8efzimHS9REW5iQ9+6cei2FPooyQwA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=bT++v7JIFEgiUTptbNQ1BXpNA0iMewfhGYU1bgX7trE=; b=GolA3UTacK2bJaq+NmouKbX+snDzuIYGmAPc+aVKgZNo53x9tuH1QfsUHvL/kOQUy8VnTm/8Es/pvX6DNaaUVkT2RYuGlhxL9/gzeYoaiYkrj9imFFdcHBZ2GchDGYRovY8mGxCz6lwMFR4w1wTkisgY2+nzpZqRiBEfOtXDeAA= Authentication-Results: vger.kernel.org; dkim=none (message not signed) header.d=none; vger.kernel.org; dmarc=none action=none header.from=nxp.com; Received: from VI1PR04MB5136.eurprd04.prod.outlook.com (2603:10a6:803:55::19) by VI1PR04MB3966.eurprd04.prod.outlook.com (2603:10a6:803:4e::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4331.29; Thu, 22 Jul 2021 15:56:08 +0000 Received: from VI1PR04MB5136.eurprd04.prod.outlook.com ([fe80::109:1995:3e6b:5bd0]) by VI1PR04MB5136.eurprd04.prod.outlook.com ([fe80::109:1995:3e6b:5bd0%2]) with mapi id 15.20.4352.026; Thu, 22 Jul 2021 15:56:08 +0000 From: Vladimir Oltean To: netdev@vger.kernel.org, Jakub Kicinski , "David S. Miller" Cc: Andrew Lunn , Florian Fainelli , Vivien Didelot , Jiri Pirko , Ido Schimmel , Tobias Waldekranz , Roopa Prabhu , Nikolay Aleksandrov , Stephen Hemminger , bridge@lists.linux-foundation.org, Grygorii Strashko , Marek Behun , DENG Qingfang Subject: [PATCH v5 net-next 4/5] net: dsa: mv88e6xxx: map virtual bridges with forwarding offload in the PVT Date: Thu, 22 Jul 2021 18:55:41 +0300 Message-Id: <20210722155542.2897921-5-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210722155542.2897921-1-vladimir.oltean@nxp.com> References: <20210722155542.2897921-1-vladimir.oltean@nxp.com> X-ClientProxiedBy: AM3PR07CA0099.eurprd07.prod.outlook.com (2603:10a6:207:6::33) To VI1PR04MB5136.eurprd04.prod.outlook.com (2603:10a6:803:55::19) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from localhost.localdomain (82.76.66.29) by AM3PR07CA0099.eurprd07.prod.outlook.com (2603:10a6:207:6::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4373.9 via Frontend Transport; Thu, 22 Jul 2021 15:56:06 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: aa8e1a93-500e-4e7b-571a-08d94d293829 X-MS-TrafficTypeDiagnostic: VI1PR04MB3966: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:8273; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: ZCdCxqnusLvZ2nzTgS9ok4E0kM9MV8luR8djJ3rTsqSAOXoaOodPlAVuSHcrqG1x0s7XbCmQV7tYupdNayTlTyqVk/RsNTRzLUi5g8TR26eUabjDbp5/VAgbglXgegeWAFPoBvoNSxrNRepQ2k1TKCmBE4n06H/uWa7cRM/RYQNpUYGhkNKjeB26ky6AYs4cJ1+nhX+tkK6fnhHkxZ+UX7REsgXrLr6LI2rMErYTj87yoCCIWmWtBK420S9H6AEGwltxAZM8xXJMDOzySuZbOhGOiKbi2tUq1GDs67tuaAtdr3jHldLwoUE6VaUMGI92oThRwIpyS69iq/sJiRvWZ20g8uN6aA16JnyzB2NCZa7aPgZLd2n2c3Mj892seTspIJyrJdgc6xyxMuGyvJu70iK4nt0g21HDgjiox7MQnuglzqozdE8ou/6t9vNKPXBg5CcNg4JLiJzbzdZKs9HMuTNuEAEGg4hI3LdKUZxgOUYeaMwBsqbLt1k52FuOrcDgfA87KhL5WNlRUVndiJ7TXRULSAq3EPZsv54oLK3VQekuxgQLRz5YpnShUrTCJVfHLAAoRlcrUYatmRskEf3kjbqauuzfGSZ9EVoMxbyJg4fODpGm/MHMD46j+RmXyYcQRyWgiSZZ1bVcrpEywiz9Mf29B/wvxJdvG602h8sue6bn2XF+6RRn2vDG+sPGLtVX X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:VI1PR04MB5136.eurprd04.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(366004)(83380400001)(38350700002)(2616005)(7416002)(316002)(508600001)(86362001)(44832011)(66946007)(110136005)(6506007)(8936002)(4326008)(5660300002)(6512007)(8676002)(54906003)(186003)(66556008)(36756003)(1076003)(6486002)(6666004)(66476007)(52116002)(26005)(2906002)(38100700002)(956004); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: NKLGSSp/Tzf+vMXfxBQ+VmsUHa3jFUy+F/dZAm3LNoNLy7UDkle8p8Vxh3yKs9/QhfiPDAI6w66ldMxgUHnO4J92RDpmwp9dFnyF94WbY1uKimxlaZv6x26TtxAphD2dnLHg8lCs3L2zVfuBM+SNMDxVCyqrwTSizdj3leJ8ZlfYU5Hyi21Tz3s+PuC/hEPmxDJ3DUIdMdOceu0K3cQr1wwBT9FunqffY99WvLBY1fcAHruxQ8T96/rZB9G+7II6E7SUn+fMz2WgNd4+3tFVSSqKWtCbVyVR+PijiKtddweJ7oU/Y7/M7e8N1IPP2ocg3zseZ/V1ermuBMg2SIuzIPYJpDJo3ymsnwBPyVQtwUy2+tzY5QTU8PithRh6Zed+RH3VngjcUFzxB23hKXpMJ7M1hRYQOG/6oS3KznmmwUwHZntEWZP+1hu4y43aQ6l9fOojTJGLBQ7r3YSePxYc6ms3QMxWKA5M0PZq2oaI3ymai/1QxQmRl0XLBjwKEWyeJBn+HYD0cpgMTvxEAaVIET/37/bkUIebCCdUIEXO8D4zPrr+1cRNJHV5nAAhuwBgcrCumQVZdCBJ7J2Ewt/sLQGZKKKM01oU51MVJyxnocbS7DDshZSE7JTcrvh4G/h3+pajYS3KMJYdq3gvxBhCvlitzQPmEXZkOiSh9s5I7E+JwDonXzOjgZZvdx39Qz7PiR72MhBuSyuxfc7xPbO3qTSfxy6CplaczQbH52kTZl5HBld5Kj5oGEWL1219imfdOz0cfZKeqCmNmH7rxn9ONP63o0lLiDtoGKvb+Ti4BPCvePVTd5ggppBQD/XpA5X7JRmFkaEVA5RHPJZ0M7S8LRotXDu8a85VbDIfiPt2jl//hfw58IGv9OUOetboIKBuqYC5bpcSRQBE01taRHOddXZtKVITMjW2ARtHaRwb+sMacQZIy8I2JBS/a/H223FDYOhFBHcB/dZMHcV2sU3V+GXRsVnyu0eVkqKiDS8ei7beNZezU6SpySb+tEi9nPkXGj/15GlVTaWnw906R6zkvbPYvHcjIQXFnjc3ywL53LKgiJvQWN75FOYdWUMHwHt8f3ancTy52Lula/8lC0/l3ajLeIIwjh7Wx5TvatazXD3Y53X69y2BA3amT15qTGf0fV+1/s20n+E8U0yiNLJ/E5sOsbaGfgDEKGN2XDqqsnKmAeglAMNU65rfQ58TWLoDH5zOnwB7J3SxexLXPtmNZjsPONZiC3hLa9u+/iWjR2mKI0L+O4yFqpKrO3oyae/ZYkU58qg72V3cwLaDmFK9vfKzTdaGgwn6yvSVdYFFRnxerrWqxIiwaqTeLlyay16o X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: aa8e1a93-500e-4e7b-571a-08d94d293829 X-MS-Exchange-CrossTenant-AuthSource: VI1PR04MB5136.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jul 2021 15:56:08.2476 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: vlx5tQ5hTnl7dSOKIvlERxBmzBpVaAtxC2jsCdBl3NyRWd9Zatteat7592XjAlETWLwBVrjofj37dKNsxVOhag== X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR04MB3966 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The mv88e6xxx switches have the ability to receive FORWARD (data plane) frames from the CPU port and route them according to the FDB. We can use this to offload the forwarding process of packets sent by the software bridge. Because DSA supports bridge domain isolation between user ports, just sending FORWARD frames is not enough, as they might leak the intended broadcast domain of the bridge on behalf of which the packets are sent. It should be noted that FORWARD frames are also (and typically) used to forward data plane packets on DSA links in cross-chip topologies. The FORWARD frame header contains the source port and switch ID, and switches receiving this frame header forward the packet according to their cross-chip port-based VLAN table (PVT). To address the bridging domain isolation in the context of offloading the forwarding on TX, the idea is that we can reuse the parts of the PVT that don't have any physical switch mapped to them, one entry for each software bridge. The switches will therefore think that behind their upstream port lie many switches, all in fact backed up by software bridges through tag_dsa.c, which constructs FORWARD packets with the right switch ID corresponding to each bridge. The mapping we use is absolutely trivial: DSA gives us a unique bridge number, and we add the number of the physical switches in the DSA switch tree to that, to obtain a unique virtual bridge device number to use in the PVT. Co-developed-by: Tobias Waldekranz Signed-off-by: Tobias Waldekranz Signed-off-by: Vladimir Oltean Reviewed-by: Florian Fainelli --- v1->v2: keep Tobias' idea, reimplement using just dp->bridge_num instead of hooking a dst->priv pointer and cooking the same thing within mv88e6xxx, drop his authorship since patch is basically rewritten. v2->v4: none v4->v5: rename functions for naming consistency drivers/net/dsa/mv88e6xxx/chip.c | 78 ++++++++++++++++++++++++++++++-- 1 file changed, 74 insertions(+), 4 deletions(-) diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c index beb41572d04e..af764b8445b7 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -1221,14 +1221,36 @@ static u16 mv88e6xxx_port_vlan(struct mv88e6xxx_chip *chip, int dev, int port) bool found = false; u16 pvlan; - list_for_each_entry(dp, &dst->ports, list) { - if (dp->ds->index == dev && dp->index == port) { + /* dev is a physical switch */ + if (dev <= dst->last_switch) { + list_for_each_entry(dp, &dst->ports, list) { + if (dp->ds->index == dev && dp->index == port) { + /* dp might be a DSA link or a user port, so it + * might or might not have a bridge_dev + * pointer. Use the "found" variable for both + * cases. + */ + br = dp->bridge_dev; + found = true; + break; + } + } + /* dev is a virtual bridge */ + } else { + list_for_each_entry(dp, &dst->ports, list) { + if (dp->bridge_num < 0) + continue; + + if (dp->bridge_num + 1 + dst->last_switch != dev) + continue; + + br = dp->bridge_dev; found = true; break; } } - /* Prevent frames from unknown switch or port */ + /* Prevent frames from unknown switch or virtual bridge */ if (!found) return 0; @@ -1236,7 +1258,6 @@ static u16 mv88e6xxx_port_vlan(struct mv88e6xxx_chip *chip, int dev, int port) if (dp->type == DSA_PORT_TYPE_CPU || dp->type == DSA_PORT_TYPE_DSA) return mv88e6xxx_port_mask(chip); - br = dp->bridge_dev; pvlan = 0; /* Frames from user ports can egress any local DSA links and CPU ports, @@ -2422,6 +2443,44 @@ static void mv88e6xxx_crosschip_bridge_leave(struct dsa_switch *ds, mv88e6xxx_reg_unlock(chip); } +/* Treat the software bridge as a virtual single-port switch behind the + * CPU and map in the PVT. First dst->last_switch elements are taken by + * physical switches, so start from beyond that range. + */ +static int mv88e6xxx_map_virtual_bridge_to_pvt(struct dsa_switch *ds, + int bridge_num) +{ + u8 dev = bridge_num + ds->dst->last_switch + 1; + struct mv88e6xxx_chip *chip = ds->priv; + int err; + + mv88e6xxx_reg_lock(chip); + err = mv88e6xxx_pvt_map(chip, dev, 0); + mv88e6xxx_reg_unlock(chip); + + return err; +} + +static int mv88e6xxx_bridge_tx_fwd_offload(struct dsa_switch *ds, int port, + struct net_device *br, + int bridge_num) +{ + return mv88e6xxx_map_virtual_bridge_to_pvt(ds, bridge_num); +} + +static void mv88e6xxx_bridge_tx_fwd_unoffload(struct dsa_switch *ds, int port, + struct net_device *br, + int bridge_num) +{ + int err; + + err = mv88e6xxx_map_virtual_bridge_to_pvt(ds, bridge_num); + if (err) { + dev_err(ds->dev, "failed to remap cross-chip Port VLAN: %pe\n", + ERR_PTR(err)); + } +} + static int mv88e6xxx_software_reset(struct mv88e6xxx_chip *chip) { if (chip->info->ops->reset) @@ -3025,6 +3084,15 @@ static int mv88e6xxx_setup(struct dsa_switch *ds) chip->ds = ds; ds->slave_mii_bus = mv88e6xxx_default_mdio_bus(chip); + /* Since virtual bridges are mapped in the PVT, the number we support + * depends on the physical switch topology. We need to let DSA figure + * that out and therefore we cannot set this at dsa_register_switch() + * time. + */ + if (mv88e6xxx_has_pvt(chip)) + ds->num_fwd_offloading_bridges = MV88E6XXX_MAX_PVT_SWITCHES - + ds->dst->last_switch - 1; + mv88e6xxx_reg_lock(chip); if (chip->info->ops->setup_errata) { @@ -6128,6 +6196,8 @@ static const struct dsa_switch_ops mv88e6xxx_switch_ops = { .crosschip_lag_change = mv88e6xxx_crosschip_lag_change, .crosschip_lag_join = mv88e6xxx_crosschip_lag_join, .crosschip_lag_leave = mv88e6xxx_crosschip_lag_leave, + .port_bridge_tx_fwd_offload = mv88e6xxx_bridge_tx_fwd_offload, + .port_bridge_tx_fwd_unoffload = mv88e6xxx_bridge_tx_fwd_unoffload, }; static int mv88e6xxx_register_switch(struct mv88e6xxx_chip *chip) From patchwork Thu Jul 22 15:55:42 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Oltean X-Patchwork-Id: 484292 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, MSGID_FROM_MTA_HEADER, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 17410C6377D for ; Thu, 22 Jul 2021 15:56:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 001AC6101E for ; Thu, 22 Jul 2021 15:56:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232749AbhGVPPt (ORCPT ); Thu, 22 Jul 2021 11:15:49 -0400 Received: from mail-eopbgr150058.outbound.protection.outlook.com ([40.107.15.58]:4577 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S232727AbhGVPPp (ORCPT ); Thu, 22 Jul 2021 11:15:45 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=FTpA1dYa5XKMNiQ19tu/0RASj6nHTCsG/pnd0IO7axlFgQWopWZUgxGMK0scVy+eLw9WosQOipkp4pXv9UTWIAGQJnhw/nBYmXGfmzbw8A0EqfA9cR3IwIj9iZgEqWM5DCV0ShZoOIewIs5LEfnQg7il/6ygi7bIrPCQtUxYcOSRV/Zw+bqVRrqtrccuDucw7aovydl5QQIcMa2vany/CHoUjyQ2YYyNaVmd9ynnVYRA5ork/XnoF2Ho1P/uXEzKf761vqKqH4vOIuE2ucRsLRGcyPjDQ28IYhneNZEGnauPreOsPa1vB6D/Zy7YTOQ88AtaofHQ/Onl6uVBbAA3Bg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=YnNsmqSGXme7gRFsGv5yZ5vZbFhW8Cd6oNNqhjaTRH8=; b=JYCv8tXVRV7rLuHYS3AF4LugUo9GmjA9yB9UrqwA9AYqdKpi8DKpRkYOTQtrpSSipGbRTZJDJ7ECUEgkAWL9K7PDJ4z3sZSxlHLpYCIq9BiUFTBLB/nSnRMsiicOeyZWsaeAAPo+YhpB3y67I3a+f9RpCgkCUtLt08rsAFZOBj5bSAR08Zura87pGfT0o9bpyZZIZSZOtYaWXBvhUamA16FWeUPdk40f7xfJuJ5ZaVNkj56xulazZWEpeoYDi871FXBHike7xQO7JSCPJ0XCZoY1WUUGoANA2VIc+MraKyITcdLWufkPavrVJiVKKNHyTbfWFZW55MXAdKEkOreJiA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=YnNsmqSGXme7gRFsGv5yZ5vZbFhW8Cd6oNNqhjaTRH8=; b=IfXGzRY6NUEuy60RqzwyKJSVDYQIel+21sC+5d7q/FdYR1O6EW+MF4Uz1dItBtZaXH67yzco1fi+offgq8wfWeHrQDWO8Aga95SuhXQkn0veRPxP2Rsnc4bIfb9zeNB/toOIv+qc754hm6I5ZH6IjN9Eie+8EcGn83RvD/X61/Q= Authentication-Results: vger.kernel.org; dkim=none (message not signed) header.d=none; vger.kernel.org; dmarc=none action=none header.from=nxp.com; Received: from VI1PR04MB5136.eurprd04.prod.outlook.com (2603:10a6:803:55::19) by VI1PR04MB3966.eurprd04.prod.outlook.com (2603:10a6:803:4e::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4331.29; Thu, 22 Jul 2021 15:56:09 +0000 Received: from VI1PR04MB5136.eurprd04.prod.outlook.com ([fe80::109:1995:3e6b:5bd0]) by VI1PR04MB5136.eurprd04.prod.outlook.com ([fe80::109:1995:3e6b:5bd0%2]) with mapi id 15.20.4352.026; Thu, 22 Jul 2021 15:56:09 +0000 From: Vladimir Oltean To: netdev@vger.kernel.org, Jakub Kicinski , "David S. Miller" Cc: Andrew Lunn , Florian Fainelli , Vivien Didelot , Jiri Pirko , Ido Schimmel , Tobias Waldekranz , Roopa Prabhu , Nikolay Aleksandrov , Stephen Hemminger , bridge@lists.linux-foundation.org, Grygorii Strashko , Marek Behun , DENG Qingfang Subject: [PATCH v5 net-next 5/5] net: dsa: tag_dsa: offload the bridge forwarding process Date: Thu, 22 Jul 2021 18:55:42 +0300 Message-Id: <20210722155542.2897921-6-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210722155542.2897921-1-vladimir.oltean@nxp.com> References: <20210722155542.2897921-1-vladimir.oltean@nxp.com> X-ClientProxiedBy: AM3PR07CA0099.eurprd07.prod.outlook.com (2603:10a6:207:6::33) To VI1PR04MB5136.eurprd04.prod.outlook.com (2603:10a6:803:55::19) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from localhost.localdomain (82.76.66.29) by AM3PR07CA0099.eurprd07.prod.outlook.com (2603:10a6:207:6::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4373.9 via Frontend Transport; Thu, 22 Jul 2021 15:56:08 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 91b9aafd-eef8-44b6-9ced-08d94d293918 X-MS-TrafficTypeDiagnostic: VI1PR04MB3966: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:9508; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 6fU2ZNL7rC2VwmCIWldyQc8Vy8hco/4zf9Pdvhg0eNFiCxbNSpSLnj2Tc4Ron9/OSbik/6aYnAw5lAhivl1Y9Ae7nrUjWfYPgTtBNON322/uTYdtXtCSGpBWb1x2c5c1jYDt5A1g2vB4xjyYgpnwMNNJdZWUmg2TOyFPBXh9oRI3BfflfOODIJYRaYQn8yIC6lZFMFVKhDbRaHs3STtt6OxydTm8vc3awbN16Ul7AFQyz9trYvF0cRhCGOZN1cHQr5uYugsmPTBLv+xXt+QWY/6efWKUmHZ2cC5oZxYmCbX5/4B7wV7GQMkLQ6c4jt+XcOk4C9K9DE1V8yB/l4cVHvIEVL+dG1X+vq/sgZ9+HH/iwING2u4xrh5XtEJAlsopv3PjcgoRgdlgtq9UZgnMUwKoTn/0p0io8fYMRbLytMfEQZrHxOG2heNyCiuNqBONPw6qZm515V0h/TNYars2DpgzvvqCCv9HqDTGKgBbM10Bh1hrdrsgM5+DpAhI15ifNMpUlh8LtHJwA+aCQfjtY7etibKZWxgK+konWBeLzULDKVR+qItJHGsWrgKfe8k2J1SVCOtn8GotERucEE9909xBh4qSylVPUOTsKnIik9GM5VH7AOZ7CfilB78G9ek3WO2PoN+OgYy1ChPeCmzdUgRdP7wkoNlbiD+kJnHFT00quXr9sZbF2CsGYrQZ/jbc6APN0JOiDgy7atbTh3x86w== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:VI1PR04MB5136.eurprd04.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(366004)(83380400001)(38350700002)(2616005)(7416002)(316002)(508600001)(86362001)(44832011)(66946007)(110136005)(6506007)(8936002)(4326008)(5660300002)(6512007)(8676002)(54906003)(186003)(66556008)(36756003)(1076003)(6486002)(6666004)(66476007)(52116002)(26005)(2906002)(38100700002)(956004); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: lEPrLuhfdMoECucb4LclJ6IKrCr2NwEHrRvpr9uSBDf8R97Q3WjO0oOz/+gA/8llzWzdYRUw4r+gpCseTWgf5YJeJfEiEWsqdzguFCH8OXJpDNLB2vGOyBhLvhhquRTCPvJcLpxJlIm/dN0S1zD8VjcD+10BayiBr+AXEKoMfa53WrFwzuP8vqZpnkpvuuXy+K5gPKImD6ziA53hrdHst16ZYa1tGv5k6cEjT9i06YIybkRQyXhEIbIv6yLPMM5PkVx10FnIc0th0bBTLewPBnju1v4agbzp+HOuz0TVrhwQVyuWncTyloz09QiuSx4ztk7ogfqt2uVGynhfRobGO4tidyhLFW+tzx5LzoRktEwcN7oZ9+GwRpoyOwqFjUw0y9BSXkRMmhTUKx9fwoDtnQJEDrUWvPWB8f4bKCdH5otblyzjYOfo5YBAJ6/IOkC4YifJfloWxvNLaRbcfTX7NFPAo2XXBpyX+6UsydJex3j7orggGB50GuQD0ez2zRArYicHaRcPzbIHSPKLGaIqp2iXzm6TBLnPe/QgEQipdzJ+ggIsEv5LqGcVptImtGjpWRbHtGs+zWzMUeq1AC7uhg1SxzXQDP5VfTK2w5H3gXYSElRHODZjT1kKJxcddPTiIVHS17OP7ihsWSO7Nsc9m7gCafkPjpxLV8Tr56tUjN1ubUZ1jCZw8fivYf12qc1LHxBQmyPQyRbZyx/sQQv3b8E9NSkzIifMwx2UuJkChp3iVcp4EJ4KVgfp5YRcsAww181E9UpcQO41C1Le7T7NjH5ZXpdXnGVyp7i2XXUN97e8Cmo8bgxqu/asW8Qmaoq3+TKaNRQIRixaPOfs2pKST43ReyASYdegvBzn4t8zQiWILwauDvN6RgpzXR7QHvghHpGTXqttXgDITWwpmVNbzDTJsZckgy9Ubj0uYSeHVVonRf5flI3JuovHOg8rTFVfowuauJNoBFujBhU78a9Hr6Z6IbY1MaQJfk+0IfxYhPvQkaiDscUst2jv0fwN/SF8KqEXFqccj4fB8RujJoyATJwk33exWhV/HPUtJpnI2rxWoY+4ePKdUFpPqRRklsaSI/vr2LlV0RrkY9+xurjsUX424xeq/GRUdciYqYsOJ0CBopGd7GeI/V/UI8C9IYS2xWcAznMbQnC/j4v79hv6TgqD5qtzIgFXDNQu7dvF6ZlB6jW+gbp4igDwiIxA9Z795akGrP7cJKbU6UQvNZ4wkUgNjonb7HLeR1JFfbXQ5J6qwsZJzGk+yG/bm1rrBt4Tf6TDKa40PIo8FzeKeYWMMc0z+vobJqfbcCsFZMou+fSrAgvebo8fG7X7plwgoDdZ X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 91b9aafd-eef8-44b6-9ced-08d94d293918 X-MS-Exchange-CrossTenant-AuthSource: VI1PR04MB5136.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jul 2021 15:56:09.8257 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: YApkR31mPBgtx7ALIqNAD5YOr33E0nCFdo5SozNn/zIm4+W56IVOHurlBvat/f3ZGdhILKkHGVd+e3jw8UyOoA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR04MB3966 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Tobias Waldekranz Allow the DSA tagger to generate FORWARD frames for offloaded skbs sent from a bridge that we offload, allowing the switch to handle any frame replication that may be required. This also means that source address learning takes place on packets sent from the CPU, meaning that return traffic no longer needs to be flooded as unknown unicast. Signed-off-by: Tobias Waldekranz Signed-off-by: Vladimir Oltean --- v1->v2: - use the VLAN from the packet when the bridge is VLAN-aware, and the PVID of the bridge when VLAN-unaware, instead of the PVID of the egress port as the code was originally written - retrieve the sb_dev based on the TX queue mapping of the skb instead of based on the DSA_SKB_CB() populated in the ndo_select_queue() method, because DSA does not have ownership of the skb there yet v2->v3: - use skb->offload_fwd_mark instead of dsa_slave_get_sb_dev() and TX queue mappings - drop the "bool bridge_fwd_offload" v3->v5: - none net/dsa/tag_dsa.c | 52 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/net/dsa/tag_dsa.c b/net/dsa/tag_dsa.c index a822355afc90..0f258218c8cf 100644 --- a/net/dsa/tag_dsa.c +++ b/net/dsa/tag_dsa.c @@ -126,7 +126,42 @@ static struct sk_buff *dsa_xmit_ll(struct sk_buff *skb, struct net_device *dev, u8 extra) { struct dsa_port *dp = dsa_slave_to_port(dev); + u8 tag_dev, tag_port; + enum dsa_cmd cmd; u8 *dsa_header; + u16 pvid = 0; + int err; + + if (skb->offload_fwd_mark) { + struct dsa_switch_tree *dst = dp->ds->dst; + struct net_device *br = dp->bridge_dev; + + cmd = DSA_CMD_FORWARD; + + /* When offloading forwarding for a bridge, inject FORWARD + * packets on behalf of a virtual switch device with an index + * past the physical switches. + */ + tag_dev = dst->last_switch + 1 + dp->bridge_num; + tag_port = 0; + + /* If we are offloading forwarding for a VLAN-unaware bridge, + * inject packets to hardware using the bridge's pvid, since + * that's where the packets ingressed from. + */ + if (!br_vlan_enabled(br)) { + /* Safe because __dev_queue_xmit() runs under + * rcu_read_lock_bh() + */ + err = br_vlan_get_pvid_rcu(br, &pvid); + if (err) + return NULL; + } + } else { + cmd = DSA_CMD_FROM_CPU; + tag_dev = dp->ds->index; + tag_port = dp->index; + } if (skb->protocol == htons(ETH_P_8021Q)) { if (extra) { @@ -134,10 +169,10 @@ static struct sk_buff *dsa_xmit_ll(struct sk_buff *skb, struct net_device *dev, memmove(skb->data, skb->data + extra, 2 * ETH_ALEN); } - /* Construct tagged FROM_CPU DSA tag from 802.1Q tag. */ + /* Construct tagged DSA tag from 802.1Q tag. */ dsa_header = skb->data + 2 * ETH_ALEN + extra; - dsa_header[0] = (DSA_CMD_FROM_CPU << 6) | 0x20 | dp->ds->index; - dsa_header[1] = dp->index << 3; + dsa_header[0] = (cmd << 6) | 0x20 | tag_dev; + dsa_header[1] = tag_port << 3; /* Move CFI field from byte 2 to byte 1. */ if (dsa_header[2] & 0x10) { @@ -148,12 +183,13 @@ static struct sk_buff *dsa_xmit_ll(struct sk_buff *skb, struct net_device *dev, skb_push(skb, DSA_HLEN + extra); memmove(skb->data, skb->data + DSA_HLEN + extra, 2 * ETH_ALEN); - /* Construct untagged FROM_CPU DSA tag. */ + /* Construct untagged DSA tag. */ dsa_header = skb->data + 2 * ETH_ALEN + extra; - dsa_header[0] = (DSA_CMD_FROM_CPU << 6) | dp->ds->index; - dsa_header[1] = dp->index << 3; - dsa_header[2] = 0x00; - dsa_header[3] = 0x00; + + dsa_header[0] = (cmd << 6) | tag_dev; + dsa_header[1] = tag_port << 3; + dsa_header[2] = pvid >> 8; + dsa_header[3] = pvid & 0xff; } return skb;