From patchwork Sun Sep 11 01:06:57 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Oltean X-Patchwork-Id: 12972733 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 48A77C6FA82 for ; Sun, 11 Sep 2022 01:07:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229793AbiIKBHw (ORCPT ); Sat, 10 Sep 2022 21:07:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56682 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229748AbiIKBHu (ORCPT ); Sat, 10 Sep 2022 21:07:50 -0400 Received: from EUR03-DBA-obe.outbound.protection.outlook.com (mail-dbaeur03on2074.outbound.protection.outlook.com [40.107.104.74]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1430C4CA37; Sat, 10 Sep 2022 18:07:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=mi6/+z7eysZ9Pa+WRs/aJ4RDfoJ1CzN3Ixgh6eLpUB2uRBhm3NA2myLD1vXyG8AxVsmMGwlefkIN51kbjks5TTVnLuY9zkVRSQCtAxz9mMPmAGCkSZEV4Qo0qXYrUWZtLDJXe4hPyCrrkjnR5LxgEN4Dd2UqBT8GH8SwilC9HLQ6zUT0ODgBV5mFgo56XRKTIRorg8hGKzrCx7VdU+oQGx4avGxhGXjqM8F3sFB7lqo++0hU+Ca69ycNbd4p2dzmpTM+IpEaKZl8pO4CgqT3ewCEHHS0ydAY5BamMkoEA5Crp7+woZyN+NhbwXN2hNAXKKz15KBZHBYcuJ3tUF3Z7Q== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=+A4/dkzSXUwCMg9f4YqC+L6y2HytbZn3abmRU3tTtWg=; b=f+lYR1MMIKlrOM0Esi22obdZPnrds2I0maAfMNtc2gC2K9w0jUZJS8Ej3oNeDe4rv/SI7OwvaTA4BUEmkOHxVK+kDGYrrYGrJNlj1IXAiYajNEumbHSK3O9CgiqzSPHQqifsQUq1JDOvNTsIwkNtSzcMRURMUrmPAl9EDZR5YrkxuD7vXSkmXwhSxhG9RDHyQFhhxoUQEHYeUAJ/Ee3HfZ2yIa94ain0ZCxtPgg8nk6IkUCaXBFK+6oPOvyYLLMHGI5nuENQomD09LwkbAeeV91UDhecH4XqxSk2SFgYfr/Hoo4DGplRhJ2aGZ8GIk8z4BbNBN2ytz3dQ+BiuZhgpA== 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=+A4/dkzSXUwCMg9f4YqC+L6y2HytbZn3abmRU3tTtWg=; b=Tj6oYcv033f+XcpKF8GknWXWBf5FveNzTs3ESRc/LgwnvKPnlbKNlyUnyDnFBbtwOrg2jux1vxUc/mB1aYGGYzlJKvYKoat8dh0oz+lKO3hqgkvA2STUH1ZI7ZEprJvsmif56adRrT+tOKF0hZqobNHygX8fBewQVs6AhrCS8C0= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM0PR04MB5121.eurprd04.prod.outlook.com (2603:10a6:208:c1::16) by DBBPR04MB7739.eurprd04.prod.outlook.com (2603:10a6:10:1eb::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5612.22; Sun, 11 Sep 2022 01:07:48 +0000 Received: from AM0PR04MB5121.eurprd04.prod.outlook.com ([fe80::5d3b:4f24:dbeb:e292]) by AM0PR04MB5121.eurprd04.prod.outlook.com ([fe80::5d3b:4f24:dbeb:e292%5]) with mapi id 15.20.5612.020; Sun, 11 Sep 2022 01:07:47 +0000 From: Vladimir Oltean To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Florian Fainelli , Vivien Didelot , Andrew Lunn , Vladimir Oltean , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Colin Foster , Roopa Prabhu , Nikolay Aleksandrov , Tobias Waldekranz , =?utf-8?q?Marek_Beh=C3=BAn?= , Ansuel Smith , DENG Qingfang , =?utf-8?q?Alvin_=C5=A0ipraga?= , Linus Walleij , Luiz Angelo Daros de Luca , Felix Fietkau , John Crispin , Sean Wang , David Ahern , Stephen Hemminger Subject: [PATCH v2 net-next 01/10] net: introduce iterators over synced hw addresses Date: Sun, 11 Sep 2022 04:06:57 +0300 Message-Id: <20220911010706.2137967-2-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220911010706.2137967-1-vladimir.oltean@nxp.com> References: <20220911010706.2137967-1-vladimir.oltean@nxp.com> X-ClientProxiedBy: VI1PR08CA0129.eurprd08.prod.outlook.com (2603:10a6:800:d4::31) To AM0PR04MB5121.eurprd04.prod.outlook.com (2603:10a6:208:c1::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB5121:EE_|DBBPR04MB7739:EE_ X-MS-Office365-Filtering-Correlation-Id: 52ebf5b7-4c60-4dff-2442-08da93920a84 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 5mGtS3iPEW2byMu6qbH6d36OGBGHtdMY9ABaStsuJWW4rGQYZLUp6HWJXxtA/hoXRSybq8+lYbYdpxxi30ULi9fDqTfN5AB1dUq/DwfNy9gM87qKLrCsQgkBXvd5kthtiYVr/mjg9d4er2CkGLLEsBbB4elqEIi2YAVrAQRLRhXmM2RMxICAVc6Op9+6/vLyCyoEu14O1YZWjJUsB+6YK5aECse5A6XYzsygwTNpk9K+KoP+cLeaSLpmiG25MRmGk0U9iSYRXA8Qun9Lb8sBCjxyFofEWensezdWlO4etq7UDzlmF534UhaApl9cmkHcZn3cpJmBfl6x4X1LfvK9E2/yjlaHjI5+zq/tgHjjP590mgmuSwiTGLGY7lmxyx5w/HCdk4jvjPHCEgbif52aprjtYgzBV2u3C5p8zB9zRrLJ+zApvtwNT75rdIFiv0PReQ27zgbUOL3q0MmegKbrDr0qgIGffH15y8vhYXO+4K/bFV2EMfJyAUE7HghmQiw/Oj3ULLQe5ke6EzEwjwKjNNPt03TRlmPF/3mPrWjwgTjXTadMQVAG8ll+cNmYfgzAECuIe7x/++vAyxHxOb19UVuICAk/6raKOH0M+44ezfHqpOx8+L199CuBBgLxuB62YvdLnjY37L77Glk6MUY9IKmOe/CHL5a+h6DonCe85yiqe0KUm1QkeWsuEi/nemK+xRBPJP43DRqZ7P86D1PUxo5Sp789KE0ho10Grv93bEqswhuNTtLQvY4mc6Tkhgmv6d94f8zSWrwyssZzyMuFog== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB5121.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230016)(4636009)(346002)(136003)(376002)(39860400002)(396003)(366004)(38100700002)(38350700002)(2906002)(44832011)(83380400001)(2616005)(186003)(1076003)(316002)(66476007)(66556008)(4326008)(8936002)(66946007)(8676002)(54906003)(6916009)(36756003)(7416002)(5660300002)(478600001)(41300700001)(52116002)(6486002)(26005)(6512007)(86362001)(6666004)(6506007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: i4SAk8gUBqPefSMxfGNPOsWDtU4ujqWJfZbi6QbOGzPPZT0GKqio3VriSr1TWBeVj69H7/7vn5OoWrRBEkIxAAizocg/ZxE9tPtepQyov7GOMjIBIpsxDRmhTJ8d/OJ0d6kMbg9kybafLUJHAFzaOMd2MPzHqyqpz5RgmJISY28eFuhmxXkmsie+21N5gt258UzpjAueQwGg2y4Fqz0uQPj5OxUMKyqn/+fZhE59MR7xBabDraCLeXUjgR8xCG8mALUi63/OMBmkgAEuDoC9FhLfkahxrAfP9fwKmaGTx9S9cSTeBrIh43vT6iCaQ0k2IKU1+9YdX420brYdrTFgvtSbPBnpCsq6y1FnTlAjJ8dMIBCbZaxphfBnfelcW2jMzrosuLLZ2UNqFFl4v0GwcLhhxHGtjKenBsqlBU69EYbOg8sccsDiosj2TxsCBMzDHcFYj43unMA8+jFOv4kFNAnIuRz1dNhuG34cB89BTKUnNkI/9pSQA2Epi9UJDfvOkqJdrcHQA8UEEO1VYWONoIxuP6wFboYnCgRuVlEYWlFeT3Q1sP+1Z3lZtCnMpjtvU/mISnRhKzfVObLYVfExRfu+Ftt/1gHO4efsiFc5qtfcMjJh+uka7C6sSI97dCWxbmPkRxIXwynqtZhTHgZBWIuof7ZcTXShHJOKuApew7wh2r6dgjRxtkPPZTni3gxsCiyy+/4ktSg+M8Qy1UfWtnVfqb61IJmsH/NpJuIAodFPQS6bhkUN0Ylu7KaSa66aTppNqMJtiW77Sz00nISGKEXjjJ34a2F1KOYnO2uipi6DQOEbVWIbE9QWYIL0s5UyX8smJb8bmK/flAeDoJf52xe6eHZDx15Q7++bryhL9HjOPZIYnrjXbLnRtrOMSiMOJU30a31IWbjxh0B/kvWLKct2tl+xgapiAwFixJ6lzUwCP9ScL+Y7zm1gvsbxoL1fN8ZxuOayvS6KpUAxMOaIMX7AoMX0N4bvH/4X434aGnOdSooyxgK+kwoBfEO3uXPEipBsOUM/QRfbYq/WJ5/EZincV4BFeP41JvvofH6Eo/e4+TSb05Rs9H0ghqm7eCo2JistFhzSjekY6wImhCfOK1ZrcukJ9NKidbSf132gSY3F1TmB4+5BTNVRdWBDQlGXVoG8aH4/d5LVEV8ethnh0UZcvEPbIzOP9szElu2TZsoK6bj17cj1Bf9J6OBHdTEtw/jRNMj2UAbGuGDEBWTEf/WfFBbw9F3jV71bRK7esodo7GubkSBr5iaj8X7msdajfLJwUpXrIvbenqOV/wpFlgiRAL2L/8dETPoG3MotdBhJLeoMF/LpZ8GqN7hmrNWPIq2JWCtefBPaDYM39i3D5/ROFyXpqNWh6V87gdP4KMRXnAxC6fDoerXzAcIlLRAepyXGS83Fw4JcsMXOaoRhiApzxUmuBSsSPr3mveeQzsCDZxN+GbZXU2nQSdu3iMbro7H577UNfJhX5xRh3cZo1BeGj59zuJmnP9qlIgw3K1RaRutmNyT+EDc96xDDw8rJu3ATX6noLEXBVSUVFNNkCxwTkoOmemEbAuX1N7Cfo2bwruADMW3drBMs+UhdcFl4VZPH5Ky+5b9HOWoGtk3V+w== X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 52ebf5b7-4c60-4dff-2442-08da93920a84 X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB5121.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Sep 2022 01:07:47.8693 (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: Baf8pCoxqEc7z3tpNsjeaG0kg1TDSXVAd+V9CkLaaUqVKxb+nADo7n0vSmlQGXuG4xDWz2hO11c3xUv1Oio9KQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBBPR04MB7739 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org Some network drivers use __dev_mc_sync()/__dev_uc_sync() and therefore program the hardware only with addresses with a non-zero sync_cnt. Some of the above drivers also need to save/restore the address filtering lists when certain events happen, and they need to walk through the struct net_device :: uc and struct net_device :: mc lists. But these lists contain unsynced addresses too. To keep the appearance of an elementary form of data encapsulation, provide iterators through these lists that only look at entries with a non-zero sync_cnt, instead of filtering entries out from device drivers. Signed-off-by: Vladimir Oltean Reviewed-by: Florian Fainelli --- v1->v2: none include/linux/netdevice.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index f0068c1ff1df..9f42fc871c3b 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -253,11 +253,17 @@ struct netdev_hw_addr_list { #define netdev_uc_empty(dev) netdev_hw_addr_list_empty(&(dev)->uc) #define netdev_for_each_uc_addr(ha, dev) \ netdev_hw_addr_list_for_each(ha, &(dev)->uc) +#define netdev_for_each_synced_uc_addr(_ha, _dev) \ + netdev_for_each_uc_addr((_ha), (_dev)) \ + if ((_ha)->sync_cnt) #define netdev_mc_count(dev) netdev_hw_addr_list_count(&(dev)->mc) #define netdev_mc_empty(dev) netdev_hw_addr_list_empty(&(dev)->mc) #define netdev_for_each_mc_addr(ha, dev) \ netdev_hw_addr_list_for_each(ha, &(dev)->mc) +#define netdev_for_each_synced_mc_addr(_ha, _dev) \ + netdev_for_each_mc_addr((_ha), (_dev)) \ + if ((_ha)->sync_cnt) struct hh_cache { unsigned int hh_len; From patchwork Sun Sep 11 01:06:58 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Oltean X-Patchwork-Id: 12972734 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 698EBC6FA82 for ; Sun, 11 Sep 2022 01:08:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229845AbiIKBIE (ORCPT ); Sat, 10 Sep 2022 21:08:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56722 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229516AbiIKBHx (ORCPT ); Sat, 10 Sep 2022 21:07:53 -0400 Received: from EUR03-DBA-obe.outbound.protection.outlook.com (mail-dbaeur03on2087.outbound.protection.outlook.com [40.107.104.87]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id ED6C94CA37; Sat, 10 Sep 2022 18:07:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=YfCwASIIR9r+e1f5EsLHTqRlKlUJn9T9sRNRM6rOjuHqwhexxkDsgrXsRLLbadm0TBN01sk6kpeDrVo6kOuXBkRFupXZsEx+fScgKOF1QLojDenJMyWpJdYvFhfer3dThuT3WitawW2ibHwzfzNbxjVrMB89GKhjq/Pint6e1hAM54RdGwPB9rXx/AbmClb0aESTlNgFIljOWkDvNXwUTkt0iLXjbn++2iOwmuTytpwVcgx2jg2O5Xbn8YPM1dX2xJ1JMp7JSw6R+8jY+3kXjF1Am3cvW48cQuTr/4ZysFj6xdAkwY57ftrpbLAAML4pRH/aUjaWUjRsq4hFG7HKXQ== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=6ToQqEcglcqjmZ173SM51jH0ErDb9r/d6eyJ1qJ0rJ4=; b=hCcYoWTEkBe5TF5Dz4OaYDXx0YX5WO5AAN9PpXWFas4lK41fw7JjHuHOraIgIhnSY0RQkVoL2mHEQ9/2vs75MQHHM7KdSPQxex4texqhms5lDiHQ36iiw+7RdpC5fPgHMSUTQiJv31+ul8Xfuoo2N5v7hfB2gYDyNLS749JDLUVAkOevx6pqTq5q9tRqoNeXKeDN66edUWfQG7RhB428wsGDHzGbKJ9KIxfgajk88EuIB40Q4DCn9uSq3NqksiXxDo0A6Vrpv4tule0l4qRQFR0uiu1BPGKTAnxRlysU6refctWFJXuJvFPp3Cr6oUq9uMSg6ih5VY6xuugQkA0uxA== 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=6ToQqEcglcqjmZ173SM51jH0ErDb9r/d6eyJ1qJ0rJ4=; b=SFdl+bPtnb9zylT3F07i22ydceuXZac86XCBE3haBkMOya5xOZixXWu40Sr1gWLe8UxOOHA0hUQN5CwDYD2GQAgEG5EwuaFaR2iWheYKVhPEXRGqow3amuKx1jfpQZyLaCnY+G44P9PXBqaZKjcRPLSEg4zDTmlhz/U9E2IeWFs= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM0PR04MB5121.eurprd04.prod.outlook.com (2603:10a6:208:c1::16) by DBBPR04MB7739.eurprd04.prod.outlook.com (2603:10a6:10:1eb::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5612.22; Sun, 11 Sep 2022 01:07:50 +0000 Received: from AM0PR04MB5121.eurprd04.prod.outlook.com ([fe80::5d3b:4f24:dbeb:e292]) by AM0PR04MB5121.eurprd04.prod.outlook.com ([fe80::5d3b:4f24:dbeb:e292%5]) with mapi id 15.20.5612.020; Sun, 11 Sep 2022 01:07:50 +0000 From: Vladimir Oltean To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Florian Fainelli , Vivien Didelot , Andrew Lunn , Vladimir Oltean , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Colin Foster , Roopa Prabhu , Nikolay Aleksandrov , Tobias Waldekranz , =?utf-8?q?Marek_Beh=C3=BAn?= , Ansuel Smith , DENG Qingfang , =?utf-8?q?Alvin_=C5=A0ipraga?= , Linus Walleij , Luiz Angelo Daros de Luca , Felix Fietkau , John Crispin , Sean Wang , David Ahern , Stephen Hemminger Subject: [PATCH v2 net-next 02/10] net: dsa: introduce dsa_port_get_master() Date: Sun, 11 Sep 2022 04:06:58 +0300 Message-Id: <20220911010706.2137967-3-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220911010706.2137967-1-vladimir.oltean@nxp.com> References: <20220911010706.2137967-1-vladimir.oltean@nxp.com> X-ClientProxiedBy: VI1PR08CA0129.eurprd08.prod.outlook.com (2603:10a6:800:d4::31) To AM0PR04MB5121.eurprd04.prod.outlook.com (2603:10a6:208:c1::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB5121:EE_|DBBPR04MB7739:EE_ X-MS-Office365-Filtering-Correlation-Id: e8c0c902-d9fc-40a7-7264-08da93920bbc X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: RfLaEvtmyKW5uybUoNh5bSkb5l2VTidhvEdv6+qlVN30Fvc1Gf70FHIGJ/0JswZSKJNTqfFqmN2evUitatEeY2Spy+prTS29kEjTcwrwR2EV2emsO5LrcT9kbkyFgJec4K4s2JeVVWIrPkFNk3PvYtrGkFU/g+TYMSpHj5qoMVvpBWiWMH5MDryuhL/XciKhCXITlokd2Z/6gFcvhx9ySVnIoe6fKgm8mtEw6esyYQBB/JHT4i9a1kjUWVkbuA8WhfBgE3VgKNzYjb85gDv/lMz0RCQNQ1+WRjYUw1fgyAiCckD+5gIYrNCglMl46TvS93eOsIhg2kV1+lKyZ3FWFh+XrAO7JGzfC9brpmuHZxEFu7WMamoeiIRbp0j8UbKDInGTtJvkUfNGtyTWGRUBAfoXkf6U0NHITn77SJ0w/SrYlbByXn0LVYag+TRrNH8OTRrk/CRfzL/xVaXPli2G8Kjr14d6A5Izo4H4nrpUxCj5KpZVq44Ck82yaXBfuNa2hn22coQnRFpNlatc/FoB/DPb+ydEwpfAmrdhqrTCNRs0pBPpvILR9xS+ApnNKN4PZEAIfcTDyI89pANx2KY5peUvzaAWW2VG76AIUVrrew7zNsoObKW3cTFhp7rWKb3XfJM44ePZ6ZLveY9JRUaTqifiAGp/fu6fehi+jGszsJgmMGM/nRn8cXxuSfo1q/aOxHHspEP60jjpFlavqJJ86HGh70EI80WqPqWl9R7H/JOW1vmzQwwDXF6+UwJpN3QRm7h7SFrJsSYGXRu4VcGCHQ== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB5121.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230016)(4636009)(346002)(136003)(376002)(39860400002)(396003)(366004)(38100700002)(38350700002)(30864003)(2906002)(44832011)(83380400001)(2616005)(186003)(1076003)(316002)(66476007)(66556008)(4326008)(8936002)(66946007)(8676002)(54906003)(6916009)(36756003)(7416002)(5660300002)(478600001)(41300700001)(52116002)(6486002)(26005)(6512007)(86362001)(6506007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: mL3CVN5t6IH/r/OvTRZM0nAaAqdlJKsedbyy8AX3Dz8OajGeZXOcVi1J1q7Vm0SEM9HUBhJicw5Im4GRKxeg0pfr5bn0PgHB7g/EDRzB20C3KCwznY1xt5ZbOJOE7YbAO9ckKklr5eHCBot3eAytHByOUIyKoizYgIHqHCp1Vt8IDJIFhr2n0UnIt7AG9QYnHuVNKS7wGU4ZY5H9tQTaIjKUe3EgE5a6t1bL9PMdLYp+CLBXNzjGmvg9Evg9mZ/b4E2lira7A0XFwDgBmV0RcUgkNZGnHxlmqbpeTQu/OmwQo0B6hXfSThDmWLK8y+BcaYoVa9wBue2nEWIS6w96qon3lHlZhQSjWoVe11vQLAHTkVk4ExKrdAF0Jc2yaICJExyTOob34XBkHEtf5y5J/9KLrQaQWiMwnW+VNK86qY7rnmxZfMVGe21ZSzmjC+iENwAVpX+xxnBdOEkY7EovPMhEEkd5N1OBbRyrw/8WU9tiTj65rlBQ0KNjDMxaDwkOf9VJmfnIza+pC7dR0Q+TqpN5zAOzz1xftoYsj8+AU8zbRwRB6Kvg55MLuLTfieuAItg30D3SOMSLWajZumtCnLo4UK8/MeBDUwNFIOYx+5+9g44JGFNx9kHf66bZRXBj4KqXMwhxzs1RCb25Md0UMwwLQvooDcOw2F/VRyWpDLwFExL2A5z0o/t1yKkFv8mUREZGQk7bRb+nw4xFrE7zmnDUk6E6vTJ8h0ZtsSHN3lR5PcD297/ie4IbrvA1q0qFxXa0wvqeiCz4nmCeeTIyvRQfc4FR/P7oVo34sqB7RFoAwo1vlTkx8Hfu9QvWyEXz469/iGMeF58QuWZWNZDiseW8STAlSsJtb2u0L6eH+ilJxWnllXsWojHyysIG5LVOMUtaVcgYku/IEG1ThkWX4UnH2BlsOXSI12hERlYePLtsP9Px0iE8oqlttC/vU5dYgqqNHSBwFtWwPFc9IaA9Ed1cuIeZb6KDh+CruMR0W7pDef5xbtX/wGFyP6Rr68s0WGNKGVI+HK4kea2PyjvOE/R4i0kdchqQCCQPdTxnmjTsfadnqiYMbNKSnv5/xk8sZcXHtonnVYi2p0GY/pQ1lPpMyDrF4VzC5EPDRwVZJrE2YiI+TUwXEQbITz7qTEtvtGiCDbS4YqE+FisTw5NI13NdaLQdgDjKcRMuIG0Aj+lBvN6dDrx9yliamqFBb/FXNk0DkOM5PCkjMroLOgDAsaaHmk8QZICKVRaOSSXvky9TEk4CGEqYGoRQ+OrBqGDNLfytmi8NiemU/wnWEa+p1afjWG7TEnfvTxIVOf8QeZZ3JxJ1RS4gHwDQfY535t58jbNrwn3G6zw6svDl5oLUmWuvIX+z74bkzAQWREbp6qQV6ngqQtqaTOemmVToPORw2rWCix4XKldzqQDb0+W/yVh4UFxmiKMmcnY42TZnBi7Jy5ZkMMRv9PQmzWfXIQmUGWqXaL8l9zqW66++uszb+qY+XwFesmRg+LAuf1g9Dkb3O3arDus9DrJCw1Rq4ewSJkH8oMn0amuyB4Iw6qIwjxNc83mB85ANrooHShI6NLvNiPOYCHkjxUGE4muxQMUKjmKck8JIShde0vKfGO+yOg== X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: e8c0c902-d9fc-40a7-7264-08da93920bbc X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB5121.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Sep 2022 01:07:49.9316 (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: odbVhXvKMucUS63d5fbNILktzkhtQQP9cP36UbZGTgpIYprLs+Ez2N3s/3hKGqu9bQsXdfl1aENSVnUW6p1r4g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBBPR04MB7739 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org There is a desire to support for DSA masters in a LAG. That configuration is intended to work by simply enslaving the master to a bonding/team device. But the physical DSA master (the LAG slave) still has a dev->dsa_ptr, and that cpu_dp still corresponds to the physical CPU port. However, we would like to be able to retrieve the LAG that's the upper of the physical DSA master. In preparation for that, introduce a helper called dsa_port_get_master() that replaces all occurrences of the dp->cpu_dp->master pattern. The distinction between LAG and non-LAG will be made later within the helper itself. Signed-off-by: Vladimir Oltean Reviewed-by: Florian Fainelli --- v1->v2: none drivers/net/dsa/bcm_sf2.c | 4 +-- drivers/net/dsa/bcm_sf2_cfp.c | 4 +-- drivers/net/dsa/lan9303-core.c | 4 +-- .../net/ethernet/mediatek/mtk_ppe_offload.c | 2 +- include/net/dsa.h | 5 ++++ net/dsa/dsa2.c | 8 +++--- net/dsa/dsa_priv.h | 2 +- net/dsa/port.c | 28 +++++++++---------- net/dsa/slave.c | 11 ++++---- net/dsa/tag_8021q.c | 4 +-- 10 files changed, 38 insertions(+), 34 deletions(-) diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c index 572f7450b527..6507663f35e5 100644 --- a/drivers/net/dsa/bcm_sf2.c +++ b/drivers/net/dsa/bcm_sf2.c @@ -983,7 +983,7 @@ static int bcm_sf2_sw_resume(struct dsa_switch *ds) static void bcm_sf2_sw_get_wol(struct dsa_switch *ds, int port, struct ethtool_wolinfo *wol) { - struct net_device *p = dsa_to_port(ds, port)->cpu_dp->master; + struct net_device *p = dsa_port_to_master(dsa_to_port(ds, port)); struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds); struct ethtool_wolinfo pwol = { }; @@ -1007,7 +1007,7 @@ static void bcm_sf2_sw_get_wol(struct dsa_switch *ds, int port, static int bcm_sf2_sw_set_wol(struct dsa_switch *ds, int port, struct ethtool_wolinfo *wol) { - struct net_device *p = dsa_to_port(ds, port)->cpu_dp->master; + struct net_device *p = dsa_port_to_master(dsa_to_port(ds, port)); struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds); s8 cpu_port = dsa_to_port(ds, port)->cpu_dp->index; struct ethtool_wolinfo pwol = { }; diff --git a/drivers/net/dsa/bcm_sf2_cfp.c b/drivers/net/dsa/bcm_sf2_cfp.c index 22bc295bebdb..c4010b7bf089 100644 --- a/drivers/net/dsa/bcm_sf2_cfp.c +++ b/drivers/net/dsa/bcm_sf2_cfp.c @@ -1102,7 +1102,7 @@ static int bcm_sf2_cfp_rule_get_all(struct bcm_sf2_priv *priv, int bcm_sf2_get_rxnfc(struct dsa_switch *ds, int port, struct ethtool_rxnfc *nfc, u32 *rule_locs) { - struct net_device *p = dsa_to_port(ds, port)->cpu_dp->master; + struct net_device *p = dsa_port_to_master(dsa_to_port(ds, port)); struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds); int ret = 0; @@ -1145,7 +1145,7 @@ int bcm_sf2_get_rxnfc(struct dsa_switch *ds, int port, int bcm_sf2_set_rxnfc(struct dsa_switch *ds, int port, struct ethtool_rxnfc *nfc) { - struct net_device *p = dsa_to_port(ds, port)->cpu_dp->master; + struct net_device *p = dsa_port_to_master(dsa_to_port(ds, port)); struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds); int ret = 0; diff --git a/drivers/net/dsa/lan9303-core.c b/drivers/net/dsa/lan9303-core.c index 9e04541c3144..438e46af03e9 100644 --- a/drivers/net/dsa/lan9303-core.c +++ b/drivers/net/dsa/lan9303-core.c @@ -1092,7 +1092,7 @@ static int lan9303_port_enable(struct dsa_switch *ds, int port, if (!dsa_port_is_user(dp)) return 0; - vlan_vid_add(dp->cpu_dp->master, htons(ETH_P_8021Q), port); + vlan_vid_add(dsa_port_to_master(dp), htons(ETH_P_8021Q), port); return lan9303_enable_processing_port(chip, port); } @@ -1105,7 +1105,7 @@ static void lan9303_port_disable(struct dsa_switch *ds, int port) if (!dsa_port_is_user(dp)) return; - vlan_vid_del(dp->cpu_dp->master, htons(ETH_P_8021Q), port); + vlan_vid_del(dsa_port_to_master(dp), htons(ETH_P_8021Q), port); lan9303_disable_processing_port(chip, port); lan9303_phy_write(ds, chip->phy_addr_base + port, MII_BMCR, BMCR_PDOWN); diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c index 25dc3c3aa31d..5a1fc4bcd7a5 100644 --- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c +++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c @@ -173,7 +173,7 @@ mtk_flow_get_dsa_port(struct net_device **dev) if (dp->cpu_dp->tag_ops->proto != DSA_TAG_PROTO_MTK) return -ENODEV; - *dev = dp->cpu_dp->master; + *dev = dsa_port_to_master(dp); return dp->index; #else diff --git a/include/net/dsa.h b/include/net/dsa.h index f2ce12860546..23eac1bda843 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -718,6 +718,11 @@ static inline bool dsa_port_offloads_lag(struct dsa_port *dp, return dsa_port_lag_dev_get(dp) == lag->dev; } +static inline struct net_device *dsa_port_to_master(const struct dsa_port *dp) +{ + return dp->cpu_dp->master; +} + static inline struct net_device *dsa_port_to_bridge_port(const struct dsa_port *dp) { diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c index 4bb0a203b85c..db34240bd0c5 100644 --- a/net/dsa/dsa2.c +++ b/net/dsa/dsa2.c @@ -1273,11 +1273,11 @@ int dsa_tree_change_tag_proto(struct dsa_switch_tree *dst, * attempts to change the tagging protocol. If we ever lift the IFF_UP * restriction, there needs to be another mutex which serializes this. */ - list_for_each_entry(dp, &dst->ports, list) { - if (dsa_port_is_cpu(dp) && (dp->master->flags & IFF_UP)) + dsa_tree_for_each_user_port(dp, dst) { + if (dsa_port_to_master(dp)->flags & IFF_UP) goto out_unlock; - if (dsa_port_is_user(dp) && (dp->slave->flags & IFF_UP)) + if (dp->slave->flags & IFF_UP) goto out_unlock; } @@ -1807,7 +1807,7 @@ void dsa_switch_shutdown(struct dsa_switch *ds) rtnl_lock(); dsa_switch_for_each_user_port(dp, ds) { - master = dp->cpu_dp->master; + master = dsa_port_to_master(dp); slave_dev = dp->slave; netdev_upper_dev_unlink(master, slave_dev); diff --git a/net/dsa/dsa_priv.h b/net/dsa/dsa_priv.h index 614fbba8fe39..c48c5c8ba790 100644 --- a/net/dsa/dsa_priv.h +++ b/net/dsa/dsa_priv.h @@ -322,7 +322,7 @@ dsa_slave_to_master(const struct net_device *dev) { struct dsa_port *dp = dsa_slave_to_port(dev); - return dp->cpu_dp->master; + return dsa_port_to_master(dp); } /* If under a bridge with vlan_filtering=0, make sure to send pvid-tagged diff --git a/net/dsa/port.c b/net/dsa/port.c index 7afc35db0c29..4183e60db4f9 100644 --- a/net/dsa/port.c +++ b/net/dsa/port.c @@ -1026,7 +1026,7 @@ int dsa_port_standalone_host_fdb_add(struct dsa_port *dp, int dsa_port_bridge_host_fdb_add(struct dsa_port *dp, const unsigned char *addr, u16 vid) { - struct dsa_port *cpu_dp = dp->cpu_dp; + struct net_device *master = dsa_port_to_master(dp); struct dsa_db db = { .type = DSA_DB_BRIDGE, .bridge = *dp->bridge, @@ -1037,8 +1037,8 @@ int dsa_port_bridge_host_fdb_add(struct dsa_port *dp, * requires rtnl_lock(), since we can't guarantee that is held here, * and we can't take it either. */ - if (cpu_dp->master->priv_flags & IFF_UNICAST_FLT) { - err = dev_uc_add(cpu_dp->master, addr); + if (master->priv_flags & IFF_UNICAST_FLT) { + err = dev_uc_add(master, addr); if (err) return err; } @@ -1077,15 +1077,15 @@ int dsa_port_standalone_host_fdb_del(struct dsa_port *dp, int dsa_port_bridge_host_fdb_del(struct dsa_port *dp, const unsigned char *addr, u16 vid) { - struct dsa_port *cpu_dp = dp->cpu_dp; + struct net_device *master = dsa_port_to_master(dp); struct dsa_db db = { .type = DSA_DB_BRIDGE, .bridge = *dp->bridge, }; int err; - if (cpu_dp->master->priv_flags & IFF_UNICAST_FLT) { - err = dev_uc_del(cpu_dp->master, addr); + if (master->priv_flags & IFF_UNICAST_FLT) { + err = dev_uc_del(master, addr); if (err) return err; } @@ -1208,14 +1208,14 @@ int dsa_port_standalone_host_mdb_add(const struct dsa_port *dp, int dsa_port_bridge_host_mdb_add(const struct dsa_port *dp, const struct switchdev_obj_port_mdb *mdb) { - struct dsa_port *cpu_dp = dp->cpu_dp; + struct net_device *master = dsa_port_to_master(dp); struct dsa_db db = { .type = DSA_DB_BRIDGE, .bridge = *dp->bridge, }; int err; - err = dev_mc_add(cpu_dp->master, mdb->addr); + err = dev_mc_add(master, mdb->addr); if (err) return err; @@ -1252,14 +1252,14 @@ int dsa_port_standalone_host_mdb_del(const struct dsa_port *dp, int dsa_port_bridge_host_mdb_del(const struct dsa_port *dp, const struct switchdev_obj_port_mdb *mdb) { - struct dsa_port *cpu_dp = dp->cpu_dp; + struct net_device *master = dsa_port_to_master(dp); struct dsa_db db = { .type = DSA_DB_BRIDGE, .bridge = *dp->bridge, }; int err; - err = dev_mc_del(cpu_dp->master, mdb->addr); + err = dev_mc_del(master, mdb->addr); if (err) return err; @@ -1294,19 +1294,19 @@ int dsa_port_host_vlan_add(struct dsa_port *dp, const struct switchdev_obj_port_vlan *vlan, struct netlink_ext_ack *extack) { + struct net_device *master = dsa_port_to_master(dp); struct dsa_notifier_vlan_info info = { .dp = dp, .vlan = vlan, .extack = extack, }; - struct dsa_port *cpu_dp = dp->cpu_dp; int err; err = dsa_port_notify(dp, DSA_NOTIFIER_HOST_VLAN_ADD, &info); if (err && err != -EOPNOTSUPP) return err; - vlan_vid_add(cpu_dp->master, htons(ETH_P_8021Q), vlan->vid); + vlan_vid_add(master, htons(ETH_P_8021Q), vlan->vid); return err; } @@ -1314,18 +1314,18 @@ int dsa_port_host_vlan_add(struct dsa_port *dp, int dsa_port_host_vlan_del(struct dsa_port *dp, const struct switchdev_obj_port_vlan *vlan) { + struct net_device *master = dsa_port_to_master(dp); struct dsa_notifier_vlan_info info = { .dp = dp, .vlan = vlan, }; - struct dsa_port *cpu_dp = dp->cpu_dp; int err; err = dsa_port_notify(dp, DSA_NOTIFIER_HOST_VLAN_DEL, &info); if (err && err != -EOPNOTSUPP) return err; - vlan_vid_del(cpu_dp->master, htons(ETH_P_8021Q), vlan->vid); + vlan_vid_del(master, htons(ETH_P_8021Q), vlan->vid); return err; } diff --git a/net/dsa/slave.c b/net/dsa/slave.c index 345106b1ed78..55094b94a5ae 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c @@ -1503,8 +1503,7 @@ static int dsa_slave_setup_tc_block(struct net_device *dev, static int dsa_slave_setup_ft_block(struct dsa_switch *ds, int port, void *type_data) { - struct dsa_port *cpu_dp = dsa_to_port(ds, port)->cpu_dp; - struct net_device *master = cpu_dp->master; + struct net_device *master = dsa_port_to_master(dsa_to_port(ds, port)); if (!master->netdev_ops->ndo_setup_tc) return -EOPNOTSUPP; @@ -2147,13 +2146,14 @@ static int dsa_slave_fill_forward_path(struct net_device_path_ctx *ctx, struct net_device_path *path) { struct dsa_port *dp = dsa_slave_to_port(ctx->dev); + struct net_device *master = dsa_port_to_master(dp); struct dsa_port *cpu_dp = dp->cpu_dp; path->dev = ctx->dev; path->type = DEV_PATH_DSA; path->dsa.proto = cpu_dp->tag_ops->proto; path->dsa.port = dp->index; - ctx->dev = cpu_dp->master; + ctx->dev = master; return 0; } @@ -2271,9 +2271,9 @@ static int dsa_slave_phy_setup(struct net_device *slave_dev) void dsa_slave_setup_tagger(struct net_device *slave) { struct dsa_port *dp = dsa_slave_to_port(slave); + struct net_device *master = dsa_port_to_master(dp); struct dsa_slave_priv *p = netdev_priv(slave); const struct dsa_port *cpu_dp = dp->cpu_dp; - struct net_device *master = cpu_dp->master; const struct dsa_switch *ds = dp->ds; slave->needed_headroom = cpu_dp->tag_ops->needed_headroom; @@ -2330,8 +2330,7 @@ int dsa_slave_resume(struct net_device *slave_dev) int dsa_slave_create(struct dsa_port *port) { - const struct dsa_port *cpu_dp = port->cpu_dp; - struct net_device *master = cpu_dp->master; + struct net_device *master = dsa_port_to_master(port); struct dsa_switch *ds = port->ds; const char *name = port->name; struct net_device *slave_dev; diff --git a/net/dsa/tag_8021q.c b/net/dsa/tag_8021q.c index b5f80bc45ceb..34e5ec5d3e23 100644 --- a/net/dsa/tag_8021q.c +++ b/net/dsa/tag_8021q.c @@ -330,7 +330,7 @@ static int dsa_tag_8021q_port_setup(struct dsa_switch *ds, int port) if (!dsa_port_is_user(dp)) return 0; - master = dp->cpu_dp->master; + master = dsa_port_to_master(dp); err = dsa_port_tag_8021q_vlan_add(dp, vid, false); if (err) { @@ -359,7 +359,7 @@ static void dsa_tag_8021q_port_teardown(struct dsa_switch *ds, int port) if (!dsa_port_is_user(dp)) return; - master = dp->cpu_dp->master; + master = dsa_port_to_master(dp); dsa_port_tag_8021q_vlan_del(dp, vid, false); From patchwork Sun Sep 11 01:06:59 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Oltean X-Patchwork-Id: 12972735 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 541D0ECAAD5 for ; Sun, 11 Sep 2022 01:08:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229902AbiIKBIZ (ORCPT ); Sat, 10 Sep 2022 21:08:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56886 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229819AbiIKBH5 (ORCPT ); Sat, 10 Sep 2022 21:07:57 -0400 Received: from EUR03-DBA-obe.outbound.protection.outlook.com (mail-dbaeur03on2087.outbound.protection.outlook.com [40.107.104.87]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 028E04D839; Sat, 10 Sep 2022 18:07:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=OScum9tYgrT97Svhu0gjnbiZyH93XJ8Dz6bmZligGbOpjw9X86wl9t+hIjxMVbofjd8Yq40c6xa7Fhf9BI61XrS+OsRnqxxp/lYt81+nb4xWL3xBwPNYms8KkIQietkAfJknAF9y3NIqX4P4qOi4flWdAzzSTYlJP7amk0zfSjF3x+S208ZoJnIRt9t1FmRtF+rboYRmLGSBjZA02kJnuRWIWsELn9LUYAbcx1HdmvWkdy7ChQHdPyE0DJFs0xWEi6aLV6dJBmHnCtZ/X0KqHpzQAdVLYzx6X3WLLY+M9umu5PfJaHPCVo4rH1PdEHkknH+jEESI6UmBzh8LYtj93w== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=O4S4a5Y7NL2/jM4HIHXGl14ja/8efkzgQHOJzQwZAXg=; b=RxqEFzQBYG4JxbLLKROakwu2K3/4UMVNxGqiDCIdZjhSKJlpI353GhvTG8UwHycjCCa/H8EfwG4Z5Xlmsg+kZrHrbHR3+nrvNt9FcYUuBABb2pbl2QXt4raX1Y3dXpTfAwYgQ1Ig8XsfbrXNxsg1HFv6/BiTeED/fSU+TupZqaSq4lk4vq1lW6elqEp8K5He+4iViSs3yI8Y7LjXhbtyDvNObtN92QfFyr0aODPxC1tKg5U+OJjF8rvVZvzuQEgaH5872QFi+upPlM+yzOSKLdNKBUU/z4jjS8iXYFUJBjs+NUeT//7dSo0ltwKWqN0DXymJ833CWGeWtws40cbt7Q== 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=O4S4a5Y7NL2/jM4HIHXGl14ja/8efkzgQHOJzQwZAXg=; b=iyV2Q7clJBrQpLM0K10csN0HV362AEwZtNrzeQNBlkV6TLg2K+6A7V9Nz5wAs9WAiFf7xWOLu34QiyFAo1kDcWzXu7qxJB9sOcY5D4zZxVhK+5dzJwlwVvhMcWAI0bj9Eg0j7R2y7gXFpIzvPJeR64ypProEGwI31smS2j7QlbQ= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM0PR04MB5121.eurprd04.prod.outlook.com (2603:10a6:208:c1::16) by DBBPR04MB7739.eurprd04.prod.outlook.com (2603:10a6:10:1eb::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5612.22; Sun, 11 Sep 2022 01:07:52 +0000 Received: from AM0PR04MB5121.eurprd04.prod.outlook.com ([fe80::5d3b:4f24:dbeb:e292]) by AM0PR04MB5121.eurprd04.prod.outlook.com ([fe80::5d3b:4f24:dbeb:e292%5]) with mapi id 15.20.5612.020; Sun, 11 Sep 2022 01:07:52 +0000 From: Vladimir Oltean To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Florian Fainelli , Vivien Didelot , Andrew Lunn , Vladimir Oltean , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Colin Foster , Roopa Prabhu , Nikolay Aleksandrov , Tobias Waldekranz , =?utf-8?q?Marek_Beh=C3=BAn?= , Ansuel Smith , DENG Qingfang , =?utf-8?q?Alvin_=C5=A0ipraga?= , Linus Walleij , Luiz Angelo Daros de Luca , Felix Fietkau , John Crispin , Sean Wang , David Ahern , Stephen Hemminger Subject: [PATCH v2 net-next 03/10] net: dsa: allow the DSA master to be seen and changed through rtnetlink Date: Sun, 11 Sep 2022 04:06:59 +0300 Message-Id: <20220911010706.2137967-4-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220911010706.2137967-1-vladimir.oltean@nxp.com> References: <20220911010706.2137967-1-vladimir.oltean@nxp.com> X-ClientProxiedBy: VI1PR08CA0129.eurprd08.prod.outlook.com (2603:10a6:800:d4::31) To AM0PR04MB5121.eurprd04.prod.outlook.com (2603:10a6:208:c1::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB5121:EE_|DBBPR04MB7739:EE_ X-MS-Office365-Filtering-Correlation-Id: 4a217534-5eae-4d8b-22d5-08da93920cf7 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: PKitNet7nqAa5UqEw/0wBRUUWsrtjRyLF68DK5TB37voU89kB3kMyuMQlFX6oY+DYIGKu26zHuJjopmP11sRbo7y24+XXtWy91zLZRjtl+NksYJ9Oc21BrvjaHpdqnJlKDie7szhFLycGuXLu3+i22NeLMAtiQNKZHoKNU9N8BHL6rwdR2IhoqqbK4WZDjDuJvsmQSQrFkx8e7UywXy/geT9uWHip2CIaSEPGdNarO9QZtPhDgId1/92GgO27YLPTaQ/w0AxcToC2qrDduNeVVQTzJOpmFXZH/Zxv9i/lQvPdKthocebMsQfVX9kf0Y0E+mPZMgghuL7+Orn9MmZmUw0qmyVlfHgywXX5VBTrxfonUSUa1ry6txEzFhaZ1/aOf16BcpKKV2r2wh3ghjGPmsQXogVwJjmUqrBW9xP1raq4GXfigP1oqH2ZNRZaFZX1BeMr+fqjYfHc7epMjdoDVWSsDeLQKrbSRl9XVwZMrDLn0vLrSpAvuRYgx6DCTNGR6krEeEy6qqG0NBgpw61pd8Mb0wiDPw5q+LVR0D2nUB0wwQxegCKIuiwRbAEGr28btvXhEtl22EjmToIPVcnqwQ/wC0L6RYv1iGrQI1oaTm890Y8rLZDgT6fcDM+C5dilvELoymEQJ5s0CW8dBQCnK3zQnEodQRBjkPAxLB+2y4E18hjNMg5LnCMbJrFAP2C7TqjkskkUAH41BUBeMD1cItKE8oH4KPAwNi6V7BLae2dJbCBhO23cgCqE7SaGK44dblpLlKgo0Lwm2pgVvqWdA== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB5121.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230016)(4636009)(346002)(136003)(376002)(39860400002)(396003)(366004)(38100700002)(38350700002)(30864003)(2906002)(44832011)(83380400001)(2616005)(186003)(1076003)(316002)(66476007)(66556008)(4326008)(8936002)(66946007)(8676002)(54906003)(6916009)(36756003)(7416002)(5660300002)(478600001)(41300700001)(52116002)(6486002)(26005)(6512007)(86362001)(6506007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: xKha6TlW9Wjos7xzCbGN7eSiA3dzN2l83H7LT1GjojfnQAhb20fNY/eK5rIVztN3f8xtpjhC3w5e/Qr3hsst6A09ua+VplmXHo1BjYGqJTu2ST+7wIwvpUUM4LONHZWp3ckcoFqOL+qcwIsVXWlZf2m1Ayq2Ta6j8WdJryiIlI7Dd13AZhXJERcnWXAVMz9NxanWEEbsOkNmXIG/kmaxUG1h+u5Gp0ML2pafDitHbBwU3CpSIKyQd7BV3bwy8e6OMOA+JcOHElG0YYxGdsX21MKcGfxS14Li7rrRva1bx+El3vOe82Viy8lz0ea0yNpHVWWBqtlIXJ0GACIQqm05TrMDzkwtx+Et5FQVFzESCy5Q1BPx8w9A/hQIq4kB9x6wCywvuMrbhw3DaBVxDROFsJ0KiDc9koiBOIOP5Q+xKyVY8mkojwF7t7IdhFsVhQttOahm4k7M1Hih8TECBfBHC4n4AQx7zXGBic+0cerOSD6yzouPWUR5BKslrYfYYcsuhVHRBAre4YDqBPMWbUMGxFa5xWRYsNPWtHY+JmkfjdQhaYrfsMcXvprC0j7Nx8U+vdickkr+jkwJgI9GH+u66koa/OQsUumrH8/M1VFSXfL2ze3rQWAAM1uVUIZAnwd18OAcFZq3a35kecAV88C2L1N9gOAFhC9CsLkXEGjdYs9NgPpIAtfkdiWMVDA3Wy0rKx39q2vM7x4AAqt5KVLo32dyhVO9pQ9pD1urr5x8iRyRoTNY4FFw5OeN9ga7XpRV2nXzZWrve1xsLouMcjbiPVRiIxYUUzGJUTxFHYlvQYDzAk0+NRxXpB5fS+i+wemvLgBxWPWP5TqrzrEdC5CnJ+Xbf+eGLfujv1kHmiy96tKCLr9vFb/RCcRvz04HhLkOgEcpGev9Hb7B8yRfSxCRKIEmepE03DO0yJffAb9o1NPM6ftpkFaa/RoQCdst80zZwrYow6XWpUV3INOWTTkla6mf7a5SOISctkZHy2mqVceHuWa1CD2FbDqZ1lb8l55iq3RjaWDCZ954fHboFlMaIv82o/ZxomX7VDZRVsxdLquLDxlvhf+wgGsGLv+4X+OFOg1VCaif0AUMnpq3bVjDtJrdaGlWxrj17j9/oDrC7OTxglsYchS2LtNitLyc4qqZWfVFFiqbMZO8mGNCcMl9IHE7CPUmNLpj3o3nBlesRn4bVzq40ud3mtkV/V1EXL+hZjh4xax9DWyVT5mitzaqxPxHNLchPDaGU+JfUNmuQeOwN4jADpOWU+mjZmGNgGnBHKgq6c5NZsPaz4wtPzHcRKFrrNn4kkSz357oHYMHdyJtEus0IXbu9ew+4aVJIpmUVRM78DQAjpJUQm1LOaaui6MB9JXnOJY7RcFaFGLU+v89Hyv6wJxyGzYprIWh2Zrstf3bbuBE910O55/F4pFkPhDjRXszoG8LTLUHsx02APFha07mREdoka9EiPGzQgRhvfx/L8OmkOSkycSBwic7rlh1PUZ97OFIAgMHwcirGfizTDhuK7huXtXFXFwmwiCKA6M35TmIgygLW1etSiDqw9Dg/1Y/yUrplcHSoARCqUm/AEk/WvdIVQl4/k1PSvEPu4VyXIJPsCnZivRO/58M0g== X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4a217534-5eae-4d8b-22d5-08da93920cf7 X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB5121.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Sep 2022 01:07:51.9940 (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: JETYzkcFki7rGgRMrQieWCzZjz82bTHYr+qV0bdF0OTZMYK3ntpPpAIwjHbHoPEg3ighyMoo+jMb520u5l8qCQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBBPR04MB7739 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org Some DSA switches have multiple CPU ports, which can be used to improve CPU termination throughput, but DSA, through dsa_tree_setup_cpu_ports(), sets up only the first one, leading to suboptimal use of hardware. The desire is to not change the default configuration but to permit the user to create a dynamic mapping between individual user ports and the CPU port that they are served by, configurable through rtnetlink. It is also intended to permit load balancing between CPU ports, and in that case, the foreseen model is for the DSA master to be a bonding interface whose lowers are the physical DSA masters. To that end, we create a struct rtnl_link_ops for DSA user ports with the "dsa" kind. We expose the IFLA_DSA_MASTER link attribute that contains the ifindex of the newly desired DSA master. Signed-off-by: Vladimir Oltean --- v1->v2: remove unused variable in dsa_port_assign_master include/net/dsa.h | 8 +++ include/uapi/linux/if_link.h | 10 +++ net/dsa/Makefile | 10 ++- net/dsa/dsa.c | 9 +++ net/dsa/dsa2.c | 14 ++++ net/dsa/dsa_priv.h | 10 +++ net/dsa/netlink.c | 62 +++++++++++++++++ net/dsa/port.c | 130 +++++++++++++++++++++++++++++++++++ net/dsa/slave.c | 120 ++++++++++++++++++++++++++++++++ 9 files changed, 372 insertions(+), 1 deletion(-) create mode 100644 net/dsa/netlink.c diff --git a/include/net/dsa.h b/include/net/dsa.h index 23eac1bda843..3f717c3fcba0 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -559,6 +559,10 @@ static inline bool dsa_is_user_port(struct dsa_switch *ds, int p) list_for_each_entry((_dp), &(_dst)->ports, list) \ if (dsa_port_is_user((_dp))) +#define dsa_tree_for_each_user_port_continue_reverse(_dp, _dst) \ + list_for_each_entry_continue_reverse((_dp), &(_dst)->ports, list) \ + if (dsa_port_is_user((_dp))) + #define dsa_tree_for_each_cpu_port(_dp, _dst) \ list_for_each_entry((_dp), &(_dst)->ports, list) \ if (dsa_port_is_cpu((_dp))) @@ -830,6 +834,10 @@ struct dsa_switch_ops { int (*connect_tag_protocol)(struct dsa_switch *ds, enum dsa_tag_protocol proto); + int (*port_change_master)(struct dsa_switch *ds, int port, + struct net_device *master, + struct netlink_ext_ack *extack); + /* Optional switch-wide initialization and destruction methods */ int (*setup)(struct dsa_switch *ds); void (*teardown)(struct dsa_switch *ds); diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h index e36d9d2c65a7..f032414990bc 100644 --- a/include/uapi/linux/if_link.h +++ b/include/uapi/linux/if_link.h @@ -1374,4 +1374,14 @@ enum { #define IFLA_MCTP_MAX (__IFLA_MCTP_MAX - 1) +/* DSA section */ + +enum { + IFLA_DSA_UNSPEC, + IFLA_DSA_MASTER, + __IFLA_DSA_MAX, +}; + +#define IFLA_DSA_MAX (__IFLA_DSA_MAX - 1) + #endif /* _UAPI_LINUX_IF_LINK_H */ diff --git a/net/dsa/Makefile b/net/dsa/Makefile index af28c24ead18..bf57ef3bce2a 100644 --- a/net/dsa/Makefile +++ b/net/dsa/Makefile @@ -1,7 +1,15 @@ # SPDX-License-Identifier: GPL-2.0 # the core obj-$(CONFIG_NET_DSA) += dsa_core.o -dsa_core-y += dsa.o dsa2.o master.o port.o slave.o switch.o tag_8021q.o +dsa_core-y += \ + dsa.o \ + dsa2.o \ + master.o \ + netlink.o \ + port.o \ + slave.o \ + switch.o \ + tag_8021q.o # tagging formats obj-$(CONFIG_NET_DSA_TAG_AR9331) += tag_ar9331.o diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c index be7b320cda76..64b14f655b23 100644 --- a/net/dsa/dsa.c +++ b/net/dsa/dsa.c @@ -536,8 +536,16 @@ static int __init dsa_init_module(void) dsa_tag_driver_register(&DSA_TAG_DRIVER_NAME(none_ops), THIS_MODULE); + rc = rtnl_link_register(&dsa_link_ops); + if (rc) + goto netlink_register_fail; + return 0; +netlink_register_fail: + dsa_tag_driver_unregister(&DSA_TAG_DRIVER_NAME(none_ops)); + dsa_slave_unregister_notifier(); + dev_remove_pack(&dsa_pack_type); register_notifier_fail: destroy_workqueue(dsa_owq); @@ -547,6 +555,7 @@ module_init(dsa_init_module); static void __exit dsa_cleanup_module(void) { + rtnl_link_unregister(&dsa_link_ops); dsa_tag_driver_unregister(&DSA_TAG_DRIVER_NAME(none_ops)); dsa_slave_unregister_notifier(); diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c index db34240bd0c5..44207d848722 100644 --- a/net/dsa/dsa2.c +++ b/net/dsa/dsa2.c @@ -387,6 +387,20 @@ static struct dsa_port *dsa_tree_find_first_cpu(struct dsa_switch_tree *dst) return NULL; } +struct net_device *dsa_tree_find_first_master(struct dsa_switch_tree *dst) +{ + struct device_node *ethernet; + struct net_device *master; + struct dsa_port *cpu_dp; + + cpu_dp = dsa_tree_find_first_cpu(dst); + ethernet = of_parse_phandle(cpu_dp->dn, "ethernet", 0); + master = of_find_net_device_by_node(ethernet); + of_node_put(ethernet); + + return master; +} + /* Assign the default CPU port (the first one in the tree) to all ports of the * fabric which don't already have one as part of their own switch. */ diff --git a/net/dsa/dsa_priv.h b/net/dsa/dsa_priv.h index c48c5c8ba790..d252a04ed725 100644 --- a/net/dsa/dsa_priv.h +++ b/net/dsa/dsa_priv.h @@ -200,6 +200,9 @@ static inline struct net_device *dsa_master_find_slave(struct net_device *dev, return NULL; } +/* netlink.c */ +extern struct rtnl_link_ops dsa_link_ops __read_mostly; + /* port.c */ void dsa_port_set_tag_protocol(struct dsa_port *cpu_dp, const struct dsa_device_ops *tag_ops); @@ -292,6 +295,8 @@ void dsa_port_hsr_leave(struct dsa_port *dp, struct net_device *hsr); int dsa_port_tag_8021q_vlan_add(struct dsa_port *dp, u16 vid, bool broadcast); void dsa_port_tag_8021q_vlan_del(struct dsa_port *dp, u16 vid, bool broadcast); void dsa_port_set_host_flood(struct dsa_port *dp, bool uc, bool mc); +int dsa_port_change_master(struct dsa_port *dp, struct net_device *master, + struct netlink_ext_ack *extack); /* slave.c */ extern const struct dsa_device_ops notag_netdev_ops; @@ -305,8 +310,12 @@ int dsa_slave_suspend(struct net_device *slave_dev); int dsa_slave_resume(struct net_device *slave_dev); int dsa_slave_register_notifier(void); void dsa_slave_unregister_notifier(void); +void dsa_slave_sync_ha(struct net_device *dev); +void dsa_slave_unsync_ha(struct net_device *dev); void dsa_slave_setup_tagger(struct net_device *slave); int dsa_slave_change_mtu(struct net_device *dev, int new_mtu); +int dsa_slave_change_master(struct net_device *dev, struct net_device *master, + struct netlink_ext_ack *extack); int dsa_slave_manage_vlan_filtering(struct net_device *dev, bool vlan_filtering); @@ -542,6 +551,7 @@ void dsa_lag_map(struct dsa_switch_tree *dst, struct dsa_lag *lag); void dsa_lag_unmap(struct dsa_switch_tree *dst, struct dsa_lag *lag); struct dsa_lag *dsa_tree_lag_find(struct dsa_switch_tree *dst, const struct net_device *lag_dev); +struct net_device *dsa_tree_find_first_master(struct dsa_switch_tree *dst); int dsa_tree_notify(struct dsa_switch_tree *dst, unsigned long e, void *v); int dsa_broadcast(unsigned long e, void *v); int dsa_tree_change_tag_proto(struct dsa_switch_tree *dst, diff --git a/net/dsa/netlink.c b/net/dsa/netlink.c new file mode 100644 index 000000000000..0f43bbb94769 --- /dev/null +++ b/net/dsa/netlink.c @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright 2022 NXP + */ +#include +#include + +#include "dsa_priv.h" + +static const struct nla_policy dsa_policy[IFLA_DSA_MAX + 1] = { + [IFLA_DSA_MASTER] = { .type = NLA_U32 }, +}; + +static int dsa_changelink(struct net_device *dev, struct nlattr *tb[], + struct nlattr *data[], + struct netlink_ext_ack *extack) +{ + int err; + + if (!data) + return 0; + + if (data[IFLA_DSA_MASTER]) { + u32 ifindex = nla_get_u32(data[IFLA_DSA_MASTER]); + struct net_device *master; + + master = __dev_get_by_index(dev_net(dev), ifindex); + if (!master) + return -EINVAL; + + err = dsa_slave_change_master(dev, master, extack); + if (err) + return err; + } + + return 0; +} + +static size_t dsa_get_size(const struct net_device *dev) +{ + return nla_total_size(sizeof(u32)) + /* IFLA_DSA_MASTER */ + 0; +} + +static int dsa_fill_info(struct sk_buff *skb, const struct net_device *dev) +{ + struct net_device *master = dsa_slave_to_master(dev); + + if (nla_put_u32(skb, IFLA_DSA_MASTER, master->ifindex)) + return -EMSGSIZE; + + return 0; +} + +struct rtnl_link_ops dsa_link_ops __read_mostly = { + .kind = "dsa", + .priv_size = sizeof(struct dsa_port), + .maxtype = IFLA_DSA_MAX, + .policy = dsa_policy, + .changelink = dsa_changelink, + .get_size = dsa_get_size, + .fill_info = dsa_fill_info, +}; diff --git a/net/dsa/port.c b/net/dsa/port.c index 4183e60db4f9..e557b42de9f2 100644 --- a/net/dsa/port.c +++ b/net/dsa/port.c @@ -7,6 +7,7 @@ */ #include +#include #include #include #include @@ -1374,6 +1375,135 @@ int dsa_port_mrp_del_ring_role(const struct dsa_port *dp, return ds->ops->port_mrp_del_ring_role(ds, dp->index, mrp); } +static int dsa_port_assign_master(struct dsa_port *dp, + struct net_device *master, + struct netlink_ext_ack *extack, + bool fail_on_err) +{ + struct dsa_switch *ds = dp->ds; + int port = dp->index, err; + + err = ds->ops->port_change_master(ds, port, master, extack); + if (err && !fail_on_err) + dev_err(ds->dev, "port %d failed to assign master %s: %pe\n", + port, master->name, ERR_PTR(err)); + + if (err && fail_on_err) + return err; + + dp->cpu_dp = master->dsa_ptr; + + return 0; +} + +/* Change the dp->cpu_dp affinity for a user port. Note that both cross-chip + * notifiers and drivers have implicit assumptions about user-to-CPU-port + * mappings, so we unfortunately cannot delay the deletion of the objects + * (switchdev, standalone addresses, standalone VLANs) on the old CPU port + * until the new CPU port has been set up. So we need to completely tear down + * the old CPU port before changing it, and restore it on errors during the + * bringup of the new one. + */ +int dsa_port_change_master(struct dsa_port *dp, struct net_device *master, + struct netlink_ext_ack *extack) +{ + struct net_device *bridge_dev = dsa_port_bridge_dev_get(dp); + struct net_device *old_master = dsa_port_to_master(dp); + struct net_device *dev = dp->slave; + struct dsa_switch *ds = dp->ds; + bool vlan_filtering; + int err, tmp; + + /* Bridges may hold host FDB, MDB and VLAN objects. These need to be + * migrated, so dynamically unoffload and later reoffload the bridge + * port. + */ + if (bridge_dev) { + dsa_port_pre_bridge_leave(dp, bridge_dev); + dsa_port_bridge_leave(dp, bridge_dev); + } + + /* The port might still be VLAN filtering even if it's no longer + * under a bridge, either due to ds->vlan_filtering_is_global or + * ds->needs_standalone_vlan_filtering. In turn this means VLANs + * on the CPU port. + */ + vlan_filtering = dsa_port_is_vlan_filtering(dp); + if (vlan_filtering) { + err = dsa_slave_manage_vlan_filtering(dev, false); + if (err) { + NL_SET_ERR_MSG_MOD(extack, + "Failed to remove standalone VLANs"); + goto rewind_old_bridge; + } + } + + /* Standalone addresses, and addresses of upper interfaces like + * VLAN, LAG, HSR need to be migrated. + */ + dsa_slave_unsync_ha(dev); + + err = dsa_port_assign_master(dp, master, extack, true); + if (err) + goto rewind_old_addrs; + + dsa_slave_sync_ha(dev); + + if (vlan_filtering) { + err = dsa_slave_manage_vlan_filtering(dev, true); + if (err) { + NL_SET_ERR_MSG_MOD(extack, + "Failed to restore standalone VLANs"); + goto rewind_new_addrs; + } + } + + if (bridge_dev) { + err = dsa_port_bridge_join(dp, bridge_dev, extack); + if (err && err == -EOPNOTSUPP) { + NL_SET_ERR_MSG_MOD(extack, + "Failed to reoffload bridge"); + goto rewind_new_vlan; + } + } + + return 0; + +rewind_new_vlan: + if (vlan_filtering) + dsa_slave_manage_vlan_filtering(dev, false); + +rewind_new_addrs: + dsa_slave_unsync_ha(dev); + + dsa_port_assign_master(dp, old_master, NULL, false); + +/* Restore the objects on the old CPU port */ +rewind_old_addrs: + dsa_slave_sync_ha(dev); + + if (vlan_filtering) { + tmp = dsa_slave_manage_vlan_filtering(dev, true); + if (tmp) { + dev_err(ds->dev, + "port %d failed to restore standalone VLANs: %pe\n", + dp->index, ERR_PTR(tmp)); + } + } + +rewind_old_bridge: + if (bridge_dev) { + tmp = dsa_port_bridge_join(dp, bridge_dev, extack); + if (tmp) { + dev_err(ds->dev, + "port %d failed to rejoin bridge %s: %pe\n", + dp->index, bridge_dev->name, ERR_PTR(tmp)); + } + } + + return err; +} + void dsa_port_set_tag_protocol(struct dsa_port *cpu_dp, const struct dsa_device_ops *tag_ops) { diff --git a/net/dsa/slave.c b/net/dsa/slave.c index 55094b94a5ae..00df6cf07866 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c @@ -164,6 +164,48 @@ static int dsa_slave_unsync_mc(struct net_device *dev, return dsa_slave_schedule_standalone_work(dev, DSA_MC_DEL, addr, 0); } +void dsa_slave_sync_ha(struct net_device *dev) +{ + struct dsa_port *dp = dsa_slave_to_port(dev); + struct dsa_switch *ds = dp->ds; + struct netdev_hw_addr *ha; + + netif_addr_lock_bh(dev); + + netdev_for_each_synced_mc_addr(ha, dev) + dsa_slave_sync_mc(dev, ha->addr); + + netdev_for_each_synced_uc_addr(ha, dev) + dsa_slave_sync_uc(dev, ha->addr); + + netif_addr_unlock_bh(dev); + + if (dsa_switch_supports_uc_filtering(ds) || + dsa_switch_supports_mc_filtering(ds)) + dsa_flush_workqueue(); +} + +void dsa_slave_unsync_ha(struct net_device *dev) +{ + struct dsa_port *dp = dsa_slave_to_port(dev); + struct dsa_switch *ds = dp->ds; + struct netdev_hw_addr *ha; + + netif_addr_lock_bh(dev); + + netdev_for_each_synced_uc_addr(ha, dev) + dsa_slave_unsync_uc(dev, ha->addr); + + netdev_for_each_synced_mc_addr(ha, dev) + dsa_slave_unsync_mc(dev, ha->addr); + + netif_addr_unlock_bh(dev); + + if (dsa_switch_supports_uc_filtering(ds) || + dsa_switch_supports_mc_filtering(ds)) + dsa_flush_workqueue(); +} + /* slave mii_bus handling ***************************************************/ static int dsa_slave_phy_read(struct mii_bus *bus, int addr, int reg) { @@ -2346,6 +2388,7 @@ int dsa_slave_create(struct dsa_port *port) if (slave_dev == NULL) return -ENOMEM; + slave_dev->rtnl_link_ops = &dsa_link_ops; slave_dev->ethtool_ops = &dsa_slave_ethtool_ops; #if IS_ENABLED(CONFIG_DCB) slave_dev->dcbnl_ops = &dsa_slave_dcbnl_ops; @@ -2462,6 +2505,83 @@ void dsa_slave_destroy(struct net_device *slave_dev) free_netdev(slave_dev); } +int dsa_slave_change_master(struct net_device *dev, struct net_device *master, + struct netlink_ext_ack *extack) +{ + struct net_device *old_master = dsa_slave_to_master(dev); + struct dsa_port *dp = dsa_slave_to_port(dev); + struct dsa_switch *ds = dp->ds; + struct net_device *upper; + struct list_head *iter; + int err; + + if (master == old_master) + return 0; + + if (!ds->ops->port_change_master) { + NL_SET_ERR_MSG_MOD(extack, + "Driver does not support changing DSA master"); + return -EOPNOTSUPP; + } + + if (!netdev_uses_dsa(master)) { + NL_SET_ERR_MSG_MOD(extack, + "Interface not eligible as DSA master"); + return -EOPNOTSUPP; + } + + netdev_for_each_upper_dev_rcu(master, upper, iter) { + if (dsa_slave_dev_check(upper)) + continue; + if (netif_is_bridge_master(upper)) + continue; + NL_SET_ERR_MSG_MOD(extack, "Cannot join master with unknown uppers"); + return -EOPNOTSUPP; + } + + /* Since we allow live-changing the DSA master, plus we auto-open the + * DSA master when the user port opens => we need to ensure that the + * new DSA master is open too. + */ + if (dev->flags & IFF_UP) { + err = dev_open(master, extack); + if (err) + return err; + } + + netdev_upper_dev_unlink(old_master, dev); + + err = netdev_upper_dev_link(master, dev, extack); + if (err) + goto out_revert_old_master_unlink; + + err = dsa_port_change_master(dp, master, extack); + if (err) + goto out_revert_master_link; + + /* Update the MTU of the new CPU port through cross-chip notifiers */ + err = dsa_slave_change_mtu(dev, dev->mtu); + if (err && err != -EOPNOTSUPP) { + netdev_warn(dev, + "nonfatal error updating MTU with new master: %pe\n", + ERR_PTR(err)); + } + + /* If the port doesn't have its own MAC address and relies on the DSA + * master's one, inherit it again from the new DSA master. + */ + if (is_zero_ether_addr(dp->mac)) + eth_hw_addr_inherit(dev, master); + + return 0; + +out_revert_master_link: + netdev_upper_dev_unlink(master, dev); +out_revert_old_master_unlink: + netdev_upper_dev_link(old_master, dev, NULL); + return err; +} + bool dsa_slave_dev_check(const struct net_device *dev) { return dev->netdev_ops == &dsa_slave_netdev_ops; From patchwork Sun Sep 11 01:07:00 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Oltean X-Patchwork-Id: 12972736 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 51683C6FA82 for ; Sun, 11 Sep 2022 01:08:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229946AbiIKBIa (ORCPT ); Sat, 10 Sep 2022 21:08:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57480 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229854AbiIKBIY (ORCPT ); Sat, 10 Sep 2022 21:08:24 -0400 Received: from EUR03-DBA-obe.outbound.protection.outlook.com (mail-dbaeur03on2087.outbound.protection.outlook.com [40.107.104.87]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 088F94DB7C; Sat, 10 Sep 2022 18:07:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=KgvyJeJLcw5lfI+tY7RfeOmJQ8OCnYxXbH97NGt9E/My0CXAeHhkEHkDVsLVr8SAHZfYL+CgfPISRF8ohiYGcJcS7jK/hNIW5VDH9vWrfhsFr6H/N8exESD0I3tlhu34TFg2DNemkcdQUhmuWGb/+Xb2DyGl6aY++LYsZXYa7M2iGhwDZLlbwW2oII4MpXVvkUXJhcpK3JUAz82TsiTgrEK6B8Qy360eU6cBTqoXm+B8FWfE7EHVUJWXCmuLOr5LZJVpNW1+6zclUP6OGIFSfYgxuOuT9/TuAtHLUd3G4Z6VpVEr+oNdRZPt1eR4M9Bfvrb2EN1Baio/xr1jUDj9PQ== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=koEEbsSQH5moAwVpw1Mw+jlZOvL+LtehoPvBuAEddTc=; b=RDzhSs+ritseX+1/iKqNct4PGnLq5fHIlvS97+ktcD29IZaCivsOV7C4V1IN7FCoDYRStxmETplhd6iYaqvQNmGJE4/7xMZDNFixFvoUuj1+DKsyOQ2pk/9K1nhe4VOLNGnZo1EO7TjxZ1LaR2t9ujAhUw5JC14dIonl/dtX9/YzUhFUvkhzUIG/SB8rMEXPPNuA07Fga/hXASlMsPsGON2eywVO9+QS5YILcyLt+ZrSzJbZ3Ox2di3g+64w+crBQPZRrJbvVfQwji7wMDouUyxVqL0s6HHVGNu2L1GnMx+kaHp1s0BsOZsrNH1naI2cHg3GdFXQFaQh8MTwxIb+QQ== 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=koEEbsSQH5moAwVpw1Mw+jlZOvL+LtehoPvBuAEddTc=; b=hGWziCAuGxfBEghgtXAHf3NJQEwcG4BGkbM2Uc+DLcxaYuDu7/k/hb+U3+zJTLkncOl7PX3J7gWIQDcOzhB2qeivc7jhE6ssIp/S68dwyasLQftiKybNV1Knt3rirZP4DEtUP1UIB0/SoHasOrT3YRsvKCZ2XtFKTVfpmYBtzXQ= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM0PR04MB5121.eurprd04.prod.outlook.com (2603:10a6:208:c1::16) by DBBPR04MB7739.eurprd04.prod.outlook.com (2603:10a6:10:1eb::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5612.22; Sun, 11 Sep 2022 01:07:54 +0000 Received: from AM0PR04MB5121.eurprd04.prod.outlook.com ([fe80::5d3b:4f24:dbeb:e292]) by AM0PR04MB5121.eurprd04.prod.outlook.com ([fe80::5d3b:4f24:dbeb:e292%5]) with mapi id 15.20.5612.020; Sun, 11 Sep 2022 01:07:54 +0000 From: Vladimir Oltean To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Florian Fainelli , Vivien Didelot , Andrew Lunn , Vladimir Oltean , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Colin Foster , Roopa Prabhu , Nikolay Aleksandrov , Tobias Waldekranz , =?utf-8?q?Marek_Beh=C3=BAn?= , Ansuel Smith , DENG Qingfang , =?utf-8?q?Alvin_=C5=A0ipraga?= , Linus Walleij , Luiz Angelo Daros de Luca , Felix Fietkau , John Crispin , Sean Wang , David Ahern , Stephen Hemminger Subject: [PATCH v2 net-next 04/10] net: dsa: don't keep track of admin/oper state on LAG DSA masters Date: Sun, 11 Sep 2022 04:07:00 +0300 Message-Id: <20220911010706.2137967-5-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220911010706.2137967-1-vladimir.oltean@nxp.com> References: <20220911010706.2137967-1-vladimir.oltean@nxp.com> X-ClientProxiedBy: VI1PR08CA0129.eurprd08.prod.outlook.com (2603:10a6:800:d4::31) To AM0PR04MB5121.eurprd04.prod.outlook.com (2603:10a6:208:c1::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB5121:EE_|DBBPR04MB7739:EE_ X-MS-Office365-Filtering-Correlation-Id: 0019a628-da68-4b85-fa32-08da93920e38 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Mcroubz0iLETtrDhCbtFcsdu7d/lgUV0oRg+MHsBYUSbeRRKKrrpw9o7jpAakQAafdCJepwvZub/XjUBcr9rq/uo+luPL3udt/ia325/hh+bMC+VCuZ5GFAdA+JRog/HGXB7aA1T2zGRZfMDHYbkqdzubY/m2P8qsmzzW7KTEsONPpUvvTjAJfzPODzbwYdRTh3s6kPS9bnVfwV2JZxkMRD9AVZbajksbRBjT/NOsRu3mbuqxABxV3NJ+8a9396mRxREh4o0siBWk11V7QkwoY90WUHkyhVisxLZJYejYyvRM3lmbq+urEp93OYJzmHOL8WfEF2871Q+NBI8FYwPNECySxsQsQ5YNMTeSzaULjvHeZOomJV4SdtxlWbX+6DB+xvMjOoR+Q8gSIuYIoZlATzvRZVfChBodI5NpV317Hox17gYXZ6GkKxmnWfem0joYaAnVM8P4BSqN6ozDqZsAsnlCUj5xgMP4Nmb3mQjmkOp4180I6NZ07OakxzFFZ7kSh0qjzzgK0BkI9CUzJpKV+iMxOTUUGCfLwM0jbwKe1/XsFAAAnyDBKxWbTEt04uUnYwzYvNJCriCGv8tDi9Ridqa5RP0/Dzg8KQu+WfuKFPvk/kGVdH2XWtgBkmDoIkBXyN64jP1I7FtpL4K2o6ncoc4DcedmmhvGos621HXCGxiA8AaMpY0+GMW5rN0w+EQTQW07jrhxdY+Ls16WzBmcL79lXb4Xq97KAW9jMHMiG8hZRZRtzx6XaNezBPToQWVaPd+9ZO55a80aK1sFFJJoHzJ6LJSsjyKBU31gNvUPW8= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB5121.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230016)(4636009)(346002)(136003)(376002)(39860400002)(396003)(366004)(38100700002)(38350700002)(2906002)(44832011)(83380400001)(2616005)(186003)(1076003)(316002)(66476007)(66556008)(4326008)(8936002)(66946007)(8676002)(54906003)(6916009)(36756003)(7416002)(5660300002)(478600001)(41300700001)(52116002)(6486002)(966005)(26005)(6512007)(86362001)(6666004)(6506007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: CmUMlPjnFos/TChckEk2jgb9iGaip0aqYKdJ2AjLLACpL5n6DM2oHcV66QtijeupFyz223EMTnJY9i/3VAyOdkSr0nzeQLuCXOf24gM6K06v/h3bbEeYdSCm/FhoftTWl6OrrnFuHOTW8SgzZHJCshmRH3bGE7MeHrvhro1aCeJxxHJbvbIb+zsmjSlSojEbGDcn9/V8PCC6rfkb+mQMDt5rEifT1Z3cKxInlRKwba2Ws78TrcYmxYtzZfv3jSWVzTQ64DrkH876z+64GhJ3+lWq5biUmxeKaAy3Z6fr8RLuqH5bSxeuAY11yMhhklEPYkCxYZyenVK2UJoUgsmh1Qup7DD78ZgLOISKp+QLUTBjQk6CzV70ZpTgllcuaFNEkQvwyaKEI9xY76UY+hDGBrvLXgjOrA0KJQ5n6biN0dDOkH/WeEYPxULzKJSw3PnCyAkOP5s6KCqjedWObP2OTCQC1FREJd/EYnmexLskbzePZ/AFpkjfY4NR40EJxxu/vlhez5FKelpE65M65FwBxRL5ZUJHNx7dw6w0nVV/Au/rPKhGW9LikYw8IJpbpINH9d7UDr5RPpVEmt+jp/eIuff85S+fgvPZVj2Me2/WjQB9LLV0RTE4Eo2quAmIdQscFN1CxiAEHPxyViiYLEz5qxxE8Jo9U7BkcCI8t+XOiwSaVWt9Zj8aMqCfT5yIewRE4ZBJ2Ms+vm3NfhKZM/JEGneAN7DeAqq71ahp/QFP/t8nrcZmiDo7hwC+dQLCanbRNcq8NsTTgSygBdgQpuKba+0AZpEZ8J6llGGrddTgd5YlYY6jqP2az6G/xYbxucFpolfZ8Q4pnCPtc+Mp5PH6GRAnAPYqZ+uW9plmZoWAwzWcoSYGsym1i1QRPY2znHxZcZB6L4JoB/4L5u6+QRTxDlkDG7i32gOGefSVKnwn97BgZe+q2xcL9uK691jRUxT4DfZGDNFo4i/EOULc5//3raeS6ihIbbYxrqgouj0aIQM3vM1KW/8o/FfViur5RNUwzRFO1sQGsDj+GqnQG0XiJoUHeYZjwrLVQrouMP/fhCOcABLeCDP3CuvZv38VbVu5jG63XyQU2jSDcbPfEB/62/Zv9tZ8UzEDqqwAfGeoslDfQxnPfosCHlJWrhnQKw51pt2SxqEbereWg1hW5KQG5q+QWNzXRjfR/V/eAtf0Gm/n/rQM//6DzL/ONXMfGIoflgZBLGIh0Zypte/iydAUqqmHWChDFC7eK18zXfKeGAmmwuwForMk00KsRnrLr5LnFtFxUxrVb9OPuY+Ea/Sa7bSPwcV/dWafKHBM3CaQG2p/Rffd3eXBDot8fWHuwsqG5h2JM15jHGwV1iTY6sHwI43MHSkhgacjm+xe8okBL/w9Hs/Tb9Gx6bz1pmJeBbSlQFzNyLBa5O37ZosY9bmXcRNzIazlLf7Ky71kb3pwPpUW/iXuqeUdM/yWzkW7WKccye+8yvTq7Q9kRNFzV2HaKUJB0zqcI1rCqhYaRA6vk/gBpVFJIVB+Hn9DJ5ChlLdSdcKrW1bEV6/nWimJRDFPUh7cA9w1fbBE5KAtnYormNB0xX+Xev4SOySjM4MUezkx8mEm32n4KGZlYOBxY2adTA== X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0019a628-da68-4b85-fa32-08da93920e38 X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB5121.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Sep 2022 01:07:54.0719 (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: Wi9dqOHu6IK3xgUvSLvhgG50WENW8zqnZwpQwP63vqwUtoOU+gL/cBZ3TM+adXFm1jhd4EIfByhSUYBowr6JhA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBBPR04MB7739 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org We store information about the DSA master's state in cpu_dp->master_admin_up and cpu_dp->master_oper_up, and this assumes a bijective association between a CPU port and a DSA master. However, when we have CPU ports in a LAG (and DSA masters in a LAG too), the way in which we set up things is that the physical DSA masters still have dev->dsa_ptr pointing to our cpu_dp, but the bonding/team device itself also has its dev->dsa_ptr pointing towards one of the CPU port structures (the first one). So logically speaking, that first cpu_dp can't keep track of both the physical master's admin/oper state, and of the bonding master's state. This isn't even needed; the reason why we keep track of the DSA master's state is to know when it is available for Ethernet-based register access. For that use case, we don't even need LAG; we just need to decide upon one of the physical DSA masters (if there is more than 1 available) and use that. This change suppresses dsa_tree_master_{admin,oper}_state_change() calls on LAG DSA masters (which will be supported in a future change), to allow the tracking of just physical DSA masters. Link: https://lore.kernel.org/netdev/628cc94d.1c69fb81.15b0d.422d@mx.google.com/ Suggested-by: Christian Marangi Signed-off-by: Vladimir Oltean --- v1->v2: none net/dsa/dsa2.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c index 44207d848722..2b324db8ea88 100644 --- a/net/dsa/dsa2.c +++ b/net/dsa/dsa2.c @@ -1336,6 +1336,12 @@ void dsa_tree_master_admin_state_change(struct dsa_switch_tree *dst, struct dsa_port *cpu_dp = master->dsa_ptr; bool notify = false; + /* Don't keep track of admin state on LAG DSA masters, + * but rather just of physical DSA masters + */ + if (netif_is_lag_master(master)) + return; + if ((dsa_port_master_is_operational(cpu_dp)) != (up && cpu_dp->master_oper_up)) notify = true; @@ -1353,6 +1359,12 @@ void dsa_tree_master_oper_state_change(struct dsa_switch_tree *dst, struct dsa_port *cpu_dp = master->dsa_ptr; bool notify = false; + /* Don't keep track of oper state on LAG DSA masters, + * but rather just of physical DSA masters + */ + if (netif_is_lag_master(master)) + return; + if ((dsa_port_master_is_operational(cpu_dp)) != (cpu_dp->master_admin_up && up)) notify = true; From patchwork Sun Sep 11 01:07:01 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Oltean X-Patchwork-Id: 12972737 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C89DFECAAD5 for ; Sun, 11 Sep 2022 01:08:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230037AbiIKBI5 (ORCPT ); Sat, 10 Sep 2022 21:08:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57848 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229953AbiIKBIe (ORCPT ); Sat, 10 Sep 2022 21:08:34 -0400 Received: from EUR03-DBA-obe.outbound.protection.outlook.com (mail-dbaeur03on2087.outbound.protection.outlook.com [40.107.104.87]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E05F94DB74; Sat, 10 Sep 2022 18:08:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=CrnIE/MIBturAXmL6k4M8mNvwrHJ0iVURr4y/H9SQQkR4oYWntPOuFXNW/2iN60dFwGpxggzZ96DxIUG9QlbkdEcw61XdjqvvvFbkhathnlthzyb1/kOq9f/l+l3+NcraGK3l0KYBT9CjwAINWsYcEaLjl4FS5kGPcaEdQK3bA85EUG6dDfkWseVe9LtWrQAXvKIyHrBIxHV4mfBR+cOe/6hoB4VtBl+puUH5exkg4hj6PqNZRLlrtz9YyvgGRo1SfE59B1G1V0friGWN8oPGZ5GNTCtBKrwLyUPQrU9ejWBCHDeS9pAtAuqT/JVw3eijd9hCwixbSznrToGqe1J0w== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=hYcKeotYWpTIb/Z/ZihOIJ95bBlQiOjDJrpLdvaXHkU=; b=edKmBs/y0iP4mIpWCXrDyYe2EdYIAFOQQakXW7jAhwx7fvKGwi4BmRsWYWm/b36Pu5vUbZZPp42MHsVNxET0ENunw6KH4uuQvwlxTXVCCJIYteHy4ezPibSugXeyoiG/+sXBwKuFp5mj6OLH2d9najfFn7FG08O6Bg3A/wTSzQXS5BSK4vsi3OBldMpaKCIYKk36OZ1K6HUcxBPfvSA8YbZVQJw0OwscVUchihh9aUQs1Ti7533BF8B92RL5kNFHe80hcCptsFdvhosqcvCYgZ60ue1MU2+rnTsUu0ILHsIJPAJxu6CTpVhWbvdjP789+PQERtv6p0isQobFGN6PIg== 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=hYcKeotYWpTIb/Z/ZihOIJ95bBlQiOjDJrpLdvaXHkU=; b=YwHnrjFEd1zWM+RBEQbHE/fvvrxxh4MxcytV00L5/P0tOhcBMJHKaKxD9hGvZWYNGr0cRqiYjfRFCozA3Li6ibEfwcNIQGoRs1lDlU8xpnw1bXwQukYy3EXL95nfrLgc5zhRdW5pHUyemXznY89x0dxm9rL4XuGilaCwyC10i80= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM0PR04MB5121.eurprd04.prod.outlook.com (2603:10a6:208:c1::16) by DBBPR04MB7739.eurprd04.prod.outlook.com (2603:10a6:10:1eb::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5612.22; Sun, 11 Sep 2022 01:07:56 +0000 Received: from AM0PR04MB5121.eurprd04.prod.outlook.com ([fe80::5d3b:4f24:dbeb:e292]) by AM0PR04MB5121.eurprd04.prod.outlook.com ([fe80::5d3b:4f24:dbeb:e292%5]) with mapi id 15.20.5612.020; Sun, 11 Sep 2022 01:07:56 +0000 From: Vladimir Oltean To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Florian Fainelli , Vivien Didelot , Andrew Lunn , Vladimir Oltean , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Colin Foster , Roopa Prabhu , Nikolay Aleksandrov , Tobias Waldekranz , =?utf-8?q?Marek_Beh=C3=BAn?= , Ansuel Smith , DENG Qingfang , =?utf-8?q?Alvin_=C5=A0ipraga?= , Linus Walleij , Luiz Angelo Daros de Luca , Felix Fietkau , John Crispin , Sean Wang , David Ahern , Stephen Hemminger Subject: [PATCH v2 net-next 05/10] net: dsa: suppress appending ethtool stats to LAG DSA masters Date: Sun, 11 Sep 2022 04:07:01 +0300 Message-Id: <20220911010706.2137967-6-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220911010706.2137967-1-vladimir.oltean@nxp.com> References: <20220911010706.2137967-1-vladimir.oltean@nxp.com> X-ClientProxiedBy: VI1PR08CA0129.eurprd08.prod.outlook.com (2603:10a6:800:d4::31) To AM0PR04MB5121.eurprd04.prod.outlook.com (2603:10a6:208:c1::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB5121:EE_|DBBPR04MB7739:EE_ X-MS-Office365-Filtering-Correlation-Id: 9d111ed1-84c9-49f9-aa9e-08da93920f73 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: luheTqy2eIM3LcVD1z0LWMQPiT305nkuYQYtJhL2omRGvrMiWXz9x87hPbF+ZdjJsFFH0HpSB+IRRkPk6MDC/T3QwpVXjb2iaQFnj/CZpXoIk4UkPs+l7+fOO9ecSn6jtEs5OviMygsFWaq1OUlRmzboSiVKu6Ec4uji37vWkr0W07rJKBRY5JlCTWWWAlxV52T3ls0lyMYlmRNi5SYdYXWCcehGt+yacJLC6rLOQ8qpbP5T1ZX3PGWvXyJvpw2Y1Kk2OwjV4oEFTX8UCc6EUwSEFE38hF9XvoiLyRfFBRiMipOZfXWGFEuoTuS7dCIJb5kPLkrd1D6ZzBwzrdfi1kl64U5fAfhTEcFPDkCcokvIqRbYIkiK+LZ/ueCFQuZNEDzTiVjweL4pbSLqv9nBhej/BFoST9VDaXNwga1PI4qs16J1q21rlCL7Ofhnqg+fDmdv63/5VQ3ibmfjB27PpxaEozxuz/FSlajnvvOhROGJuUd3w3Ia9/EcdaPFIKYvcJHTysgN6y0kPNTU95VVl+UOFaQMIX+6K/jo2MYuwGKn9KQiqZZ60yqSJt1pSefeTWDI08OAaiSThZ3KD2sqp88GqqA6EKMb7Qo3n4KEpDMwiViwXShPTrV7jNAPcAswge9d8KmvEk5GWHLPhcgNlW5c3g4P3kY5WG9y5SEuMTINAjl6OeNBQDt0K3ysjKxL0TA+WuCcfJ+tY3XSRDasCxQKHU6qkvIWMNG0WATjvF1C7hDaHwthJ+W2jTTLm51W X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB5121.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230016)(4636009)(346002)(136003)(376002)(39860400002)(396003)(366004)(38100700002)(38350700002)(2906002)(44832011)(83380400001)(2616005)(186003)(1076003)(316002)(66476007)(66556008)(4326008)(8936002)(66946007)(8676002)(54906003)(6916009)(36756003)(7416002)(5660300002)(478600001)(41300700001)(52116002)(6486002)(26005)(6512007)(86362001)(6666004)(6506007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: ONVgpCRybybu8cLHXAtJeoiP9h/FaN31ByedFkA4cWyXgH1igMafmYzc0M582DKwH0puTffXgUXfgnBVY+JOJSuMw98+RNZgbFp6BKfzTqN+GQCbpkZvUIbGUJBwZO1ICcDdefhyvOyxY0snj01Cw+YWeftT+JZeDmgckEjgChkmHOTj+61L1/kbwJCnaDkDx73ZUxzcK3FCmuQ8tauco0wN/MFVvU9tgyiDVVEMXL5ZC0LoxyStQJ+FpzvyTTwpUEBWfORhr9BWhO7Ky165L/8nmgRgrVPUUeFVsvosP2wlnDWay1BAitwFqK2TsU9xvZr/eC3jnwwONoTAc+vvo9TZAKAdXV9WS5kgDHdjzZqAG9bZm/QFYvechRaomp5MvsnngTIsJYX03sToIatI0OeBOEx78c/050rhgoAEPbtVQRysg68YAijXwTSj7j4EaQ7imbq0EmecvgRAAAx4ibPRzt3eTI4at/HWbATouqEfz2vXWkibS6ke499v4kX8o/sucBT1S1mHwAUT/3GNKEd2Z6djXvn41h2TM1J/B/WhFjbgqDK5FX1UrHiKYr8Bh2+6uFFGnMGc46folYBmb+Wrjs+RsrCrLbw9mvMMx28sq2uoffcLrEfzp0RXKTkmqzWbDVztCucdtOrCHimS/7/LZRwfl+4o2h7Otvw4Um3vI2l0M/A1/n4AFNMv7DWBuaQ0tAlR5rjNVkFcdm3bbr/BRqyM/PcWbL5VRiKj/8WnUqEVMzLCDGy1mL619WY4yVCIROO43Gd+eKJQZmjZF+i0pTUDZ3a8pJL87tT92YUYo95QH7KhDuhRQwl6J4ahukWwCilFJ/1N0QsMrTiJK7WvfcLYhtk8M6jZgy1Y0E8V3xfsBcnJmZfuDArAI/aQ2L78RtAzfwezbgJgoAwx7AR2rOdADGUh4+ZvWci9FizL45MVB7JcKVteKeVbXhk1HzcSgkg4kBhON7S3XIld+L3BHuuKGIYT7T/scsBkGC1lNF4epQ+pDKSFNLcjwHbUh9aYLodwr3SC8U4KlAu933Om0P2xxxkRWqKxhIyeof2aYUOqbpkDyptWlNA27RwvUyT12QmJAaRw3G+f2hXzlPJHk6ELjpJeD94vhTODlG576mKKqZaMtPSNvSlFD/oh9dr/SjWmVsepnemcQN2Sp7mwAoL6w00ZZ/4cfUNHYT9uJ945qmdduRBEXRUURtOXK8VwLrHlyLtWBNg7K/y5xACQOuvOrakWAHyN7WulMdYsMKnn19CBHGT14SRaJOlW/tCb0EY/HS8Qxopv9NFQOMuWGaqgkzJR+2D8qUqOTvXZ92zHrvo4G/9FM2FlBXSxzig8Um9ZGIhKe2V/AU92PJjpHolc2G7+Egv4yanxKo0p1w9F1C5VPKpjD9yRTPpFiyqEgxDOgfp+XbNj6odqE0CuVSKBQe6neUuSTOkdmmODpT989hh5zdpsc/67bI6Jegm3dAE+Q6Kx+jZM0lM1rDEmJED6RXt0cVkGKVGWp4s/SvRa6EAvf80GEKtD+UkGQPD4X6iIRBjrJVmC6r17uGxo0V4WPViGZ0uvrtgJ8zzmltXk0rGK1lQ96TxZfal8ZMKtFPIvzm5ZdtGMcvpofQ== X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9d111ed1-84c9-49f9-aa9e-08da93920f73 X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB5121.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Sep 2022 01:07:56.1187 (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: +06XHSo/SdLQfTt7+n8P5XwJW4f3aZcTb2MITDuqv+Mtbx1H5DJThvbdUHBu+jxGb8sPqBzCst88+GZwYlVkZQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBBPR04MB7739 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org Similar to the discussion about tracking the admin/oper state of LAG DSA masters, we have the problem here that struct dsa_port *cpu_dp caches a single pair of orig_ethtool_ops and netdev_ops pointers. So if we call dsa_master_setup(bond0, cpu_dp) where cpu_dp is also the dev->dsa_ptr of one of the physical DSA masters, we'd effectively overwrite what we cached from that physical netdev with what replaced from the bonding interface. We don't need DSA ethtool stats on the bonding interface when used as DSA master, it's good enough to have them just on the physical DSA masters, so suppress this logic. Signed-off-by: Vladimir Oltean --- v1->v2: none net/dsa/master.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/net/dsa/master.c b/net/dsa/master.c index fb810edc8281..99d773b24223 100644 --- a/net/dsa/master.c +++ b/net/dsa/master.c @@ -226,6 +226,9 @@ static int dsa_master_ethtool_setup(struct net_device *dev) struct dsa_switch *ds = cpu_dp->ds; struct ethtool_ops *ops; + if (netif_is_lag_master(dev)) + return 0; + ops = devm_kzalloc(ds->dev, sizeof(*ops), GFP_KERNEL); if (!ops) return -ENOMEM; @@ -250,6 +253,9 @@ static void dsa_master_ethtool_teardown(struct net_device *dev) { struct dsa_port *cpu_dp = dev->dsa_ptr; + if (netif_is_lag_master(dev)) + return; + dev->ethtool_ops = cpu_dp->orig_ethtool_ops; cpu_dp->orig_ethtool_ops = NULL; } @@ -257,6 +263,9 @@ static void dsa_master_ethtool_teardown(struct net_device *dev) static void dsa_netdev_ops_set(struct net_device *dev, const struct dsa_netdevice_ops *ops) { + if (netif_is_lag_master(dev)) + return; + dev->dsa_ptr->netdev_ops = ops; } From patchwork Sun Sep 11 01:07:02 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Oltean X-Patchwork-Id: 12972738 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A302EECAAD5 for ; Sun, 11 Sep 2022 01:09:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229988AbiIKBJO (ORCPT ); Sat, 10 Sep 2022 21:09:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58302 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229985AbiIKBIw (ORCPT ); Sat, 10 Sep 2022 21:08:52 -0400 Received: from EUR03-DBA-obe.outbound.protection.outlook.com (mail-dbaeur03on2087.outbound.protection.outlook.com [40.107.104.87]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5D54D4E878; Sat, 10 Sep 2022 18:08:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=JYsxQ7aruYvLPgvPRB8ZvFktJ7Kl+iowDP8mfBwGFcbvsjoiNRGB0Qscw38x+/juMad/mUkCVOH/OkSA+0CsbEYwSMln+iojAGEoFe9kRS/xwty+lbtJjxuHMA2MPqF63hQwbk5Lvomq6VXbKR8Lfg1GXLCdXsaO9dAAEdQNJ95qtkVTnNJD350ejldnRopC1Cg8X2U+06FYBWthjqetcSD+J2lzqSqhaFnBDrFCMgthAU3gFjaaPq2qY87WF23J03SAGXrZLyzPPB52Q4QbaPTtHro8ohVgUeV7R57SZDzcMtHJvCo1ZbRU8uildcPW4pCRHTwa6Nm2ZipzUnFkww== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=lN56njuhXSOm/RvKWISxOOnP8OekVWnKRXEckX0eef8=; b=cF5IuD5NyY2qlZmYZc6BXMqaoAoR5XastqKSASZ1ltGRJh3eEsazeVKCKzmp6S2ZaL7EvsNaLkPvLxH0JMHCPJf8iJ1cyn9sKIFz4C6rPJ0SP0/9WHK+XKK3Nwy+VfYz+UkTcikI47I/XAPug1t7J2JJEy6KAcIdRz01xXY9/VDhQr3Gplp9aPsRomnOuBg8dpBHTpm7SWt46zame00ii+rI9gtjOTpHxEcib6iL5RhRgQpUbllS4Qd8bJZuRue6iOxXPrzt3FQIG0JDvntZVGy1AZdFGCSWyYa7EbvPtURbaPhsgcr2o2pwyvxW3atlAUEkRm+daKf81R0rouZlvg== 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=lN56njuhXSOm/RvKWISxOOnP8OekVWnKRXEckX0eef8=; b=s43uiw76/1kb6AS6j9PkRDVUFjmW5rBwFmpbX4wBApAqbK1D63HwSjXSDYU9H6yNeCRJo8H6Xa9rHyf4wnVRi7c5puiumjhFb7mYGf7WzDazEMepsjsQhbTXdAMVlgiLjOuoFfWrU1ZcvDo0pesOUHI1hTBWcqeW5zY0E2hZyRI= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM0PR04MB5121.eurprd04.prod.outlook.com (2603:10a6:208:c1::16) by DBBPR04MB7739.eurprd04.prod.outlook.com (2603:10a6:10:1eb::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5612.22; Sun, 11 Sep 2022 01:07:58 +0000 Received: from AM0PR04MB5121.eurprd04.prod.outlook.com ([fe80::5d3b:4f24:dbeb:e292]) by AM0PR04MB5121.eurprd04.prod.outlook.com ([fe80::5d3b:4f24:dbeb:e292%5]) with mapi id 15.20.5612.020; Sun, 11 Sep 2022 01:07:58 +0000 From: Vladimir Oltean To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Florian Fainelli , Vivien Didelot , Andrew Lunn , Vladimir Oltean , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Colin Foster , Roopa Prabhu , Nikolay Aleksandrov , Tobias Waldekranz , =?utf-8?q?Marek_Beh=C3=BAn?= , Ansuel Smith , DENG Qingfang , =?utf-8?q?Alvin_=C5=A0ipraga?= , Linus Walleij , Luiz Angelo Daros de Luca , Felix Fietkau , John Crispin , Sean Wang , David Ahern , Stephen Hemminger Subject: [PATCH v2 net-next 06/10] net: dsa: suppress device links to LAG DSA masters Date: Sun, 11 Sep 2022 04:07:02 +0300 Message-Id: <20220911010706.2137967-7-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220911010706.2137967-1-vladimir.oltean@nxp.com> References: <20220911010706.2137967-1-vladimir.oltean@nxp.com> X-ClientProxiedBy: VI1PR08CA0129.eurprd08.prod.outlook.com (2603:10a6:800:d4::31) To AM0PR04MB5121.eurprd04.prod.outlook.com (2603:10a6:208:c1::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB5121:EE_|DBBPR04MB7739:EE_ X-MS-Office365-Filtering-Correlation-Id: 595a4252-7d14-4876-3427-08da939210a7 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 7iPeFrCDmHy+YebxOpEPNlFwQPOV93tyi5LC3uH3UOIcm7nkpXmIH+VVmQxqf5zcPTtXF1fuGnOnJsCg1E5wvZQRTPWQG2y4qJoNFmj4448XNgRPMB/vQtgmbRDEkMNMC9kSXY8EzjK/rrZXysWeppJ1BG52SRQDjcOsNYbor5ImIma74skbLxQ+9j+DDKFAPjLb/SyL+OvNdMDA/qJzHxNg9dsElZadvNy4JvUQY29W6NjXDzGy96tocZ0QBhFks2VCvoxHCSvsX2mfiAt7kfgK/HiL/t145y2BjU24b6JwcF9VNMOEShrKEbek7x6fEhK+aVaewgj05bv0dzkmGyVLTqa4/4Vud0p82gM5ZfRx/4j6dMtkB9IWp/O1ByJ5G/Twb6dg84yvAsiI0ccxTNsoQDxHK4PfyxJ0okThbJvnjAXWGprRt2hSmOQlOWEbkKPkgMMtsyHCy502WMSMuENgt4Zo/bRNJR6GvFJR4sp06q9/7J/W26+BusGHNq00VSwZN0T2eIqwbobmTbCrA8UpfsLBZwhAFgj8rDr06Gn4CbHjtku3YVy4gxgoUgPwLaDFCD8IoXFQvbkBL/bq28/W7atJdyl2pQratVn5MI+9Y2KuDaA2Qa4AUF5kt59XAgZ9L+Ob8eFhsesUWPXEZnBK8eVR014Y3UIB5qFClfopynlHdAMwznDYpzyHEayIa7ZPhzQJoM/wju2YE0HLlSJKIHpBFKmoxmyEwKUN7VS0EtU/0bu169/oVhPaRHm84Vvc305eRtlL2S+eNmBYiw== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB5121.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230016)(4636009)(346002)(136003)(376002)(39860400002)(396003)(366004)(38100700002)(38350700002)(2906002)(44832011)(83380400001)(2616005)(186003)(1076003)(316002)(66476007)(66556008)(4326008)(8936002)(66946007)(8676002)(54906003)(6916009)(36756003)(7416002)(5660300002)(478600001)(41300700001)(52116002)(6486002)(26005)(6512007)(86362001)(6666004)(6506007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: XHYwQDr4DXlvEaFCzC90yEJ73cWTqqBlXQWoRsr8uHTSrXA4HCDg7oFmN2DIPtJ4tJEQiIRN8AixEtDR/KUF1Jdkic4U0dkWgQcwUKA/WNPmNXGaliKS3tQKL4RKUqlIeRYcL8PQnHxHEWX7KlIWlRDNwVOdBT8PTcMgaVzoZ6M5WqiJm0W8LA2/tvV4QvXEP+Vm1LKOpImCs1sY1KvG9qwbzzwtHW2Qq3a/1Ly4vmSZwMey9yryybTCVvvza7pCwiiINtAuaad7shFQK4mwcp7jc1WTOy8KUzMdlQTzbfF0rEIDcZMbUs/963PMHa/kbfSD92fcOpywl5k3BI3e31Z/bx4Cycq4OytNMUc23CaeW/noVtb9P5osrJphqF0TLb+aADMXQKE5j7yZiAbgIXfS/9E6m54gPcnPp/3DRGolgAuxGUxiqkFFQqeCRfH/vw0xAqm6PJijwS2sYv0exHjieTfMTKgkFZHQLaoE6F9QbsYcTbPCR+MXOWfIw0DAdYa1Wes/87YeTmabKyWzjQkn5Q4lhlKWjtoJyAVFS+K3GwEKS2cpK0aWTGPOuc/OwHGM/z1bWg8Jg5bJo9Q5L6TkUbSUhU+ludxyANAufKO/aiwIG05/y+PnQRMmv/pKPSPjaZS60GW3qZ8p+r1k7NCcAq9LOvM/xLkFYd7AxddYH34nf7y8OZCJe5bOoDhKpohLWFuSWrNDDRxrTqkN17mhDZL81FSIiw+LE0FeTk57+hNzPiipkBgdsweCj15m6YTUneX6/QoRpacqD2G9EyYglnEZoXlCpdA0xxlrNcwAYwLuP4swETYb0WTUqJH/SB+Y8Zu80Q+CZINjBysLtSdalBi8UYaX/iZdlbcK0goYGtKRh+YoWvLrkZLTmI4r7yaNqVudgZGoEbWoMuPAl8ouG4EpodecgGlPI7EyQxi/tyIS04G0+FPN4KacNn1VF0UK228IzYFg8GH1hzSz3TF9DEU2PTthZWOUxJyt6gjT88oC2OViQ/JGzJTxZ1zEwVj8fGEnjp2j1pFLfO+B+PM/YGjnCZGZXoOdOOg78Oevvwx+ZGm4UGcuBHqarvMahT6UX+WVg9iXcx4OlizuW6Gyi9Nk/myDCNPxj+nisQFUIycqh5mJ9p2GVT7Dt/Lj7WfFzsw3dktyZgDd/gp8eyQechj6B4ZLu2IRrbVj69ODFK6mSXUrHRpFrSePJdpXvEIystfE1T+7Oym75rQIF3A8SnYW8epiOR+Fd+ipYUaMDNlnPuWgN4NIPCxbopf29zCTRgaY52MeCsXEjFVkUwSGWhwuLssNrcQYiABsqbHsK2+5dFlL8Sj22fevlNdcT5KKwZk9EfSWkRHI34WI4mkucMNmBetwZx88Cpgv0Kabrnf+6HNb6GfFYM24IEIkhUU+e4EbJIPhDzIt05CMqoXwp/BJFIedPd9zm7vS/6QBPftP2PafuR+4SOWZQP0xa6mR1OzBNPxQZ+rJ57Wjj0E1NfNFHfqIwoikvNucdktrRYZfuy9jgVdnpLbkMDFHCCF6Ds9qXo9+meYYQaL9cOXT6OIpsZ81iC2xBhXcy50vixMl70dYnVJiLo3r2zsasIVAQe5iuIMOmbwGvfejaQ== X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 595a4252-7d14-4876-3427-08da939210a7 X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB5121.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Sep 2022 01:07:58.2122 (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: OmTxahTO6Jk1AgeVEBdA0jT1g3hAtWZcAtJ2G4JXB9QxBNcbJ5Sc6siK8cj27ZZXhDZp7IsdbFrd6x6tS7Ggeg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBBPR04MB7739 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org These don't work (print a harmless error about the operation failing) and make little sense to have anyway, because when a LAG DSA master goes away, we will introduce logic to move our CPU port back to the first physical DSA master. So suppress these device links in preparation for adding support for LAG DSA masters. Signed-off-by: Vladimir Oltean --- v1->v2: none net/dsa/master.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/net/dsa/master.c b/net/dsa/master.c index 99d773b24223..2176c14b97a8 100644 --- a/net/dsa/master.c +++ b/net/dsa/master.c @@ -364,12 +364,14 @@ int dsa_master_setup(struct net_device *dev, struct dsa_port *cpu_dp) mtu = ETH_DATA_LEN + dsa_tag_protocol_overhead(tag_ops); /* The DSA master must use SET_NETDEV_DEV for this to work. */ - consumer_link = device_link_add(ds->dev, dev->dev.parent, - DL_FLAG_AUTOREMOVE_CONSUMER); - if (!consumer_link) - netdev_err(dev, - "Failed to create a device link to DSA switch %s\n", - dev_name(ds->dev)); + if (!netif_is_lag_master(dev)) { + consumer_link = device_link_add(ds->dev, dev->dev.parent, + DL_FLAG_AUTOREMOVE_CONSUMER); + if (!consumer_link) + netdev_err(dev, + "Failed to create a device link to DSA switch %s\n", + dev_name(ds->dev)); + } /* The switch driver may not implement ->port_change_mtu(), case in * which dsa_slave_change_mtu() will not update the master MTU either, From patchwork Sun Sep 11 01:07:03 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Oltean X-Patchwork-Id: 12972739 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 49F03ECAAD5 for ; Sun, 11 Sep 2022 01:09:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230003AbiIKBJ0 (ORCPT ); Sat, 10 Sep 2022 21:09:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57848 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229952AbiIKBI4 (ORCPT ); Sat, 10 Sep 2022 21:08:56 -0400 Received: from EUR03-DBA-obe.outbound.protection.outlook.com (mail-dbaeur03on2087.outbound.protection.outlook.com [40.107.104.87]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E75874F3BB; Sat, 10 Sep 2022 18:08:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=UfbNTiX8PzB9KKryKZqmTdVt7tT37Eu0EN8D9nNjmqkg4y/b1NGWmPTVrB86aUjiU6/3uVeq7FedxhbwZmzFzvHDp9F/jezzNiH/z2wXrY7K1PmsyBpbcFLPXDxaYa1nZXFhVaVYzVXi56oZ2T2bIVZsfAIWk5bUav/P7jwR8tS8a2nQmZdn84qrOvdQBhR1FAVCnj658xrDgNAdgcx8Bj473OVX3T+/3nnLRzrMRY1ZPw94OTYlkC9QsBuV1OIgNCHMQP3UlRg61JWzqd4frSygcQ6YT4+27Evakc4+as3EpV/k5bUBfvaDWrwtlV5SG/F+mDM65KB1h0+rMPwURA== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=C37CZpFSk8ZZGkxmG4z2ikV/SN/A4GMTaNE4dxZ4rFE=; b=ZO8yskHZXRL3PwP/QtMDc5DnY3nCC/LsiFR6Pk5ntrqlMzX29CQCaLK2zKSTdk2Lwza1fKY6VYavqyknmstEc0+3lDv26eglKLs3ZEuGZR7e4hafobumNNdKN7lmDOZFDJAOfX5kVluaoIey6JSsDkiN4I0oU0nkR0nqxd7eBFiWTqDnjNxEEJ60HRhmdv7XmT5nQJzSvztW2YDCr0Mk9k/2YUTMHxLRpbK1EpKTbO2txY06w7PTC26sK755485iZz479/9Ly7e2nvZmuWRHuOUYC/uZgVeHl/CLObuheK5bS4p/VgAg+2gOrUhNzQRzkJunXqGhR/KX8XJ4+tgLrw== 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=C37CZpFSk8ZZGkxmG4z2ikV/SN/A4GMTaNE4dxZ4rFE=; b=e+gbMHE6XOGjV5ropXRecwsBPblbJv4USePtyjMWnarCup9T0uG495WeOMKjo0efCa5EGECaduppNBg5dqjZq2qwTAjUB1U+NXqEruwd/Lkp3KqwbMFaX5kdUkCxHzp5C6mkt3rRONzvjf0wEifd6fcqJD2yuZil5N0xg+LmNXk= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM0PR04MB5121.eurprd04.prod.outlook.com (2603:10a6:208:c1::16) by DBBPR04MB7739.eurprd04.prod.outlook.com (2603:10a6:10:1eb::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5612.22; Sun, 11 Sep 2022 01:08:00 +0000 Received: from AM0PR04MB5121.eurprd04.prod.outlook.com ([fe80::5d3b:4f24:dbeb:e292]) by AM0PR04MB5121.eurprd04.prod.outlook.com ([fe80::5d3b:4f24:dbeb:e292%5]) with mapi id 15.20.5612.020; Sun, 11 Sep 2022 01:08:00 +0000 From: Vladimir Oltean To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Florian Fainelli , Vivien Didelot , Andrew Lunn , Vladimir Oltean , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Colin Foster , Roopa Prabhu , Nikolay Aleksandrov , Tobias Waldekranz , =?utf-8?q?Marek_Beh=C3=BAn?= , Ansuel Smith , DENG Qingfang , =?utf-8?q?Alvin_=C5=A0ipraga?= , Linus Walleij , Luiz Angelo Daros de Luca , Felix Fietkau , John Crispin , Sean Wang , David Ahern , Stephen Hemminger Subject: [PATCH v2 net-next 07/10] net: dsa: propagate extack to port_lag_join Date: Sun, 11 Sep 2022 04:07:03 +0300 Message-Id: <20220911010706.2137967-8-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220911010706.2137967-1-vladimir.oltean@nxp.com> References: <20220911010706.2137967-1-vladimir.oltean@nxp.com> X-ClientProxiedBy: VI1PR08CA0129.eurprd08.prod.outlook.com (2603:10a6:800:d4::31) To AM0PR04MB5121.eurprd04.prod.outlook.com (2603:10a6:208:c1::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB5121:EE_|DBBPR04MB7739:EE_ X-MS-Office365-Filtering-Correlation-Id: dab29846-d59c-4c1f-a939-08da939211e6 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: h0QupusroIAQ1KvJv5V9vueDNhwqYnLZQ3rryEWjeO+2LeQaD3Uej4Xsdpq26XZcg/NEKiAu1Sjsdaw3vjPv40l5C00h38VOpz5fAh8gC16BSxPsy+GrkBffJGz5m1lax/1VBwc4XXj22Vr8hlMe20kruHr04VIiAKPsF8HvddC3MkiJ2u1Kn8kTji26uuaioFI5ZnLIzzg68A0gur0Kp0cPARoejxCFAeuxC3wpDzzCkO7hBjP++y3mzWaYEFXF47IiOBmkAJI3VL1h7EcE3SKxErMwBuoI0ImmW+UtLiCVbIGbDwRpRiliaUzI0+0027vKNUWxsbVTs074y1dWTxPILr6EGiUgjUKgzRs2aJdDoDjk0tdjFwMnLe2KVmiq9b+qe4jE39Qza0RL+wtpCP8nACHwvbBd0Z4sP+4dmFpMsKuwM5gluJE1yC+mDiGM2vUTYWp9pcPT5lK7eGFeHtIr6YyzkLUVuhOjB0jAndiZCZLku46ujKcoCsVvRU4QiYfbttbBzJu4xn9NMgkCjzgtHi3/Cq40IbNmBlSSp3gD91QEPMl397+WEPSGK93RtyRFCptH7L4dh9o6abN/a0IdrEFBPAKObjIF5pqwr9W4L5Fp8hULOiwTUt7TPNvHNBwn85uHGa4v0WHPfeW9FVuenOsTU4AYtc1hq0Awj9ava18VZ8ANbp7oT+5uL8VwC6AFcfqPx9nINiUaJ/EBKVhPu8wYOq5QUDS1IES3RGhRJx05WMkL1RRms1CX7sUm9s1N4HJ7b9RE2E6Qtbq0lA== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB5121.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230016)(4636009)(346002)(136003)(376002)(39860400002)(396003)(366004)(38100700002)(38350700002)(30864003)(2906002)(44832011)(83380400001)(2616005)(186003)(1076003)(316002)(66476007)(66556008)(4326008)(8936002)(66946007)(8676002)(54906003)(6916009)(36756003)(7416002)(5660300002)(478600001)(41300700001)(52116002)(6486002)(26005)(6512007)(86362001)(6506007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: qYdyZy3I0JWeRmMeYvJVx4zRMqkhViFMpQQaDT/KA/qN1OUEUBNAup1XGpDdpZCkYVnYocS7cdtFV91CnsywGOnbOvGehbLx6ZcdJycgr6o0BihBzG7O6BJIrk+IGOMqQbn0UdmrGmNatUk5/dVLv5Y2rxoeT0oIDaVfhbU+gM5XmDEwZm05phe7DV1hXbI58qFQMqTN/4GDpfFmAwgvFnwAw6WN29QKU0WY+84mLNYtEr4hDc52d7rRDg1lLrsP1Jkrie/3enzk1qx01KdiijUWGANdFm0qOJ/86XggEMEPrvSh1XhRoUNZOm3/FeAlUsH6it+Albq2pGdSaLJ9I+li9y1BoRBhE/Q9u0Sf9n4thHE4/j2tkgaf/pczPU4JdnNWjqdgZaS/B+5awLWTOJxHUO8hjyZ6PWGnE/MXgmNb6UzcnPYmAvlzddhcrT3lWV0ZnwIwNAzxzHxyOv5H2hs000vLTn3do48wMvZpGME/83dcNryB5r5Are1PBzLcSfJxZ3EXu1CEA3gSeRSuN7UwjBNwYXTqMh64jLfaVEgnr3lQBZ0VWMyA4Dl2ldYOcZd9YRaD+SM1//EOYHCP+VSKwSwQ7vKwuzS9ee0eyo6J+uIj00b/PJ45q3Zwrn2nLgUE4Tk4QdDkKvT8e8xZ1gC9Ymg+aqweZEprANLLZNK7UkLaBcOPPSoMeG7lugph5dSq+ZP2RRsXunQYCyGzaFauH1dUM6ubzxsw7XuxdePFeJ7YYobeiFiRFk7w2mv8cycO3jTX82s/5Bh5Lw0kpNz3LhtV65JFftk9k1DjiCsSTwNJXUqCSMoPQcqM/rzheaXDgPieay22NdgPcIumkFDKirrZ2pp0k2U2Q1At7UGcf0EF4J+Xb35ZrahSoxr+HR/tSmhokkGlno9SxJRwMjgPLqIIbfjVbLsd8wXwyEP4Ccp0oPzyZ5pn/eu/sLWvn+JfBWGw8zwOPRHNEYxqaO0o+6fKEq4QZtDu/u4F3pD/IDA32pvh+tamoDQzJIIg5vxFZutVLnku6QCIB27vmpS4dgVMHZsI62OV9yxf6ic7ty2rxFnxsXPuysI4WUEiw67ZP34jkXqLYI+vf9DgfYx3oCMqxLDN/3BwCYxg36gx0TSWPbqtHd3466TojhsdqBa2vhASqlF5/gg8PuExDY+kcs7i5Qb11UC6bN6d3b0NVq40G7MMX2XHmEWKWs7r1db09Cea/aeqw6J+oMW5kwpbz7BtdwCjP7C2ve6Hj5wcUHSPwAaekQR0luaPr7dat2vjJHpw9EzY15nA1xK0eevWyB8Vm8czHtEVX+Bmk+oVyadj2WDJwmNb4hsYAw5wXThhC/ukdvFeEsEt/J+KdI4y0D/3PQUWDzhyloFmXNp25Z0u4gfbV573AoQ0vZ9piyEB3CukvP758tZKl+0qv/LxHo249C/Z4w9VGxSqTmi69evgvBHbPJcBMF0OYq8+/TDLDePEyjpYweeGNmgkhJWMuVl4EOQHUoX6sWt+DuR9hmvbpu1eRiiXynWqsmeqAtcgvhxGYK6TLpRIQxaheJIzN70WhH6DdeHRaoUwgwm6kKzmerfrKRA0t278ZdOjlXyufEOCkQP7uip0Z22mzQ== X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: dab29846-d59c-4c1f-a939-08da939211e6 X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB5121.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Sep 2022 01:08:00.2902 (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: BBt20KVS9bfbQ0VMuDykADYEgoPfY6yBImYDEM8sY7TNOem7ewXhVma9bH3/h4AIxP73ui9bnesPTMxtmX5ZQw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBBPR04MB7739 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org Drivers could refuse to offload a LAG configuration for a variety of reasons, mainly having to do with its TX type. Additionally, since DSA masters may now also be LAG interfaces, and this will translate into a call to port_lag_join on the CPU ports, there may be extra restrictions there. Propagate the netlink extack to this DSA method in order for drivers to give a meaningful error message back to the user. Signed-off-by: Vladimir Oltean --- v1->v2: patch is new drivers/net/dsa/mv88e6xxx/chip.c | 27 ++++++++++++++++++-------- drivers/net/dsa/ocelot/felix.c | 5 +++-- drivers/net/dsa/qca/qca8k-common.c | 23 ++++++++++++++++------ drivers/net/dsa/qca/qca8k.h | 3 ++- drivers/net/ethernet/mscc/ocelot.c | 8 ++++++-- drivers/net/ethernet/mscc/ocelot_net.c | 7 +++---- include/net/dsa.h | 6 ++++-- include/soc/mscc/ocelot.h | 3 ++- net/dsa/dsa_priv.h | 1 + net/dsa/port.c | 1 + net/dsa/switch.c | 4 ++-- 11 files changed, 60 insertions(+), 28 deletions(-) diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c index 6f4ea39ab466..5f178faa110f 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -6593,14 +6593,17 @@ static int mv88e6xxx_port_bridge_flags(struct dsa_switch *ds, int port, static bool mv88e6xxx_lag_can_offload(struct dsa_switch *ds, struct dsa_lag lag, - struct netdev_lag_upper_info *info) + struct netdev_lag_upper_info *info, + struct netlink_ext_ack *extack) { struct mv88e6xxx_chip *chip = ds->priv; struct dsa_port *dp; int members = 0; - if (!mv88e6xxx_has_lag(chip)) + if (!mv88e6xxx_has_lag(chip)) { + NL_SET_ERR_MSG_MOD(extack, "Chip does not support LAG offload"); return false; + } if (!lag.id) return false; @@ -6609,14 +6612,20 @@ static bool mv88e6xxx_lag_can_offload(struct dsa_switch *ds, /* Includes the port joining the LAG */ members++; - if (members > 8) + if (members > 8) { + NL_SET_ERR_MSG_MOD(extack, + "Cannot offload more than 8 LAG ports"); return false; + } /* We could potentially relax this to include active * backup in the future. */ - if (info->tx_type != NETDEV_LAG_TX_TYPE_HASH) + if (info->tx_type != NETDEV_LAG_TX_TYPE_HASH) { + NL_SET_ERR_MSG_MOD(extack, + "Can only offload LAG using hash TX type"); return false; + } /* Ideally we would also validate that the hash type matches * the hardware. Alas, this is always set to unknown on team @@ -6769,12 +6778,13 @@ static int mv88e6xxx_port_lag_change(struct dsa_switch *ds, int port) static int mv88e6xxx_port_lag_join(struct dsa_switch *ds, int port, struct dsa_lag lag, - struct netdev_lag_upper_info *info) + struct netdev_lag_upper_info *info, + struct netlink_ext_ack *extack) { struct mv88e6xxx_chip *chip = ds->priv; int err, id; - if (!mv88e6xxx_lag_can_offload(ds, lag, info)) + if (!mv88e6xxx_lag_can_offload(ds, lag, info, extack)) return -EOPNOTSUPP; /* DSA LAG IDs are one-based */ @@ -6827,12 +6837,13 @@ static int mv88e6xxx_crosschip_lag_change(struct dsa_switch *ds, int sw_index, static int mv88e6xxx_crosschip_lag_join(struct dsa_switch *ds, int sw_index, int port, struct dsa_lag lag, - struct netdev_lag_upper_info *info) + struct netdev_lag_upper_info *info, + struct netlink_ext_ack *extack) { struct mv88e6xxx_chip *chip = ds->priv; int err; - if (!mv88e6xxx_lag_can_offload(ds, lag, info)) + if (!mv88e6xxx_lag_can_offload(ds, lag, info, extack)) return -EOPNOTSUPP; mv88e6xxx_reg_lock(chip); diff --git a/drivers/net/dsa/ocelot/felix.c b/drivers/net/dsa/ocelot/felix.c index c73ef5f7aa64..82dcc21a7172 100644 --- a/drivers/net/dsa/ocelot/felix.c +++ b/drivers/net/dsa/ocelot/felix.c @@ -861,11 +861,12 @@ static void felix_bridge_leave(struct dsa_switch *ds, int port, static int felix_lag_join(struct dsa_switch *ds, int port, struct dsa_lag lag, - struct netdev_lag_upper_info *info) + struct netdev_lag_upper_info *info, + struct netlink_ext_ack *extack) { struct ocelot *ocelot = ds->priv; - return ocelot_port_lag_join(ocelot, port, lag.dev, info); + return ocelot_port_lag_join(ocelot, port, lag.dev, info, extack); } static int felix_lag_leave(struct dsa_switch *ds, int port, diff --git a/drivers/net/dsa/qca/qca8k-common.c b/drivers/net/dsa/qca/qca8k-common.c index bba95613e218..fb45b598847b 100644 --- a/drivers/net/dsa/qca/qca8k-common.c +++ b/drivers/net/dsa/qca/qca8k-common.c @@ -1017,7 +1017,8 @@ int qca8k_port_vlan_del(struct dsa_switch *ds, int port, static bool qca8k_lag_can_offload(struct dsa_switch *ds, struct dsa_lag lag, - struct netdev_lag_upper_info *info) + struct netdev_lag_upper_info *info, + struct netlink_ext_ack *extack) { struct dsa_port *dp; int members = 0; @@ -1029,15 +1030,24 @@ static bool qca8k_lag_can_offload(struct dsa_switch *ds, /* Includes the port joining the LAG */ members++; - if (members > QCA8K_NUM_PORTS_FOR_LAG) + if (members > QCA8K_NUM_PORTS_FOR_LAG) { + NL_SET_ERR_MSG_MOD(extack, + "Cannot offload more than 4 LAG ports"); return false; + } - if (info->tx_type != NETDEV_LAG_TX_TYPE_HASH) + if (info->tx_type != NETDEV_LAG_TX_TYPE_HASH) { + NL_SET_ERR_MSG_MOD(extack, + "Can only offload LAG using hash TX type"); return false; + } if (info->hash_type != NETDEV_LAG_HASH_L2 && - info->hash_type != NETDEV_LAG_HASH_L23) + info->hash_type != NETDEV_LAG_HASH_L23) { + NL_SET_ERR_MSG_MOD(extack, + "Can only offload L2 or L2+L3 TX hash"); return false; + } return true; } @@ -1160,11 +1170,12 @@ static int qca8k_lag_refresh_portmap(struct dsa_switch *ds, int port, } int qca8k_port_lag_join(struct dsa_switch *ds, int port, struct dsa_lag lag, - struct netdev_lag_upper_info *info) + struct netdev_lag_upper_info *info, + struct netlink_ext_ack *extack) { int ret; - if (!qca8k_lag_can_offload(ds, lag, info)) + if (!qca8k_lag_can_offload(ds, lag, info, extack)) return -EOPNOTSUPP; ret = qca8k_lag_setup_hash(ds, lag, info); diff --git a/drivers/net/dsa/qca/qca8k.h b/drivers/net/dsa/qca/qca8k.h index e36ecc9777f4..0b7a5cb12321 100644 --- a/drivers/net/dsa/qca/qca8k.h +++ b/drivers/net/dsa/qca/qca8k.h @@ -512,7 +512,8 @@ int qca8k_port_vlan_del(struct dsa_switch *ds, int port, /* Common port LAG function */ int qca8k_port_lag_join(struct dsa_switch *ds, int port, struct dsa_lag lag, - struct netdev_lag_upper_info *info); + struct netdev_lag_upper_info *info, + struct netlink_ext_ack *extack); int qca8k_port_lag_leave(struct dsa_switch *ds, int port, struct dsa_lag lag); diff --git a/drivers/net/ethernet/mscc/ocelot.c b/drivers/net/ethernet/mscc/ocelot.c index 874fb2a5874e..5c18f8986975 100644 --- a/drivers/net/ethernet/mscc/ocelot.c +++ b/drivers/net/ethernet/mscc/ocelot.c @@ -2132,10 +2132,14 @@ static void ocelot_migrate_lag_fdbs(struct ocelot *ocelot, int ocelot_port_lag_join(struct ocelot *ocelot, int port, struct net_device *bond, - struct netdev_lag_upper_info *info) + struct netdev_lag_upper_info *info, + struct netlink_ext_ack *extack) { - if (info->tx_type != NETDEV_LAG_TX_TYPE_HASH) + if (info->tx_type != NETDEV_LAG_TX_TYPE_HASH) { + NL_SET_ERR_MSG_MOD(extack, + "Can only offload LAG using hash TX type"); return -EOPNOTSUPP; + } mutex_lock(&ocelot->fwd_domain_lock); diff --git a/drivers/net/ethernet/mscc/ocelot_net.c b/drivers/net/ethernet/mscc/ocelot_net.c index 2979fb1ba0f7..50858cc10fef 100644 --- a/drivers/net/ethernet/mscc/ocelot_net.c +++ b/drivers/net/ethernet/mscc/ocelot_net.c @@ -1412,11 +1412,10 @@ static int ocelot_netdevice_lag_join(struct net_device *dev, int port = priv->port.index; int err; - err = ocelot_port_lag_join(ocelot, port, bond, info); - if (err == -EOPNOTSUPP) { - NL_SET_ERR_MSG_MOD(extack, "Offloading not supported"); + err = ocelot_port_lag_join(ocelot, port, bond, info, extack); + if (err == -EOPNOTSUPP) + /* Offloading not supported, fall back to software LAG */ return 0; - } bridge_dev = netdev_master_upper_dev_get(bond); if (!bridge_dev || !netif_is_bridge_master(bridge_dev)) diff --git a/include/net/dsa.h b/include/net/dsa.h index 3f717c3fcba0..1c80e75b3cad 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -1094,7 +1094,8 @@ struct dsa_switch_ops { int port); int (*crosschip_lag_join)(struct dsa_switch *ds, int sw_index, int port, struct dsa_lag lag, - struct netdev_lag_upper_info *info); + struct netdev_lag_upper_info *info, + struct netlink_ext_ack *extack); int (*crosschip_lag_leave)(struct dsa_switch *ds, int sw_index, int port, struct dsa_lag lag); @@ -1169,7 +1170,8 @@ struct dsa_switch_ops { int (*port_lag_change)(struct dsa_switch *ds, int port); int (*port_lag_join)(struct dsa_switch *ds, int port, struct dsa_lag lag, - struct netdev_lag_upper_info *info); + struct netdev_lag_upper_info *info, + struct netlink_ext_ack *extack); int (*port_lag_leave)(struct dsa_switch *ds, int port, struct dsa_lag lag); diff --git a/include/soc/mscc/ocelot.h b/include/soc/mscc/ocelot.h index 355cfdedc43b..ea19e8ef1f61 100644 --- a/include/soc/mscc/ocelot.h +++ b/include/soc/mscc/ocelot.h @@ -1229,7 +1229,8 @@ int ocelot_port_mdb_del(struct ocelot *ocelot, int port, const struct net_device *bridge); int ocelot_port_lag_join(struct ocelot *ocelot, int port, struct net_device *bond, - struct netdev_lag_upper_info *info); + struct netdev_lag_upper_info *info, + struct netlink_ext_ack *extack); void ocelot_port_lag_leave(struct ocelot *ocelot, int port, struct net_device *bond); void ocelot_port_lag_change(struct ocelot *ocelot, int port, bool lag_tx_active); diff --git a/net/dsa/dsa_priv.h b/net/dsa/dsa_priv.h index d252a04ed725..f0ae54d0435e 100644 --- a/net/dsa/dsa_priv.h +++ b/net/dsa/dsa_priv.h @@ -88,6 +88,7 @@ struct dsa_notifier_lag_info { const struct dsa_port *dp; struct dsa_lag lag; struct netdev_lag_upper_info *info; + struct netlink_ext_ack *extack; }; /* DSA_NOTIFIER_VLAN_* */ diff --git a/net/dsa/port.c b/net/dsa/port.c index e557b42de9f2..98f7fa0cdd5c 100644 --- a/net/dsa/port.c +++ b/net/dsa/port.c @@ -635,6 +635,7 @@ int dsa_port_lag_join(struct dsa_port *dp, struct net_device *lag_dev, struct dsa_notifier_lag_info info = { .dp = dp, .info = uinfo, + .extack = extack, }; struct net_device *bridge_dev; int err; diff --git a/net/dsa/switch.c b/net/dsa/switch.c index 4dfd68cf61c5..c2cb15e21324 100644 --- a/net/dsa/switch.c +++ b/net/dsa/switch.c @@ -507,12 +507,12 @@ static int dsa_switch_lag_join(struct dsa_switch *ds, { if (info->dp->ds == ds && ds->ops->port_lag_join) return ds->ops->port_lag_join(ds, info->dp->index, info->lag, - info->info); + info->info, info->extack); if (info->dp->ds != ds && ds->ops->crosschip_lag_join) return ds->ops->crosschip_lag_join(ds, info->dp->ds->index, info->dp->index, info->lag, - info->info); + info->info, info->extack); return -EOPNOTSUPP; } From patchwork Sun Sep 11 01:07:04 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Oltean X-Patchwork-Id: 12972740 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6D917C6FA82 for ; Sun, 11 Sep 2022 01:09:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230099AbiIKBJk (ORCPT ); Sat, 10 Sep 2022 21:09:40 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57898 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229955AbiIKBI5 (ORCPT ); Sat, 10 Sep 2022 21:08:57 -0400 Received: from EUR03-DBA-obe.outbound.protection.outlook.com (mail-dbaeur03on2087.outbound.protection.outlook.com [40.107.104.87]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7A11A4DF04; Sat, 10 Sep 2022 18:08:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=epLr4vkSGywrGYfdyL+okFSMWp+Vp6VWXqi7bGLCBrZ+kQz5fygIBf+AVKAXcO4ReXKRzyXrvHJ4oGxzIsD4Zsyd+RJZ8nWWiQVb9AkN4fT+BBFz/yXpBtdrnnCZxjrYxTP9qhpXsAjUQAECcT/Nu96hn931rXbIfeo1vynx/n5TlKUUp3U7H0obQkNW7PXojpKllelWKwHdwNV3U4skOUBXlvqDIPdqrbTTrvvdjhcs7b03ECtNNNVlQvUwOLW814bmSMB6sroyHlXOQHZnfXvRF3nopC8A4Ne149czTRjN0z+GRaG9dKGdAFt4I9c+UeLgPbcG9ufWBAVzh1S+8A== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=1hvx6qpY69YPkhOOaIXt5Eb8b5r7DBt4XoTWRjN6xEI=; b=BG6JFVHIlA7a+BCNTacYNy6L1vMXsJIWTBrvipPTbvqXDsFAT45xYYh7ScfTQ119ALU81XX0zuQpY5mjygQTmOFGEG9C3Xbnyx4T4JH4tXb55gPtMQXWgDKNpl5F9HcRy3qRMfr6WH6ImVlS2pRxCv+jgf/nEzz344X9k4DJAHqATbs9gFsQEHPeUOueaxwBk/OTzM5dRK4wokolSEyEFH1XiGBb1OaTp4WmsoD9zhX47vKjcyemvXK/SbJyIT0Vu9VT0yuKN1zhv2mNNwvQDlGx/I5dAz5CQo4AZCkXzLduGVT5tTR6hXeS9bk/vqrMEG/5c3QVE02rkSmY6vbx7g== 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=1hvx6qpY69YPkhOOaIXt5Eb8b5r7DBt4XoTWRjN6xEI=; b=PLt9NPo/Cgw3AR4OFzr/Qhcdk7xLte0sqIoaY2uzqAwsphNu6STF/cO77YEwzevxV+IzKx72r5CRqNn0nYBDg90MSyfMd2oY3F5JPvhYRDG5SqJ8vvTtw39iFgb+NKzHQxajU4RE4e3Jl74pJ822POonHAc3DNkdatkqm6AYnDQ= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM0PR04MB5121.eurprd04.prod.outlook.com (2603:10a6:208:c1::16) by DBBPR04MB7739.eurprd04.prod.outlook.com (2603:10a6:10:1eb::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5612.22; Sun, 11 Sep 2022 01:08:02 +0000 Received: from AM0PR04MB5121.eurprd04.prod.outlook.com ([fe80::5d3b:4f24:dbeb:e292]) by AM0PR04MB5121.eurprd04.prod.outlook.com ([fe80::5d3b:4f24:dbeb:e292%5]) with mapi id 15.20.5612.020; Sun, 11 Sep 2022 01:08:02 +0000 From: Vladimir Oltean To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Florian Fainelli , Vivien Didelot , Andrew Lunn , Vladimir Oltean , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Colin Foster , Roopa Prabhu , Nikolay Aleksandrov , Tobias Waldekranz , =?utf-8?q?Marek_Beh=C3=BAn?= , Ansuel Smith , DENG Qingfang , =?utf-8?q?Alvin_=C5=A0ipraga?= , Linus Walleij , Luiz Angelo Daros de Luca , Felix Fietkau , John Crispin , Sean Wang , David Ahern , Stephen Hemminger Subject: [PATCH v2 net-next 08/10] net: dsa: allow masters to join a LAG Date: Sun, 11 Sep 2022 04:07:04 +0300 Message-Id: <20220911010706.2137967-9-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220911010706.2137967-1-vladimir.oltean@nxp.com> References: <20220911010706.2137967-1-vladimir.oltean@nxp.com> X-ClientProxiedBy: VI1PR08CA0129.eurprd08.prod.outlook.com (2603:10a6:800:d4::31) To AM0PR04MB5121.eurprd04.prod.outlook.com (2603:10a6:208:c1::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB5121:EE_|DBBPR04MB7739:EE_ X-MS-Office365-Filtering-Correlation-Id: 367674fb-2a5f-4b22-1e49-08da93921326 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: wXOCeMiNIOsjteeBrUkWv9gBr+qGTj0j1cMBzZp4j6dPc0Fng4zsXr5PJv7InEEn4RzloTpTsNCBgPwMnGs2N0Z0suu125caFQtVyKAmmYKbJPSDGRoS3uTjBWwfSjWkvrSujmOvEPNaDLnI3vCtEG53pcv0oHaUxaTM3sLSvWfWKbFEKNaRSPGAZHxXMGiR83ZBTN5+oqojpXJv29Lo8wsJLN71QzXZTTFFaYtzGzsFqaD/hmIklyHrzFSeUvB/PQnDAkuZM5pG9qHkKqVG5OT1r7ljmEkzVqJqGHoxjXw9sy0cMtMjQFK5WpWArFbXlz2Xi0FR1csgSXTA+OEyqylaqi8iu8QQte0tfrCX8gZQVMpNyyeLmU8RmNyvTUb+w2psHMphNZXSODCeDkTbuLJ0MQgwBXc5h7VvLL7r3rEuIxL34nU/52BPRPpEJEfVVyNzPoqXjFEtAAYPFBWuf9yr8EMOU5waj01Yb7rMhO7WcU/qyT2KR4eBHj1NmtybLhz2T4eOeMJKHL0jo1nCfrxJ3BHRoFFQJcjQzW7QSAkmUg8GWkir8pPItKPaivdAIruEJv2UdVHMcSZRDE2SgRk3KAspoDYCDx9ExMNv4CPQJo6TONY5yG0p5NgnZnHSD6/v38bqczEUch+3aHxgAiOfoKPOPnyAS8SN9m17+lNTkMI2C6ow12bhU8wV0KAsTayXNb6WT1fjXEsJz2vYaIFf4K0AINV7LevXb90BlEj72N61yT/fFKylHXdptVyKV3bpMCy3I/XG3EecBOXJZA== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB5121.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230016)(4636009)(346002)(136003)(376002)(39860400002)(396003)(366004)(38100700002)(38350700002)(30864003)(2906002)(44832011)(83380400001)(2616005)(186003)(1076003)(316002)(66476007)(66556008)(4326008)(8936002)(66946007)(8676002)(54906003)(6916009)(36756003)(7416002)(5660300002)(478600001)(41300700001)(52116002)(6486002)(26005)(6512007)(86362001)(6506007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: r3t5ohIs7bN//+LOvbzQqmI7TZxHPyo+4qYepcBpVRypmOMUq8yKailKD+Rrr1tB7ecoqZR9cpfOkm4kZuvG2/4qIZkrsaJGjFmivyxx4EGXZifN134rbAbjUiTSthXqKCT+EqVswmHh5g91mQ3mkyf2Xx8IwatuBbN9vuO+55pHwosL6dcCdU2+d+AwKpqMLrillVLrWpONT4J/U2uP7Pu2tGBp4sI8e0xdnCutBe5gfQwBbgwfUbGwO8yiPioAbFBNDcoZfDpprAM1y+DU9pRGPtN1LCquQ76Os8XA8cZe3TaTTMdIJVPZtaZUlxV5RgEyaLX8IMqIfB9XPluOmhRafLcp2HECEZmazYw+7r6zOOli9rHcAnbk6D263P/qaflNsB8D77ldLFQ51vuUoWUBMWydEW1flh/f2Td86KhpKKVqeIMaLj0eB6LW76Z16wRR9ov8aOqIoJTWI04e8QBQVuG9E3oCWNRCY/N3bMs6sasmk7pIbFJFcWyzCIq+tfrVAgJ83/xJjpjLA4y6evlmF8IPU3bfaJyQhxDNNzAo/1Gws+0hX//jOYbLXjrukRYhQBAeNnsKwdHjK6BGbdekXGJrvhlT94ANS89U/GsHq7DBcCcfpICcoeIjkPlYHruBU5Lze0NvMUgZh1Zjsjnek+2O4mdWxmIPAb5JtWzWskVkE95BKgHDNKMzOSwiksTnHyyosqnrQBNnDzxbsZANFW8PI43KvIX0M2C8U0pLcRBUCDqiydBSuiSQLLXHFYuQITqTKL6FVaFC+Wmf+9127SjdI9as+g9fiwz4Wqu4B1xCsn3B9SSfYA7wccW8zC4NlZQUZumqtAmR4PsNsRMoh3Vlsk0r3q8dVGuZam3S2zu37pn0wUDml1B922CuJ+vlKwiBPUDU+YXVVQeSXV1jTybhlR2KDEh864caVe9vv6dmcwM5pqsJt7dsE0F6dVQBiKDwGd2HD4oizowvPDgPjnKVTwyptzQQ/kn4fSq+WmDRJRDrbnfCmnjkDp5Ve7R6Sc/2zxX+Z+BLZ32brmjSdxMCrcxOVO8j1ebSURbS9sbHnv+cCpvqIMiL86SG/e/o8YSiwqyNVTw4r8jF90S6QrCgFcwyvUEjC8VUKhp+gMeNskdJbzCDu7GVb6tdqTgXgb8I6VL1ZDhbQEKWILH0VoaUazykJlzFlnuroQUkZZLOeFwiJguZKUFxX0VrUhFBx/afZkBBAP2Qu2Ps7GZrBbkOrUyz/2D5xIELSdlli6m4pHd+j96lLwhzRGultLb3GG76ZRsdey8q9m8Ng1slnLNg3fAmPaYYqIUdwQf35ltK/syLu6sdhLusNq7d63md6qvBdWFWVOK/nH1yXjMQkTcX23A0M2owXoIpy6Dq5IviLo3q+un55bacr0cmC0Z4gerY6IyWZQiyfCCGZtORRWVGFNTujfCy3pI1JzHKJcFX9vNxQxtQACVOmEi2Ct3ENZqdgAA6oYtRGj4G+elHUCXaJkAfBUbRZeEDgC4nq2DkOY+nRyyQdck03iiDzGmgcJ1fdiVZHSiYJLtjFlzsEutMrhrEe9xKa4NkgXWsPwvH2BQMi/9vVTbEokkT8nEuArEVjiqM3iFQQamomg== X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 367674fb-2a5f-4b22-1e49-08da93921326 X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB5121.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Sep 2022 01:08:02.3369 (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: fpDB5vORuqKCrtuOtcXI1CNpW39pJ1jRTEuqkdT77r7qxZ3rMzfHjqqrHjdSSTNfq5kqu8NVk28liF3qmP3qtA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBBPR04MB7739 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org There are 2 ways in which a DSA user port may become handled by 2 CPU ports in a LAG: (1) its current DSA master joins a LAG ip link del bond0 && ip link add bond0 type bond mode 802.3ad ip link set eno2 master bond0 When this happens, all user ports with "eno2" as DSA master get automatically migrated to "bond0" as DSA master. (2) it is explicitly configured as such by the user # Before, the DSA master was eno3 ip link set swp0 type dsa master bond0 The design of this configuration is that the LAG device dynamically becomes a DSA master through dsa_master_setup() when the first physical DSA master becomes a LAG slave, and stops being so through dsa_master_teardown() when the last physical DSA master leaves. A LAG interface is considered as a valid DSA master only if it contains existing DSA masters, and no other lower interfaces. Therefore, we mainly rely on method (1) to enter this configuration. Each physical DSA master (LAG slave) retains its dev->dsa_ptr for when it becomes a standalone DSA master again. But the LAG master also has a dev->dsa_ptr, and this is actually duplicated from one of the physical LAG slaves, and therefore needs to be balanced when LAG slaves come and go. To the switch driver, putting DSA masters in a LAG is seen as putting their associated CPU ports in a LAG. We need to prepare cross-chip host FDB notifiers for CPU ports in a LAG, by calling the driver's ->lag_fdb_add method rather than ->port_fdb_add. Signed-off-by: Vladimir Oltean --- v1->v2: - add restriction that LAG slaves must be DSA masters of the same switch tree - move DSA master eligibility restriction earlier, from dsa_master_lag_setup() to dsa_master_prechangeupper_sanity_check() - set master_setup = true in dsa_master_lag_setup(), so that dsa_master_teardown() would actually get called - don't overwrite extack in dsa_master_lag_setup() if dsa_port_lag_join() provided a more specific one - add restriction that interfaces which aren't DSA masters cannot join a LAG DSA master include/net/dsa.h | 12 +++ net/dsa/dsa_priv.h | 5 + net/dsa/master.c | 49 ++++++++++ net/dsa/port.c | 1 + net/dsa/slave.c | 231 +++++++++++++++++++++++++++++++++++++++++++-- net/dsa/switch.c | 22 ++++- 6 files changed, 310 insertions(+), 10 deletions(-) diff --git a/include/net/dsa.h b/include/net/dsa.h index 1c80e75b3cad..d777eac5694f 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -300,6 +300,9 @@ struct dsa_port { u8 master_admin_up:1; u8 master_oper_up:1; + /* Valid only on user ports */ + u8 cpu_port_in_lag:1; + u8 setup:1; struct device_node *dn; @@ -724,6 +727,9 @@ static inline bool dsa_port_offloads_lag(struct dsa_port *dp, static inline struct net_device *dsa_port_to_master(const struct dsa_port *dp) { + if (dp->cpu_port_in_lag) + return dsa_port_lag_dev_get(dp->cpu_dp); + return dp->cpu_dp->master; } @@ -811,6 +817,12 @@ dsa_tree_offloads_bridge_dev(struct dsa_switch_tree *dst, return false; } +static inline bool dsa_port_tree_same(const struct dsa_port *a, + const struct dsa_port *b) +{ + return a->ds->dst == b->ds->dst; +} + typedef int dsa_fdb_dump_cb_t(const unsigned char *addr, u16 vid, bool is_static, void *data); struct dsa_switch_ops { diff --git a/net/dsa/dsa_priv.h b/net/dsa/dsa_priv.h index f0ae54d0435e..129e4a649c7e 100644 --- a/net/dsa/dsa_priv.h +++ b/net/dsa/dsa_priv.h @@ -185,6 +185,11 @@ static inline int dsa_tag_protocol_overhead(const struct dsa_device_ops *ops) /* master.c */ int dsa_master_setup(struct net_device *dev, struct dsa_port *cpu_dp); void dsa_master_teardown(struct net_device *dev); +int dsa_master_lag_setup(struct net_device *lag_dev, struct dsa_port *cpu_dp, + struct netdev_lag_upper_info *uinfo, + struct netlink_ext_ack *extack); +void dsa_master_lag_teardown(struct net_device *lag_dev, + struct dsa_port *cpu_dp); static inline struct net_device *dsa_master_find_slave(struct net_device *dev, int device, int port) diff --git a/net/dsa/master.c b/net/dsa/master.c index 2176c14b97a8..40367ab41cf8 100644 --- a/net/dsa/master.c +++ b/net/dsa/master.c @@ -428,3 +428,52 @@ void dsa_master_teardown(struct net_device *dev) */ wmb(); } + +int dsa_master_lag_setup(struct net_device *lag_dev, struct dsa_port *cpu_dp, + struct netdev_lag_upper_info *uinfo, + struct netlink_ext_ack *extack) +{ + bool master_setup = false; + int err; + + if (!netdev_uses_dsa(lag_dev)) { + err = dsa_master_setup(lag_dev, cpu_dp); + if (err) + return err; + + master_setup = true; + } + + err = dsa_port_lag_join(cpu_dp, lag_dev, uinfo, extack); + if (err) { + if (extack && !extack->_msg) + NL_SET_ERR_MSG_MOD(extack, + "CPU port failed to join LAG"); + goto out_master_teardown; + } + + return 0; + +out_master_teardown: + if (master_setup) + dsa_master_teardown(lag_dev); + return err; +} + +/* Tear down a master if there isn't any other user port on it, + * optionally also destroying LAG information. + */ +void dsa_master_lag_teardown(struct net_device *lag_dev, + struct dsa_port *cpu_dp) +{ + struct net_device *upper; + struct list_head *iter; + + dsa_port_lag_leave(cpu_dp, lag_dev); + + netdev_for_each_upper_dev_rcu(lag_dev, upper, iter) + if (dsa_slave_dev_check(upper)) + return; + + dsa_master_teardown(lag_dev); +} diff --git a/net/dsa/port.c b/net/dsa/port.c index 98f7fa0cdd5c..e6289a1db0a0 100644 --- a/net/dsa/port.c +++ b/net/dsa/port.c @@ -1393,6 +1393,7 @@ static int dsa_port_assign_master(struct dsa_port *dp, return err; dp->cpu_dp = master->dsa_ptr; + dp->cpu_port_in_lag = netif_is_lag_master(master); return 0; } diff --git a/net/dsa/slave.c b/net/dsa/slave.c index 00df6cf07866..aa47ddc19fdf 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c @@ -2818,11 +2818,45 @@ dsa_slave_prechangeupper_sanity_check(struct net_device *dev, return NOTIFY_DONE; } +/* To be eligible as a DSA master, a LAG must have all lower interfaces be + * eligible DSA masters. Additionally, all LAG slaves must be DSA masters of + * switches in the same switch tree. + */ +static int dsa_lag_master_validate(struct net_device *lag_dev, + struct netlink_ext_ack *extack) +{ + struct net_device *lower1, *lower2; + struct list_head *iter1, *iter2; + + netdev_for_each_lower_dev(lag_dev, lower1, iter1) { + netdev_for_each_lower_dev(lag_dev, lower2, iter2) { + if (!netdev_uses_dsa(lower1) || + !netdev_uses_dsa(lower2)) { + NL_SET_ERR_MSG_MOD(extack, + "All LAG ports must be eligible as DSA masters"); + return notifier_from_errno(-EINVAL); + } + + if (lower1 == lower2) + continue; + + if (!dsa_port_tree_same(lower1->dsa_ptr, + lower2->dsa_ptr)) { + NL_SET_ERR_MSG_MOD(extack, + "LAG contains DSA masters of disjoint switch trees"); + return notifier_from_errno(-EINVAL); + } + } + } + + return NOTIFY_DONE; +} + static int dsa_master_prechangeupper_sanity_check(struct net_device *master, struct netdev_notifier_changeupper_info *info) { - struct netlink_ext_ack *extack; + struct netlink_ext_ack *extack = netdev_notifier_info_to_extack(&info->info); if (!netdev_uses_dsa(master)) return NOTIFY_DONE; @@ -2840,13 +2874,51 @@ dsa_master_prechangeupper_sanity_check(struct net_device *master, if (netif_is_bridge_master(info->upper_dev)) return NOTIFY_DONE; - extack = netdev_notifier_info_to_extack(&info->info); + /* Allow LAG uppers, subject to further restrictions in + * dsa_lag_master_prechangelower_sanity_check() + */ + if (netif_is_lag_master(info->upper_dev)) + return dsa_lag_master_validate(info->upper_dev, extack); NL_SET_ERR_MSG_MOD(extack, "DSA master cannot join unknown upper interfaces"); return notifier_from_errno(-EBUSY); } +static int +dsa_lag_master_prechangelower_sanity_check(struct net_device *dev, + struct netdev_notifier_changeupper_info *info) +{ + struct netlink_ext_ack *extack = netdev_notifier_info_to_extack(&info->info); + struct net_device *lag_dev = info->upper_dev; + struct net_device *lower; + struct list_head *iter; + + if (!netdev_uses_dsa(lag_dev) || !netif_is_lag_master(lag_dev)) + return NOTIFY_DONE; + + if (!info->linking) + return NOTIFY_DONE; + + if (!netdev_uses_dsa(dev)) { + NL_SET_ERR_MSG(extack, + "Only DSA masters can join a LAG DSA master"); + return notifier_from_errno(-EINVAL); + } + + netdev_for_each_lower_dev(lag_dev, lower, iter) { + if (!dsa_port_tree_same(dev->dsa_ptr, lower->dsa_ptr)) { + NL_SET_ERR_MSG(extack, + "Interface is DSA master for a different switch tree than this LAG"); + return notifier_from_errno(-EINVAL); + } + + break; + } + + return NOTIFY_DONE; +} + /* Don't allow bridging of DSA masters, since the bridge layer rx_handler * prevents the DSA fake ethertype handler to be invoked, so we don't get the * chance to strip off and parse the DSA switch tag protocol header (the bridge @@ -2887,6 +2959,136 @@ dsa_bridge_prechangelower_sanity_check(struct net_device *new_lower, return NOTIFY_DONE; } +static void dsa_tree_migrate_ports_from_lag_master(struct dsa_switch_tree *dst, + struct net_device *lag_dev) +{ + struct net_device *new_master = dsa_tree_find_first_master(dst); + struct dsa_port *dp; + int err; + + dsa_tree_for_each_user_port(dp, dst) { + if (dsa_port_to_master(dp) != lag_dev) + continue; + + err = dsa_slave_change_master(dp->slave, new_master, NULL); + if (err) { + netdev_err(dp->slave, + "failed to restore master to %s: %pe\n", + new_master->name, ERR_PTR(err)); + } + } +} + +static int dsa_master_lag_join(struct net_device *master, + struct net_device *lag_dev, + struct netdev_lag_upper_info *uinfo, + struct netlink_ext_ack *extack) +{ + struct dsa_port *cpu_dp = master->dsa_ptr; + struct dsa_switch_tree *dst = cpu_dp->dst; + struct dsa_port *dp; + int err; + + err = dsa_master_lag_setup(lag_dev, cpu_dp, uinfo, extack); + if (err) + return err; + + dsa_tree_for_each_user_port(dp, dst) { + if (dsa_port_to_master(dp) != master) + continue; + + err = dsa_slave_change_master(dp->slave, lag_dev, extack); + if (err) + goto restore; + } + + return 0; + +restore: + dsa_tree_for_each_user_port_continue_reverse(dp, dst) { + if (dsa_port_to_master(dp) != lag_dev) + continue; + + err = dsa_slave_change_master(dp->slave, master, NULL); + if (err) { + netdev_err(dp->slave, + "failed to restore master to %s: %pe\n", + master->name, ERR_PTR(err)); + } + } + + dsa_master_lag_teardown(lag_dev, master->dsa_ptr); + + return err; +} + +static void dsa_master_lag_leave(struct net_device *master, + struct net_device *lag_dev) +{ + struct dsa_port *dp, *cpu_dp = lag_dev->dsa_ptr; + struct dsa_switch_tree *dst = cpu_dp->dst; + struct dsa_port *new_cpu_dp = NULL; + struct net_device *lower; + struct list_head *iter; + + netdev_for_each_lower_dev(lag_dev, lower, iter) { + if (netdev_uses_dsa(lower)) { + new_cpu_dp = lower->dsa_ptr; + break; + } + } + + if (new_cpu_dp) { + /* Update the CPU port of the user ports still under the LAG + * so that dsa_port_to_master() continues to work properly + */ + dsa_tree_for_each_user_port(dp, dst) + if (dsa_port_to_master(dp) == lag_dev) + dp->cpu_dp = new_cpu_dp; + + /* Update the index of the virtual CPU port to match the lowest + * physical CPU port + */ + lag_dev->dsa_ptr = new_cpu_dp; + wmb(); + } else { + /* If the LAG DSA master has no ports left, migrate back all + * user ports to the first physical CPU port + */ + dsa_tree_migrate_ports_from_lag_master(dst, lag_dev); + } + + /* This DSA master has left its LAG in any case, so let + * the CPU port leave the hardware LAG as well + */ + dsa_master_lag_teardown(lag_dev, master->dsa_ptr); +} + +static int dsa_master_changeupper(struct net_device *dev, + struct netdev_notifier_changeupper_info *info) +{ + struct netlink_ext_ack *extack; + int err = NOTIFY_DONE; + + if (!netdev_uses_dsa(dev)) + return err; + + extack = netdev_notifier_info_to_extack(&info->info); + + if (netif_is_lag_master(info->upper_dev)) { + if (info->linking) { + err = dsa_master_lag_join(dev, info->upper_dev, + info->upper_info, extack); + err = notifier_from_errno(err); + } else { + dsa_master_lag_leave(dev, info->upper_dev); + err = NOTIFY_OK; + } + } + + return err; +} + static int dsa_slave_netdevice_event(struct notifier_block *nb, unsigned long event, void *ptr) { @@ -2905,6 +3107,10 @@ static int dsa_slave_netdevice_event(struct notifier_block *nb, if (notifier_to_errno(err)) return err; + err = dsa_lag_master_prechangelower_sanity_check(dev, info); + if (notifier_to_errno(err)) + return err; + err = dsa_bridge_prechangelower_sanity_check(dev, info); if (notifier_to_errno(err)) return err; @@ -2930,6 +3136,10 @@ static int dsa_slave_netdevice_event(struct notifier_block *nb, if (notifier_to_errno(err)) return err; + err = dsa_master_changeupper(dev, ptr); + if (notifier_to_errno(err)) + return err; + break; } case NETDEV_CHANGELOWERSTATE: { @@ -2937,12 +3147,21 @@ static int dsa_slave_netdevice_event(struct notifier_block *nb, struct dsa_port *dp; int err; - if (!dsa_slave_dev_check(dev)) - break; + if (dsa_slave_dev_check(dev)) { + dp = dsa_slave_to_port(dev); + + err = dsa_port_lag_change(dp, info->lower_state_info); + } - dp = dsa_slave_to_port(dev); + /* Mirror LAG port events on DSA masters that are in + * a LAG towards their respective switch CPU ports + */ + if (netdev_uses_dsa(dev)) { + dp = dev->dsa_ptr; + + err = dsa_port_lag_change(dp, info->lower_state_info); + } - err = dsa_port_lag_change(dp, info->lower_state_info); return notifier_from_errno(err); } case NETDEV_CHANGE: diff --git a/net/dsa/switch.c b/net/dsa/switch.c index c2cb15e21324..ce56acdba203 100644 --- a/net/dsa/switch.c +++ b/net/dsa/switch.c @@ -398,8 +398,15 @@ static int dsa_switch_host_fdb_add(struct dsa_switch *ds, dsa_switch_for_each_port(dp, ds) { if (dsa_port_host_address_match(dp, info->dp)) { - err = dsa_port_do_fdb_add(dp, info->addr, info->vid, - info->db); + if (dsa_port_is_cpu(dp) && info->dp->cpu_port_in_lag) { + err = dsa_switch_do_lag_fdb_add(ds, dp->lag, + info->addr, + info->vid, + info->db); + } else { + err = dsa_port_do_fdb_add(dp, info->addr, + info->vid, info->db); + } if (err) break; } @@ -419,8 +426,15 @@ static int dsa_switch_host_fdb_del(struct dsa_switch *ds, dsa_switch_for_each_port(dp, ds) { if (dsa_port_host_address_match(dp, info->dp)) { - err = dsa_port_do_fdb_del(dp, info->addr, info->vid, - info->db); + if (dsa_port_is_cpu(dp) && info->dp->cpu_port_in_lag) { + err = dsa_switch_do_lag_fdb_del(ds, dp->lag, + info->addr, + info->vid, + info->db); + } else { + err = dsa_port_do_fdb_del(dp, info->addr, + info->vid, info->db); + } if (err) break; } From patchwork Sun Sep 11 01:07:05 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Oltean X-Patchwork-Id: 12972741 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1A282C6FA86 for ; Sun, 11 Sep 2022 01:09:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230114AbiIKBJm (ORCPT ); Sat, 10 Sep 2022 21:09:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57514 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230043AbiIKBI6 (ORCPT ); Sat, 10 Sep 2022 21:08:58 -0400 Received: from EUR03-DBA-obe.outbound.protection.outlook.com (mail-dbaeur03on2087.outbound.protection.outlook.com [40.107.104.87]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 763964F676; Sat, 10 Sep 2022 18:08:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ksjJAF/cx2Mwvk6eVYejMjlAlCjsQN7bc9ckcXsI8o1U1oh2ENw5lvRIZ4Cu6nJzep7DItobLE/eExi3PhdWOGSFoIGGK+Z2WIo5sx1YMq3nuH5TmHpjRRG39eGkzrFFyRL4RB0upg9h6TLZiusmQtCvGIqIZPsLpj+uWws/cB+kYEVttm9LcCIVVWdj5FQ82yNuucqJ5GtAOrtC55pIq6zQ3pIRZiRmoJyNq36wfHpCePDOC3/ilxEz7YLCpWlh7y42/vIoMcgQ1dCP3Qo/p0ytzYnHyu5PQ8qKRpeIhY1ZmyIat9eYSfHvrd4JihXrWKT1lDD78i4AR9lXeD1alQ== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=kqIkS28II0oI7SpGH2sWhIpjVyzVXKK8ibSRySzaOsk=; b=iEC8Ma0e3PPe3VESXIJmmXv+3MXqM/zy2+XWjX/Ub7oubGWPvWpr6hED0GrYMT5H4fXVH3hOoaO3xvfle0zKyKRO6aMFBSmlFQmRnxANAZGXkdHPDjQtHOVWDkLgaceick8iKiwcQ22e1zcHZ95+bKz71qK9yR1UtMwDWxojwEQ0yuzqSJcayapBnSkxTvW6IuzXgtctRzNJv+J1OvCODdoLQc/iy6B18w4nOAOBTFtXbRe1YnhvuRpw5te7NNgu6u+gGGMkws/mYXTxKBAntuK8NUW7kf/GKHY65rAjNRNG8XUdpLmc4rZMC7W5t6wQfLcFowAFmCKCFeYJw8Wcjw== 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=kqIkS28II0oI7SpGH2sWhIpjVyzVXKK8ibSRySzaOsk=; b=OpirSGCVR+/y21hOwyaMEZlfw7/L/7lIfQBM3XyRP/xZQ+FLize8uASKhdYJXwiUiQqsq7S56m5gverYNNNHFxEzdfry740zOPZ9K7mO48Tfvr97ptn1fhqyrz9AHvNxEmFGAI/opuwXB0ReNxKOI/scQ5uvvRSZz9hYa6QeK88= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM0PR04MB5121.eurprd04.prod.outlook.com (2603:10a6:208:c1::16) by DBBPR04MB7739.eurprd04.prod.outlook.com (2603:10a6:10:1eb::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5612.22; Sun, 11 Sep 2022 01:08:04 +0000 Received: from AM0PR04MB5121.eurprd04.prod.outlook.com ([fe80::5d3b:4f24:dbeb:e292]) by AM0PR04MB5121.eurprd04.prod.outlook.com ([fe80::5d3b:4f24:dbeb:e292%5]) with mapi id 15.20.5612.020; Sun, 11 Sep 2022 01:08:04 +0000 From: Vladimir Oltean To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Florian Fainelli , Vivien Didelot , Andrew Lunn , Vladimir Oltean , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Colin Foster , Roopa Prabhu , Nikolay Aleksandrov , Tobias Waldekranz , =?utf-8?q?Marek_Beh=C3=BAn?= , Ansuel Smith , DENG Qingfang , =?utf-8?q?Alvin_=C5=A0ipraga?= , Linus Walleij , Luiz Angelo Daros de Luca , Felix Fietkau , John Crispin , Sean Wang , David Ahern , Stephen Hemminger Subject: [PATCH v2 net-next 09/10] docs: net: dsa: update information about multiple CPU ports Date: Sun, 11 Sep 2022 04:07:05 +0300 Message-Id: <20220911010706.2137967-10-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220911010706.2137967-1-vladimir.oltean@nxp.com> References: <20220911010706.2137967-1-vladimir.oltean@nxp.com> X-ClientProxiedBy: VI1PR08CA0129.eurprd08.prod.outlook.com (2603:10a6:800:d4::31) To AM0PR04MB5121.eurprd04.prod.outlook.com (2603:10a6:208:c1::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB5121:EE_|DBBPR04MB7739:EE_ X-MS-Office365-Filtering-Correlation-Id: 516e7ce0-1e92-41d9-6c6e-08da9392145e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: hvriRilXF5LoWXFB8/Ml3R8wwr0N7gk1FUxTUqJQYJi2r9NWppYIUCSB0gPufTAyRwnK1oHhdoQj04oLcFgx0NTo32ZXAYzmTeuMvdIgaId9iyh2NLI+Vj1ZNwqt5dTD9rJiRvmUqAtVWKXfDO5INChF8PSV+upaeTWDguYM5do2B3Vv8+SanU+ZAZnih4pWH0X/OeA/xTPtTTSLtpS0NhNwZRZ5qF91v0ldV+9UJwIXaUrntLjfwdbEXcDFMENBorUFbFGMMfvcvlpa4opMJrZ1GmB9SwzL34AYUh270l3EUlqedqqGM6taP2QixTIs/Nxedwz2NlHyvdTGgehQxDmCXbahaIv0qba74yyrcUYAxDdvxDrEeBUB4aiybwpph/MoxhdFOZCv/Ut0U1Ns5KOVLNHtkk5BAt90NdFDPnGbRe0TahiIvtIn1+eVTBKvqQwRYv/8kNgAQcZvQkxaAvjGW85eG7UUUcsxRV4rIkT8A5uDsndwOkt2VtijU4s8ZBVwEyhnQibiZhZ2OcoFFmZJkdonMXhmnRfvlZWmhgLTeauE2/lfRDR6m4D22OPwoMH4uhXMV8J8EeCHtt3MfUTPKlVqaow0luRYK2YwxyCWO4oF0P+bQNpU1FVDxQI5zlcB57qr4LdnH6sTkaXqz8XkTqxqBCU0tqCdQi4Ca8Oov6drM83LNr/b35KRH8+d8JjoUeyu+LWxzJpsuNUC6TsdBUaj2VPvpSLfFuYpwK/IXYpoPprLv2gO4HwfCQYIA0532uX7s4N3/Jvu0MFmKOkPMxG/2+h7zStUTazKsFo= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB5121.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230016)(4636009)(346002)(136003)(376002)(39860400002)(396003)(366004)(38100700002)(38350700002)(2906002)(15650500001)(44832011)(83380400001)(2616005)(186003)(1076003)(316002)(66476007)(66556008)(4326008)(8936002)(66946007)(8676002)(54906003)(6916009)(36756003)(7416002)(5660300002)(478600001)(41300700001)(52116002)(6486002)(966005)(26005)(6512007)(86362001)(6506007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Cx3HMqFFGOZeWMV9H3YWbBRMfNMOyxUTkuiMRKqhPmAnkX+WcnjOx0l4A1mYGIM24aMdOTXyXYRFY8YItCfgtIXGtOb+0WxYIzE1EfZbmbXdGBkuuKQ7gM591zQwl2sxTB2ZX/picQLqLmAcnioqjvOcEQhnSpdZgjSdvPHFQ7i+x4dLNSxixe3Vh3eWJg09YgJg4bGkStTOd3ecmKsBn4i0yPpRFI57fZKD+jTvrMv6W+lkaaQhx8cWo48XdbG+AngMv4qPviYQH1KL+hmOG1uYpHkTct9HBsZ+rIytYN0UOAZ7CSqgrb7Nf0+iSi/4DV/XGaUW7GhKkdpAE7iFE7GuRUbGYq+Z8trOqq8gdQFhZs8GcW896ek4ARcOZnbqp8XXYG92DK1iGzSAH8OethkFxHYpOhwckbcGixE0x703L6l+Aoga3w2nZph8KhXh8MBtVi3nDqKTEJF9tM7kgUAzZ9A+F74hijf3+jHVxjCVjZ4/HzSEj5vfdh7TJsnrn9dVgvQI5VvMsL69yRfwmqNGp7c7xdVdL7/R/JqIfoYrtDhoFXkQTKLomseYUOOahTXzguh5Sj7IfqVeQSY3ZCsSURjLo3foB1ml8XfvENFpvv/0pkqsrKtS18NtwmhC87bcRnFMAim4qYOv/jzVxsdYOjkdoCpzL0bqWf0BZX4vqESbk3zzB4lkaCX9zh3w2wLMKJB3tSWRZsCftk/FizojNDl9+WUazRFPexPCp7+tR/eFks6jFjXEc7SU3ybutr2qK1grC7z3GrwrINldPW4hbVYRzABvl3plEMcM+3jS/qWu2IU75a5AknWk2feSRUN24tFtiTKMJoHNDYPXirUxJBQ0hfqjFXlD5IzUKpQ3Sp24aHJMvqAerWGqqv7dAfhIN8TO5gg1VQVyqNoXqMaxMmEIHLE5jVjswX7FRYNHdBcGFPY3UOT40zI7ryAAsTx1m7HQrCBtHUm/O8fjc/J5tXaD8OYBwo7j7RsulMiu3BR0UFCTsw+kbqd+xEEIud3Ga9BSt1hiFSHwrdB0oXFMYZDVeHopRYyHubTg9t0qYUEu1yMFEbW8/3sXI5WFtO0iOh42dVPBuFWd9/wWak2dpJgZr6tukS2Z7alVXm3VwBREOp/XPvg6GtJxDKDiYaSRdhwW8NhMt0NxeUIfKw/zIUbFgMowdu4js4KZj016yOr5Mv57lugpT3LJpZc/aRdMo7QC1fD1/K34MGWM7LhzPbk3UF5RuSdBjMPD+Koi1dF+rwTRA8JjcSECLlOf7Jj3eSiVKs/4RXK8gwiJ6sVNAmMzja9HbdqQUV5vfhuhWWNUdSpdWmND2vBn0xVDMehZBspY9B6IppIiF8im/WR7ke8HLRp0aiy9VhmikMDp6H2PtZXIc42xLIo0MR2P9hBrKCp56v0YnOrddwBtYDCKRdaH1V7ZLx3k0BKxpqvAc+BW6wkyEjOrOL50ds0k8U9tcC7BFE+4roGD8VKgk1OP2xW+2d2j/1OgpThDi+wH4HNp/WNapKbidicoTjVSfufNUda+9iuxcn/Xt7fwKexDEOjYwTFgYrWtMV3wAOinA+CVSZdd5bQiAGP+eSrwZw8o1UpjRQp4HgSCQVZtuQ== X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 516e7ce0-1e92-41d9-6c6e-08da9392145e X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB5121.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Sep 2022 01:08:04.3837 (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: ugS/BLk47vC/WtLLWmFeE6VgAiqH6HulWY1Mkot1HABmfxzARnHAvyiB5g1rssGapy3d6qwtJAvWGoAQy31/gw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBBPR04MB7739 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org DSA now supports multiple CPU ports, explain the use cases that are covered, the new UAPI, the permitted degrees of freedom, the driver API, and remove some old "hanging fruits". Signed-off-by: Vladimir Oltean --- v1->v2: provide alternate description of how to put CPU ports in a LAG .../networking/dsa/configuration.rst | 96 +++++++++++++++++++ Documentation/networking/dsa/dsa.rst | 38 ++++++-- 2 files changed, 128 insertions(+), 6 deletions(-) diff --git a/Documentation/networking/dsa/configuration.rst b/Documentation/networking/dsa/configuration.rst index 2b08f1a772d3..827701f8cbfe 100644 --- a/Documentation/networking/dsa/configuration.rst +++ b/Documentation/networking/dsa/configuration.rst @@ -49,6 +49,9 @@ In this documentation the following Ethernet interfaces are used: *eth0* the master interface +*eth1* + another master interface + *lan1* a slave interface @@ -360,3 +363,96 @@ the ``self`` flag) has been removed. This results in the following changes: Script writers are therefore encouraged to use the ``master static`` set of flags when working with bridge FDB entries on DSA switch interfaces. + +Affinity of user ports to CPU ports +----------------------------------- + +Typically, DSA switches are attached to the host via a single Ethernet +interface, but in cases where the switch chip is discrete, the hardware design +may permit the use of 2 or more ports connected to the host, for an increase in +termination throughput. + +DSA can make use of multiple CPU ports in two ways. First, it is possible to +statically assign the termination traffic associated with a certain user port +to be processed by a certain CPU port. This way, user space can implement +custom policies of static load balancing between user ports, by spreading the +affinities according to the available CPU ports. + +Secondly, it is possible to perform load balancing between CPU ports on a per +packet basis, rather than statically assigning user ports to CPU ports. +This can be achieved by placing the DSA masters under a LAG interface (bonding +or team). DSA monitors this operation and creates a mirror of this software LAG +on the CPU ports facing the physical DSA masters that constitute the LAG slave +devices. + +To make use of multiple CPU ports, the firmware (device tree) description of +the switch must mark all the links between CPU ports and their DSA masters +using the ``ethernet`` reference/phandle. At startup, only a single CPU port +and DSA master will be used - the numerically first port from the firmware +description which has an ``ethernet`` property. It is up to the user to +configure the system for the switch to use other masters. + +DSA uses the ``rtnl_link_ops`` mechanism (with a "dsa" ``kind``) to allow +changing the DSA master of a user port. The ``IFLA_DSA_MASTER`` u32 netlink +attribute contains the ifindex of the master device that handles each slave +device. The DSA master must be a valid candidate based on firmware node +information, or a LAG interface which contains only slaves which are valid +candidates. + +Using iproute2, the following manipulations are possible: + + .. code-block:: sh + + # See the DSA master in current use + ip -d link show dev swp0 + (...) + dsa master eth0 + + # Static CPU port distribution + ip link set swp0 type dsa master eth1 + ip link set swp1 type dsa master eth0 + ip link set swp2 type dsa master eth1 + ip link set swp3 type dsa master eth0 + + # CPU ports in LAG, using explicit assignment of the DSA master + ip link add bond0 type bond mode balance-xor && ip link set bond0 up + ip link set eth1 down && ip link set eth1 master bond0 + ip link set swp0 type dsa master bond0 + ip link set swp1 type dsa master bond0 + ip link set swp2 type dsa master bond0 + ip link set swp3 type dsa master bond0 + ip link set eth0 down && ip link set eth0 master bond0 + ip -d link show dev swp0 + (...) + dsa master bond0 + + # CPU ports in LAG, relying on implicit migration of the DSA master + ip link add bond0 type bond mode balance-xor && ip link set bond0 up + ip link set eth0 down && ip link set eth0 master bond0 + ip link set eth1 down && ip link set eth1 master bond0 + ip -d link show dev swp0 + (...) + dsa master bond0 + +Notice that in the case of CPU ports under a LAG, the use of the +``IFLA_DSA_MASTER`` netlink attribute is not strictly needed, but rather, DSA +reacts to the ``IFLA_MASTER`` attribute change of its present master (``eth0``) +and migrates all user ports to the new upper of ``eth0``, ``bond0``. Similarly, +when ``bond0`` is destroyed using ``RTM_DELLINK``, DSA migrates the user ports +that were assigned to this interface to the first physical DSA master which is +eligible, based on the firmware description (it effectively reverts to the +startup configuration). + +In a setup with more than 2 physical CPU ports, it is therefore possible to mix +static user to CPU port assignment with LAG between DSA masters. It is not +possible to statically assign a user port towards a DSA master that has any +upper interfaces (this includes LAG devices - the master must always be the LAG +in this case). + +Live changing of the DSA master (and thus CPU port) affinity of a user port is +permitted, in order to allow dynamic redistribution in response to traffic. + +Physical DSA masters are allowed to join and leave at any time a LAG interface +used as a DSA master; however, DSA will reject a LAG interface as a valid +candidate for being a DSA master unless it has at least one physical DSA master +as a slave device. diff --git a/Documentation/networking/dsa/dsa.rst b/Documentation/networking/dsa/dsa.rst index d742ba6bd211..a94ddf83348a 100644 --- a/Documentation/networking/dsa/dsa.rst +++ b/Documentation/networking/dsa/dsa.rst @@ -303,6 +303,20 @@ These frames are then queued for transmission using the master network device Ethernet switch will be able to process these incoming frames from the management interface and deliver them to the physical switch port. +When using multiple CPU ports, it is possible to stack a LAG (bonding/team) +device between the DSA slave devices and the physical DSA masters. The LAG +device is thus also a DSA master, but the LAG slave devices continue to be DSA +masters as well (just with no user port assigned to them; this is needed for +recovery in case the LAG DSA master disappears). Thus, the data path of the LAG +DSA master is used asymmetrically. On RX, the ``ETH_P_XDSA`` handler, which +calls ``dsa_switch_rcv()``, is invoked early (on the physical DSA master; +LAG slave). Therefore, the RX data path of the LAG DSA master is not used. +On the other hand, TX takes place linearly: ``dsa_slave_xmit`` calls +``dsa_enqueue_skb``, which calls ``dev_queue_xmit`` towards the LAG DSA master. +The latter calls ``dev_queue_xmit`` towards one physical DSA master or the +other, and in both cases, the packet exits the system through a hardware path +towards the switch. + Graphical representation ------------------------ @@ -629,6 +643,24 @@ Switch configuration PHY cannot be found. In this case, probing of the DSA switch continues without that particular port. +- ``port_change_master``: method through which the affinity (association used + for traffic termination purposes) between a user port and a CPU port can be + changed. By default all user ports from a tree are assigned to the first + available CPU port that makes sense for them (most of the times this means + the user ports of a tree are all assigned to the same CPU port, except for H + topologies as described in commit 2c0b03258b8b). The ``port`` argument + represents the index of the user port, and the ``master`` argument represents + the new DSA master ``net_device``. The CPU port associated with the new + master can be retrieved by looking at ``struct dsa_port *cpu_dp = + master->dsa_ptr``. Additionally, the master can also be a LAG device where + all the slave devices are physical DSA masters. LAG DSA masters also have a + valid ``master->dsa_ptr`` pointer, however this is not unique, but rather a + duplicate of the first physical DSA master's (LAG slave) ``dsa_ptr``. In case + of a LAG DSA master, a further call to ``port_lag_join`` will be emitted + separately for the physical CPU ports associated with the physical DSA + masters, requesting them to create a hardware LAG associated with the LAG + interface. + PHY devices and link management ------------------------------- @@ -1095,9 +1127,3 @@ capable hardware, but does not enforce a strict switch device driver model. On the other DSA enforces a fairly strict device driver model, and deals with most of the switch specific. At some point we should envision a merger between these two subsystems and get the best of both worlds. - -Other hanging fruits --------------------- - -- allowing more than one CPU/management interface: - http://comments.gmane.org/gmane.linux.network/365657 From patchwork Sun Sep 11 01:07:06 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Oltean X-Patchwork-Id: 12972742 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D64ABECAAD5 for ; Sun, 11 Sep 2022 01:10:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230132AbiIKBKM (ORCPT ); Sat, 10 Sep 2022 21:10:12 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58642 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229977AbiIKBJI (ORCPT ); Sat, 10 Sep 2022 21:09:08 -0400 Received: from EUR03-DBA-obe.outbound.protection.outlook.com (mail-dbaeur03on2087.outbound.protection.outlook.com [40.107.104.87]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7AC984DB03; Sat, 10 Sep 2022 18:08:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=SUQo6TTkII9NDA4COBJQLaeWMVagToaDAQoNsYFjRrhRWIbd+omfvo5uyub5WzoWlfYTTN/irpvYri9zVWnLzf7j0h0fA8wQhk4n3uw09lvCjzlQZIaXO0dxxeacJ4utHWwXL/zHzFmAJPOPfu6+JvYp9UouIJ+AkgrUwHpYSHH8DBUhYrX0XG0r3pLwyD48zyJ7GZZdugQG1b4vr/cW5+iqlF4BgcvPqI2DXjAJ6hKvkKKA4e47ejfsn3Yn8OnWrNWBBFU54R3k70xk4TaimAJ0hXYGgm2I1zNjv/6Fd9dASayG5LskymtJIeZFLAkZdA/ROjYcRW8RrS+TkrqGJQ== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=sw6Pq9fAuMHXVbCrUOFl6qpdEOonBAGV652RMp/1rUc=; b=itY9x0c3JPu7NwbSoPiiRnnOcUeISMdPOMOdk70dwYBFILy3Evv8OGrZeIQDvrFeNP95efLmz4O8+JJWCRMP/xbU9DEy/54gAexY0r7QrVPP0NAuFmd633GCj3v2lmy+m6PuZW7IZiJyTCTz7MooSRZLkW0LPsE0v99bExk6fJ6oV69YwhVUJbh60hULKLxtvRmK7CJNaxqQ5bmYspT0lFn6borzC7jWAQYuuyQ9NNpI+bibZVMhOOvAeNsu3BNowwWeAZUQhDtno5v4u6fG/QqxhpMlujGfZ6FOoch2+R15L0Z6Qr4ApVHkas2ymP633S/mF912M8Qa7bNF3srI5g== 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=sw6Pq9fAuMHXVbCrUOFl6qpdEOonBAGV652RMp/1rUc=; b=NjkOxdQeR4R7Fw0Gn1XFg6p/jjktO539gpw18Zu8ue41ds9vAl8Ucw1B8lKDvE3JGrhYO34RdYiDwwuhT0wt2ihpgRVLx71hChYh3mcBdjKrFMrp5MjKycQzt+I5Weon65LyoSJahx5rjf1CfxUmJbP4n7BeJi4l2I+1aaj/Ru4= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM0PR04MB5121.eurprd04.prod.outlook.com (2603:10a6:208:c1::16) by DBBPR04MB7739.eurprd04.prod.outlook.com (2603:10a6:10:1eb::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5612.22; Sun, 11 Sep 2022 01:08:06 +0000 Received: from AM0PR04MB5121.eurprd04.prod.outlook.com ([fe80::5d3b:4f24:dbeb:e292]) by AM0PR04MB5121.eurprd04.prod.outlook.com ([fe80::5d3b:4f24:dbeb:e292%5]) with mapi id 15.20.5612.020; Sun, 11 Sep 2022 01:08:06 +0000 From: Vladimir Oltean To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Florian Fainelli , Vivien Didelot , Andrew Lunn , Vladimir Oltean , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Colin Foster , Roopa Prabhu , Nikolay Aleksandrov , Tobias Waldekranz , =?utf-8?q?Marek_Beh=C3=BAn?= , Ansuel Smith , DENG Qingfang , =?utf-8?q?Alvin_=C5=A0ipraga?= , Linus Walleij , Luiz Angelo Daros de Luca , Felix Fietkau , John Crispin , Sean Wang , David Ahern , Stephen Hemminger Subject: [PATCH v2 net-next 10/10] net: dsa: felix: add support for changing DSA master Date: Sun, 11 Sep 2022 04:07:06 +0300 Message-Id: <20220911010706.2137967-11-vladimir.oltean@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220911010706.2137967-1-vladimir.oltean@nxp.com> References: <20220911010706.2137967-1-vladimir.oltean@nxp.com> X-ClientProxiedBy: VI1PR08CA0129.eurprd08.prod.outlook.com (2603:10a6:800:d4::31) To AM0PR04MB5121.eurprd04.prod.outlook.com (2603:10a6:208:c1::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR04MB5121:EE_|DBBPR04MB7739:EE_ X-MS-Office365-Filtering-Correlation-Id: fdd786f9-63e1-4b23-5852-08da93921594 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 6D5bodeDO55lrqw9apM6DMp3CpERvooDw0i9gSEG3+LXzXsQtY5Rmtf2gX4FYOdkVwQOrQ7O9HGOpeifNbLy4rNlomIcaG1G19I1uN57kIdR/p54FMdQnhpHv4GCSNSl2VrZN6Dld9U3N21SbT5nJXA2hwoO0UthceymWe5tzmx2v8Sr83+EdAC+s8LdZn+nRHNFeeoxWnu0taMSAl+EBX1ezlDG7zhTQ5CvEuaqtbZAqaRDuVbB2onyBf4Fr5ztQdF9qf0kQhDng6oFK9WF17Nj2QdtGREqeaK2wkgwoBdXNkshg9qVXydSjyccv664do1i1nZBK6qVEtekXT39ACbVvFa/7zau+K+9ZkaqXvaXVrNCTzS7XVIdSJdv1Cj2Q0qmr4cl103gt7Tj3AkL7zghXbZssK2yGXNX4TAMtviSCbWqMMuKl/6Sv874W+gOVO5X18Kt5tCjl7yHVj4z94/TzpMwT7pvnFTUyQbQ9+EU+UPHZq1aeQWKn1YCHtTSnRkTj43L1E0UfJYDKrPevZr2KrfXdkPOqgQcw+vyOXkL+myLqTaH+jHaoE4nnEwHAkQG96j2MQwnZzGlADKqL1PGyoLeL0Iq+ezPK5GfT1DmetYZpXczLRXq+61LcCxDyt1bs2/5vzuf8ELcos+49gF2HXPpBF8KpJu5Rn9x7+A1w9vKXLX34TOpA+i+qezVZVsxEeEJuwoHPAgooUy9HaMdFjLR1HxuQZX/fExEVT+JXML9LQJKAw33AsIcyN2jZI+stRBQryb19F7F5BnSF5Z6TpUs7v9ve7BgSYb9S+A= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM0PR04MB5121.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230016)(4636009)(346002)(136003)(376002)(39860400002)(396003)(366004)(38100700002)(38350700002)(30864003)(2906002)(44832011)(83380400001)(2616005)(186003)(1076003)(316002)(66476007)(66556008)(4326008)(8936002)(66946007)(8676002)(54906003)(6916009)(36756003)(7416002)(5660300002)(478600001)(41300700001)(52116002)(6486002)(26005)(6512007)(86362001)(6506007)(309714004);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: GMyfJlvrxqzTiuBiurmIWOO5f/NuePGFC0l9ablap0ezJaBw3gHWCzSTCHyCFiZSQSqKIgt/0iNnxJs/r1Riy/kkxHAFnRL5XU1FyWweSHCw+lEsu83b0QN89AeZA2uPIW9uB7BT8qRXfQbxb+aJxW2UJDjL+4TsrdnO+S7yMbBKT6uEwzGMedBZ/hgGC6QkRy9guenskDKhpmKtlV97WoCqjyIGI5fZ8pg6+h/OE5neQaOCMMZQvPHC+VUvxn4Op6VCfD1I9YUdPNg3rktPg8bl9ubLGstclnJzyftpp3LjxGjdXkCMH6SxsppaLf6S+H6VXy6iW+BYm67x/8yvmufVCsoBKcghi2MqtMdjCbcytHaM5vvYII5F3194rymEQa6mpIDKSb3AIT/gnupRxQOFoPEoU1BtP2sqszfZgGas1ArZFtHnXWqG5fq6r+LCObKfeOHYUYDWG9VfuPVnPbOwolFzIpSFhkVuA0w+swkZFfbkoxBgOLKidIhThPT220lxM0EgpbEIewuZlRUTNjqxeq2CFapTfspOI9eNnASYCkzUBeVE2a/Qx3k7YNFTkAkOuV/kngGPvWNplMQlsgG5J6424xsQrGqv3yLP3apVeSMnLSGDLLIk3v1Hwk9OY6VZlewUfS1tsmlOaapXrGAnKZ0dabgbnGWrU7RZ7S9nQNqk/fRBfgUm5v0lPOngeufz/UgVjYniMAJHj7L7mPOFnJBIZZlEQjbVSM2HkR02hOikDjyNasm8N7EZRaJpD+R02I7GBxCTYHAPRr0p4n26ywmWY3hh9V0aIRpfsKHapH0TJTq2/zERLtsjLn9J5JPX6cQADJp0T0WF6LrSb1tVH0KTivSWScMlOP6ZKzAb6FMIWrU2t6govoOxgKesVdYALNi2X/q9LFaDoUqaaQOa5MKiRTtRGOAw8QwS6KvMkMAfn3vW9ZYqtgtIACemPsUyFzNreuMHxm2lqdCM7CL8K9KHavXbvF0V/Dv6kEtHFD6r4cppboCSGKVhne1k9EBddF4X4M04yJ0u5OJy1ryE/zKlI+kaU95EMxGq6fyyxe9My0igjJ6SsH/eTNy8LxJGPuos4CI6vyz3L8rXGKbZ3VZGIZRVzwcv9kRTD7QpNZrHSkZWY4KhAEWDNQt0gcWp51lKh4m956TP+s3Ic7MVjIx2ZpgUr4aUABPhajIaX5Opl0c/aKJ6hoa3Ek10yUYkibcpAXg7aVwUwu7GSbPZNn/t5AbFIjc2/QKKJJkT1u/+8qxEYEeuDvMBy8dsIx694q7KdoOy0aU54S5WnVg2DQTJbCDT4Sqo2YVvHvxt5y19+/hUTrBqPfijUAN9VWJA7ZBYMXgwMKXIGwg/qI3IvaG/1l2DA72J1PhUW5inR+p6wz59g0vt2rGCsug5DlLo30OZskXjdbnbigrFP2cNExTZFFjpZBtJheZGmI7p4j8yhwTIpFl9My3rjpwjpdgj3l+/gXvcEHGG6BLvJKwUd6GQFsj6RQjRnJhviTyZeRnM2Rh1TYeIUltyZ9EP5e6RrJLZGEYFGrwlkdVQZyTPT+y5riCcGhMQArRlw/HpFDbZQrfi5flwKR0w+m/0QFMt1NXSrp0tq2iE0dY+5w== X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: fdd786f9-63e1-4b23-5852-08da93921594 X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB5121.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Sep 2022 01:08:06.4304 (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: VBpGuRNAQXtwqyDq4aapfyxnXCYnd7ZhYKaRHXFIkAWqw4iAEXPvIIKP5YDt+EN267d8tG1nNgbwR3zJ5kYqOA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBBPR04MB7739 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org Changing the DSA master means different things depending on the tagging protocol in use. For NPI mode ("ocelot" and "seville"), there is a single port which can be configured as NPI, but DSA only permits changing the CPU port affinity of user ports one by one. So changing a user port to a different NPI port globally changes what the NPI port is, and breaks the user ports still using the old one. To address this while still permitting the change of the NPI port, require that the user ports which are still affine to the old NPI port are down, and cannot be brought up until they are all affine to the same NPI port. The tag_8021q mode ("ocelot-8021q") is more flexible, in that each user port can be freely assigned to one CPU port or to the other. This works by filtering host addresses towards both tag_8021q CPU ports, and then restricting the forwarding from a certain user port only to one of the two tag_8021q CPU ports. Additionally, the 2 tag_8021q CPU ports can be placed in a LAG. This works by enabling forwarding via PGID_SRC from a certain user port towards the logical port ID containing both tag_8021q CPU ports, but then restricting forwarding per packet, via the LAG hash codes in PGID_AGGR, to either one or the other. When we change the DSA master to a LAG device, DSA guarantees us that the LAG has at least one lower interface as a physical DSA master. But DSA masters can come and go as lowers of that LAG, and ds->ops->port_change_master() will not get called, because the DSA master is still the same (the LAG). So we need to hook into the ds->ops->port_lag_{join,leave} calls on the CPU ports and update the logical port ID of the LAG that user ports are assigned to. Signed-off-by: Vladimir Oltean --- v1->v2: pass extack to felix_port_change_master() from felix_lag_join() drivers/net/dsa/ocelot/felix.c | 118 ++++++++++++++++++++++++++++- drivers/net/dsa/ocelot/felix.h | 3 + drivers/net/ethernet/mscc/ocelot.c | 3 +- include/soc/mscc/ocelot.h | 1 + 4 files changed, 122 insertions(+), 3 deletions(-) diff --git a/drivers/net/dsa/ocelot/felix.c b/drivers/net/dsa/ocelot/felix.c index 82dcc21a7172..d2a9d292160c 100644 --- a/drivers/net/dsa/ocelot/felix.c +++ b/drivers/net/dsa/ocelot/felix.c @@ -42,6 +42,25 @@ static struct net_device *felix_classify_db(struct dsa_db db) } } +static int felix_cpu_port_for_master(struct dsa_switch *ds, + struct net_device *master) +{ + struct ocelot *ocelot = ds->priv; + struct dsa_port *cpu_dp; + int lag; + + if (netif_is_lag_master(master)) { + mutex_lock(&ocelot->fwd_domain_lock); + lag = ocelot_bond_get_id(ocelot, master); + mutex_unlock(&ocelot->fwd_domain_lock); + + return lag; + } + + cpu_dp = master->dsa_ptr; + return cpu_dp->index; +} + /* Set up VCAP ES0 rules for pushing a tag_8021q VLAN towards the CPU such that * the tagger can perform RX source port identification. */ @@ -422,6 +441,40 @@ static unsigned long felix_tag_npi_get_host_fwd_mask(struct dsa_switch *ds) return BIT(ocelot->num_phys_ports); } +static int felix_tag_npi_change_master(struct dsa_switch *ds, int port, + struct net_device *master, + struct netlink_ext_ack *extack) +{ + struct dsa_port *dp = dsa_to_port(ds, port), *other_dp; + struct ocelot *ocelot = ds->priv; + + if (netif_is_lag_master(master)) { + NL_SET_ERR_MSG_MOD(extack, + "LAG DSA master only supported using ocelot-8021q"); + return -EOPNOTSUPP; + } + + /* Changing the NPI port breaks user ports still assigned to the old + * one, so only allow it while they're down, and don't allow them to + * come back up until they're all changed to the new one. + */ + dsa_switch_for_each_user_port(other_dp, ds) { + struct net_device *slave = other_dp->slave; + + if (other_dp != dp && (slave->flags & IFF_UP) && + dsa_port_to_master(other_dp) != master) { + NL_SET_ERR_MSG_MOD(extack, + "Cannot change while old master still has users"); + return -EOPNOTSUPP; + } + } + + felix_npi_port_deinit(ocelot, ocelot->npi); + felix_npi_port_init(ocelot, felix_cpu_port_for_master(ds, master)); + + return 0; +} + /* Alternatively to using the NPI functionality, that same hardware MAC * connected internally to the enetc or fman DSA master can be configured to * use the software-defined tag_8021q frame format. As far as the hardware is @@ -433,6 +486,7 @@ static const struct felix_tag_proto_ops felix_tag_npi_proto_ops = { .setup = felix_tag_npi_setup, .teardown = felix_tag_npi_teardown, .get_host_fwd_mask = felix_tag_npi_get_host_fwd_mask, + .change_master = felix_tag_npi_change_master, }; static int felix_tag_8021q_setup(struct dsa_switch *ds) @@ -507,10 +561,24 @@ static unsigned long felix_tag_8021q_get_host_fwd_mask(struct dsa_switch *ds) return dsa_cpu_ports(ds); } +static int felix_tag_8021q_change_master(struct dsa_switch *ds, int port, + struct net_device *master, + struct netlink_ext_ack *extack) +{ + int cpu = felix_cpu_port_for_master(ds, master); + struct ocelot *ocelot = ds->priv; + + ocelot_port_unassign_dsa_8021q_cpu(ocelot, port); + ocelot_port_assign_dsa_8021q_cpu(ocelot, port, cpu); + + return felix_update_trapping_destinations(ds, true); +} + static const struct felix_tag_proto_ops felix_tag_8021q_proto_ops = { .setup = felix_tag_8021q_setup, .teardown = felix_tag_8021q_teardown, .get_host_fwd_mask = felix_tag_8021q_get_host_fwd_mask, + .change_master = felix_tag_8021q_change_master, }; static void felix_set_host_flood(struct dsa_switch *ds, unsigned long mask, @@ -673,6 +741,16 @@ static void felix_port_set_host_flood(struct dsa_switch *ds, int port, !!felix->host_flood_mc_mask, true); } +static int felix_port_change_master(struct dsa_switch *ds, int port, + struct net_device *master, + struct netlink_ext_ack *extack) +{ + struct ocelot *ocelot = ds->priv; + struct felix *felix = ocelot_to_felix(ocelot); + + return felix->tag_proto_ops->change_master(ds, port, master, extack); +} + static int felix_set_ageing_time(struct dsa_switch *ds, unsigned int ageing_time) { @@ -865,8 +943,17 @@ static int felix_lag_join(struct dsa_switch *ds, int port, struct netlink_ext_ack *extack) { struct ocelot *ocelot = ds->priv; + int err; - return ocelot_port_lag_join(ocelot, port, lag.dev, info, extack); + err = ocelot_port_lag_join(ocelot, port, lag.dev, info, extack); + if (err) + return err; + + /* Update the logical LAG port that serves as tag_8021q CPU port */ + if (!dsa_is_cpu_port(ds, port)) + return 0; + + return felix_port_change_master(ds, port, lag.dev, extack); } static int felix_lag_leave(struct dsa_switch *ds, int port, @@ -876,7 +963,11 @@ static int felix_lag_leave(struct dsa_switch *ds, int port, ocelot_port_lag_leave(ocelot, port, lag.dev); - return 0; + /* Update the logical LAG port that serves as tag_8021q CPU port */ + if (!dsa_is_cpu_port(ds, port)) + return 0; + + return felix_port_change_master(ds, port, lag.dev, NULL); } static int felix_lag_change(struct dsa_switch *ds, int port) @@ -1014,6 +1105,27 @@ static void felix_phylink_mac_link_up(struct dsa_switch *ds, int port, felix->info->port_sched_speed_set(ocelot, port, speed); } +static int felix_port_enable(struct dsa_switch *ds, int port, + struct phy_device *phydev) +{ + struct dsa_port *dp = dsa_to_port(ds, port); + struct ocelot *ocelot = ds->priv; + + if (!dsa_port_is_user(dp)) + return 0; + + if (ocelot->npi >= 0) { + struct net_device *master = dsa_port_to_master(dp); + + if (felix_cpu_port_for_master(ds, master) != ocelot->npi) { + dev_err(ds->dev, "Multiple masters are not allowed\n"); + return -EINVAL; + } + } + + return 0; +} + static void felix_port_qos_map_init(struct ocelot *ocelot, int port) { int i; @@ -1913,6 +2025,7 @@ const struct dsa_switch_ops felix_switch_ops = { .phylink_mac_select_pcs = felix_phylink_mac_select_pcs, .phylink_mac_link_down = felix_phylink_mac_link_down, .phylink_mac_link_up = felix_phylink_mac_link_up, + .port_enable = felix_port_enable, .port_fast_age = felix_port_fast_age, .port_fdb_dump = felix_fdb_dump, .port_fdb_add = felix_fdb_add, @@ -1968,6 +2081,7 @@ const struct dsa_switch_ops felix_switch_ops = { .port_add_dscp_prio = felix_port_add_dscp_prio, .port_del_dscp_prio = felix_port_del_dscp_prio, .port_set_host_flood = felix_port_set_host_flood, + .port_change_master = felix_port_change_master, }; struct net_device *felix_port_to_netdev(struct ocelot *ocelot, int port) diff --git a/drivers/net/dsa/ocelot/felix.h b/drivers/net/dsa/ocelot/felix.h index deb8dde1fc19..e4fd5eef57a0 100644 --- a/drivers/net/dsa/ocelot/felix.h +++ b/drivers/net/dsa/ocelot/felix.h @@ -71,6 +71,9 @@ struct felix_tag_proto_ops { int (*setup)(struct dsa_switch *ds); void (*teardown)(struct dsa_switch *ds); unsigned long (*get_host_fwd_mask)(struct dsa_switch *ds); + int (*change_master)(struct dsa_switch *ds, int port, + struct net_device *master, + struct netlink_ext_ack *extack); }; extern const struct dsa_switch_ops felix_switch_ops; diff --git a/drivers/net/ethernet/mscc/ocelot.c b/drivers/net/ethernet/mscc/ocelot.c index 5c18f8986975..7a613b52787d 100644 --- a/drivers/net/ethernet/mscc/ocelot.c +++ b/drivers/net/ethernet/mscc/ocelot.c @@ -1382,7 +1382,7 @@ static u32 ocelot_get_bond_mask(struct ocelot *ocelot, struct net_device *bond) /* The logical port number of a LAG is equal to the lowest numbered physical * port ID present in that LAG. It may change if that port ever leaves the LAG. */ -static int ocelot_bond_get_id(struct ocelot *ocelot, struct net_device *bond) +int ocelot_bond_get_id(struct ocelot *ocelot, struct net_device *bond) { int bond_mask = ocelot_get_bond_mask(ocelot, bond); @@ -1391,6 +1391,7 @@ static int ocelot_bond_get_id(struct ocelot *ocelot, struct net_device *bond) return __ffs(bond_mask); } +EXPORT_SYMBOL_GPL(ocelot_bond_get_id); /* Returns the mask of user ports assigned to this DSA tag_8021q CPU port. * Note that when CPU ports are in a LAG, the user ports are assigned to the diff --git a/include/soc/mscc/ocelot.h b/include/soc/mscc/ocelot.h index ea19e8ef1f61..967ba30ea636 100644 --- a/include/soc/mscc/ocelot.h +++ b/include/soc/mscc/ocelot.h @@ -1234,6 +1234,7 @@ int ocelot_port_lag_join(struct ocelot *ocelot, int port, void ocelot_port_lag_leave(struct ocelot *ocelot, int port, struct net_device *bond); void ocelot_port_lag_change(struct ocelot *ocelot, int port, bool lag_tx_active); +int ocelot_bond_get_id(struct ocelot *ocelot, struct net_device *bond); int ocelot_devlink_sb_register(struct ocelot *ocelot); void ocelot_devlink_sb_unregister(struct ocelot *ocelot);