From patchwork Fri Feb 28 18:01:20 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Taehee Yoo X-Patchwork-Id: 1246763 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=Htgle/fM; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 48TcmV0yLyz9sQt for ; Sat, 29 Feb 2020 05:01:30 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726603AbgB1SB2 (ORCPT ); Fri, 28 Feb 2020 13:01:28 -0500 Received: from mail-pf1-f196.google.com ([209.85.210.196]:36945 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725730AbgB1SB2 (ORCPT ); Fri, 28 Feb 2020 13:01:28 -0500 Received: by mail-pf1-f196.google.com with SMTP id p14so2096132pfn.4 for ; Fri, 28 Feb 2020 10:01:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=WGt1LOtTJ38d9oY/wyO/YVJWKclgx0/xeYE6MF+b/As=; b=Htgle/fMjcKDmcjljxOpIgYZ4kdPOCYIHGIVfbMr5Xm7QEyX3N7jMK8y3rpNW5Zxtk sBfAI/+StL9e3g5VHShWMirbbQL1QcdoPfXQqcAAAY2K7uoRJL9MDT5dIxw9+ZgO50hZ Y8K5gSEYMDoEQQ6c25uAdRX8Pea7C9RHqtTgY2ic0LzjI4sp+xVfoxO/cE1E/GNHnycl bI8dh0O6rohHXuPV5Gb1TQD7IhpK3lMHbN8ijVlSGr0O99xI03/2IuldHGXPasX0UvST svaX9fr4MYJrrqCAGRCM7zUvkzINjOfDtulkKf2Dpxkf+vzycYtCUYHr+oc60O3bYc56 F6Cw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=WGt1LOtTJ38d9oY/wyO/YVJWKclgx0/xeYE6MF+b/As=; b=hfxrIu277Qvpv+ZJDZlJkc2c/vHRjbiAndqBXhVZRtyXycFVY4l7VUyjKqqMZf1UhQ uOJBT2+J865Ac7t3Icp8QIngGoqViXir1vRQSLYqNsiQ0LWMDpq7PIy1vltf02A9vGyn Gu79qpVZFADvt8nCHCDAanFoakpYtrLeUXrCAriDfFlk6AxI2mnmtEEIMSrJat0X7y25 ODwMRUQjXNuzLs6I9mtsRWNequ/C5yu6gm26hEmeDi+fFroOmTzBK+YhvEdonIngAKvF gaVKy5OSZpl1eYBmJxHRjbHYALvC/7ktEf9IiRcGsZX4O0GETX2WVSDXnbH2UbzUfv0v Wggw== X-Gm-Message-State: APjAAAUS1V8c/ilwHXeFu+/ZhHIU8IMDfTUZGgyf9frw3VRQKvBwf8M5 C/wWjwLIxOP06lUR1rewW7c= X-Google-Smtp-Source: APXvYqy7c/F5FHo7a9kHFKM+aaO0nriSW7mZId0MNGQHubEZ0I7sy61b6o2vFXhsHT/meyA+rs8Qsw== X-Received: by 2002:a63:450b:: with SMTP id s11mr5681731pga.45.1582912887337; Fri, 28 Feb 2020 10:01:27 -0800 (PST) Received: from localhost.localdomain ([180.70.143.152]) by smtp.gmail.com with ESMTPSA id 7sm43119pfg.12.2020.02.28.10.01.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 Feb 2020 10:01:26 -0800 (PST) From: Taehee Yoo To: davem@davemloft.net, kuba@kernel.org, netdev@vger.kernel.org Cc: ap420073@gmail.com Subject: [PATCH net-next 1/5] hsr: use debugfs_remove_recursive() instead of debugfs_remove() Date: Fri, 28 Feb 2020 18:01:20 +0000 Message-Id: <20200228180120.27604-1-ap420073@gmail.com> X-Mailer: git-send-email 2.17.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org If it uses debugfs_remove_recursive() instead of debugfs_remove(), hsr_priv() doesn't need to have "node_tbl_file" pointer variable. Signed-off-by: Taehee Yoo --- net/hsr/hsr_debugfs.c | 5 +---- net/hsr/hsr_main.h | 1 - 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/net/hsr/hsr_debugfs.c b/net/hsr/hsr_debugfs.c index d5f709b940ff..9787ef11ca71 100644 --- a/net/hsr/hsr_debugfs.c +++ b/net/hsr/hsr_debugfs.c @@ -113,7 +113,6 @@ void hsr_debugfs_init(struct hsr_priv *priv, struct net_device *hsr_dev) priv->node_tbl_root = NULL; return; } - priv->node_tbl_file = de; } /* hsr_debugfs_term - Tear down debugfs intrastructure @@ -125,9 +124,7 @@ void hsr_debugfs_init(struct hsr_priv *priv, struct net_device *hsr_dev) void hsr_debugfs_term(struct hsr_priv *priv) { - debugfs_remove(priv->node_tbl_file); - priv->node_tbl_file = NULL; - debugfs_remove(priv->node_tbl_root); + debugfs_remove_recursive(priv->node_tbl_root); priv->node_tbl_root = NULL; } diff --git a/net/hsr/hsr_main.h b/net/hsr/hsr_main.h index 754d84b217f0..7321cf8d6d2c 100644 --- a/net/hsr/hsr_main.h +++ b/net/hsr/hsr_main.h @@ -166,7 +166,6 @@ struct hsr_priv { unsigned char sup_multicast_addr[ETH_ALEN]; #ifdef CONFIG_DEBUG_FS struct dentry *node_tbl_root; - struct dentry *node_tbl_file; #endif }; From patchwork Fri Feb 28 18:01:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Taehee Yoo X-Patchwork-Id: 1246764 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=abgwU2yU; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 48Tcmm67Jfz9sQt for ; Sat, 29 Feb 2020 05:01:44 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726674AbgB1SBn (ORCPT ); Fri, 28 Feb 2020 13:01:43 -0500 Received: from mail-pg1-f196.google.com ([209.85.215.196]:45770 "EHLO mail-pg1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725730AbgB1SBn (ORCPT ); Fri, 28 Feb 2020 13:01:43 -0500 Received: by mail-pg1-f196.google.com with SMTP id m15so1880715pgv.12 for ; Fri, 28 Feb 2020 10:01:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=EMG8mLdlSEBMuMtWPWrjvkI/oIKYNHu26M3KebVZLEo=; b=abgwU2yUewFvGAWPYFNbm6hro8tiBC0K2Sor0CzcbWNnVZcUJ3wLfikuyjyKuPYtq2 h7EKUu95f2I92/YVoUzMhsj2MSShldj1EJM+UfTZ2AAOTN85dBZH6uBUVSb2+8fHhPCp 30ziqV1y9bojRDGpWgn3St5BZboUMcDZLH706T/ZjhBQ8NjdbpG7W7Itbehx0m43a4La zmAq7tk+8uMIUb+I6/Gn6bXdOwQfIjqpdrCR5p8PqavWYwHfpr4b23+ThqkuY30j/Dit xpQsVLSO8qK+vjN4aP9unXd1QvjiFCq/Pvz3HYYPI30riqX0FrJ8a4UA0TCOCe6r48J8 Jluw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=EMG8mLdlSEBMuMtWPWrjvkI/oIKYNHu26M3KebVZLEo=; b=sU/54/WoyDcQ1p6wrQEAJppRA9RfDglaxZG/98xVx0xFOYEc4rJsWN4jpS1ut+ssKo NMyRGkFpedHVkXyDMkPGP0t/h9KdLaDaG2VSP/ll6ud4gMTlqA+xXH3NjcppcW/1akV5 2r39yl+ZJlNaiRYA1J3k/XzL/QnN+Y/IC3BZp5aK63VmPDSszwL+O2cu73VqMwE9s/kr 15zaTLcnKK4cb2N6Y0h7C4m4eKn+wwqQ7OzEqwoLujIV4dGPBeJjs48+ISALNr8H835z PbVt8tpJHc/BPTLfMw0sT1c5UpEMXg8XChQ5xEBwGBD+hbuyn5dKphb3EG/7hm+isbwx UZdw== X-Gm-Message-State: APjAAAVjHurLrFp/TS6kT4KfXO7hFTQr/FzZWGmy8Ha2FyFdwjJuIFGN EAYZBwtiiTFYEsUcqGEetzA= X-Google-Smtp-Source: APXvYqzO98UXq3R4Am4bHx5dtniQkl/Rk0F9NUh7HPXN8ZxuDhQlKgTXcXjQkWNRV1kLuM5l/RRLWg== X-Received: by 2002:aa7:98c6:: with SMTP id e6mr5531507pfm.251.1582912902236; Fri, 28 Feb 2020 10:01:42 -0800 (PST) Received: from localhost.localdomain ([180.70.143.152]) by smtp.gmail.com with ESMTPSA id q3sm1888149pgj.92.2020.02.28.10.01.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 Feb 2020 10:01:41 -0800 (PST) From: Taehee Yoo To: davem@davemloft.net, kuba@kernel.org, netdev@vger.kernel.org Cc: ap420073@gmail.com Subject: [PATCH net-next 2/5] hsr: use extack error message instead of netdev_info Date: Fri, 28 Feb 2020 18:01:35 +0000 Message-Id: <20200228180135.27683-1-ap420073@gmail.com> X-Mailer: git-send-email 2.17.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org If HSR uses the extack instead of netdev_info(), users can get error messages immediately without any checking the kernel message. Signed-off-by: Taehee Yoo --- net/hsr/hsr_device.c | 9 +++++---- net/hsr/hsr_device.h | 3 ++- net/hsr/hsr_netlink.c | 22 +++++++++++++++------- net/hsr/hsr_slave.c | 20 ++++++++++++-------- net/hsr/hsr_slave.h | 2 +- 5 files changed, 35 insertions(+), 21 deletions(-) diff --git a/net/hsr/hsr_device.c b/net/hsr/hsr_device.c index c7bd6c49fadf..a48f621c2fec 100644 --- a/net/hsr/hsr_device.c +++ b/net/hsr/hsr_device.c @@ -431,7 +431,8 @@ static const unsigned char def_multicast_addr[ETH_ALEN] __aligned(2) = { }; int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2], - unsigned char multicast_spec, u8 protocol_version) + unsigned char multicast_spec, u8 protocol_version, + struct netlink_ext_ack *extack) { struct hsr_priv *hsr; struct hsr_port *port; @@ -478,7 +479,7 @@ int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2], /* Make sure the 1st call to netif_carrier_on() gets through */ netif_carrier_off(hsr_dev); - res = hsr_add_port(hsr, hsr_dev, HSR_PT_MASTER); + res = hsr_add_port(hsr, hsr_dev, HSR_PT_MASTER, extack); if (res) goto err_add_master; @@ -486,11 +487,11 @@ int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2], if (res) goto err_unregister; - res = hsr_add_port(hsr, slave[0], HSR_PT_SLAVE_A); + res = hsr_add_port(hsr, slave[0], HSR_PT_SLAVE_A, extack); if (res) goto err_add_slaves; - res = hsr_add_port(hsr, slave[1], HSR_PT_SLAVE_B); + res = hsr_add_port(hsr, slave[1], HSR_PT_SLAVE_B, extack); if (res) goto err_add_slaves; diff --git a/net/hsr/hsr_device.h b/net/hsr/hsr_device.h index 6d7759c4f5f9..a099d7de7e79 100644 --- a/net/hsr/hsr_device.h +++ b/net/hsr/hsr_device.h @@ -13,7 +13,8 @@ void hsr_dev_setup(struct net_device *dev); int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2], - unsigned char multicast_spec, u8 protocol_version); + unsigned char multicast_spec, u8 protocol_version, + struct netlink_ext_ack *extack); void hsr_check_carrier_and_operstate(struct hsr_priv *hsr); bool is_hsr_master(struct net_device *dev); int hsr_get_max_mtu(struct hsr_priv *hsr); diff --git a/net/hsr/hsr_netlink.c b/net/hsr/hsr_netlink.c index 8dc0547f01d0..7ed308a0c035 100644 --- a/net/hsr/hsr_netlink.c +++ b/net/hsr/hsr_netlink.c @@ -35,26 +35,34 @@ static int hsr_newlink(struct net *src_net, struct net_device *dev, unsigned char multicast_spec, hsr_version; if (!data) { - netdev_info(dev, "HSR: No slave devices specified\n"); + NL_SET_ERR_MSG_MOD(extack, "No slave devices specified"); return -EINVAL; } if (!data[IFLA_HSR_SLAVE1]) { - netdev_info(dev, "HSR: Slave1 device not specified\n"); + NL_SET_ERR_MSG_MOD(extack, "Slave1 device not specified"); return -EINVAL; } link[0] = __dev_get_by_index(src_net, nla_get_u32(data[IFLA_HSR_SLAVE1])); + if (!link[0]) { + NL_SET_ERR_MSG_MOD(extack, "Slave1 does not exist"); + return -EINVAL; + } if (!data[IFLA_HSR_SLAVE2]) { - netdev_info(dev, "HSR: Slave2 device not specified\n"); + NL_SET_ERR_MSG_MOD(extack, "Slave2 device not specified"); return -EINVAL; } link[1] = __dev_get_by_index(src_net, nla_get_u32(data[IFLA_HSR_SLAVE2])); + if (!link[1]) { + NL_SET_ERR_MSG_MOD(extack, "Slave2 does not exist"); + return -EINVAL; + } - if (!link[0] || !link[1]) - return -ENODEV; - if (link[0] == link[1]) + if (link[0] == link[1]) { + NL_SET_ERR_MSG_MOD(extack, "Slave1 and Slave2 are same"); return -EINVAL; + } if (!data[IFLA_HSR_MULTICAST_SPEC]) multicast_spec = 0; @@ -66,7 +74,7 @@ static int hsr_newlink(struct net *src_net, struct net_device *dev, else hsr_version = nla_get_u8(data[IFLA_HSR_VERSION]); - return hsr_dev_finalize(dev, link, multicast_spec, hsr_version); + return hsr_dev_finalize(dev, link, multicast_spec, hsr_version, extack); } static int hsr_fill_info(struct sk_buff *skb, const struct net_device *dev) diff --git a/net/hsr/hsr_slave.c b/net/hsr/hsr_slave.c index fbfd0db182b7..127ebcc0e28f 100644 --- a/net/hsr/hsr_slave.c +++ b/net/hsr/hsr_slave.c @@ -58,33 +58,37 @@ bool hsr_port_exists(const struct net_device *dev) return rcu_access_pointer(dev->rx_handler) == hsr_handle_frame; } -static int hsr_check_dev_ok(struct net_device *dev) +static int hsr_check_dev_ok(struct net_device *dev, + struct netlink_ext_ack *extack) { /* Don't allow HSR on non-ethernet like devices */ if ((dev->flags & IFF_LOOPBACK) || dev->type != ARPHRD_ETHER || dev->addr_len != ETH_ALEN) { - netdev_info(dev, "Cannot use loopback or non-ethernet device as HSR slave.\n"); + NL_SET_ERR_MSG_MOD(extack, "Cannot use loopback or non-ethernet device as HSR slave."); return -EINVAL; } /* Don't allow enslaving hsr devices */ if (is_hsr_master(dev)) { - netdev_info(dev, "Cannot create trees of HSR devices.\n"); + NL_SET_ERR_MSG_MOD(extack, + "Cannot create trees of HSR devices."); return -EINVAL; } if (hsr_port_exists(dev)) { - netdev_info(dev, "This device is already a HSR slave.\n"); + NL_SET_ERR_MSG_MOD(extack, + "This device is already a HSR slave."); return -EINVAL; } if (is_vlan_dev(dev)) { - netdev_info(dev, "HSR on top of VLAN is not yet supported in this driver.\n"); + NL_SET_ERR_MSG_MOD(extack, "HSR on top of VLAN is not yet supported in this driver."); return -EINVAL; } if (dev->priv_flags & IFF_DONT_BRIDGE) { - netdev_info(dev, "This device does not support bridging.\n"); + NL_SET_ERR_MSG_MOD(extack, + "This device does not support bridging."); return -EOPNOTSUPP; } @@ -126,13 +130,13 @@ static int hsr_portdev_setup(struct net_device *dev, struct hsr_port *port) } int hsr_add_port(struct hsr_priv *hsr, struct net_device *dev, - enum hsr_port_type type) + enum hsr_port_type type, struct netlink_ext_ack *extack) { struct hsr_port *port, *master; int res; if (type != HSR_PT_MASTER) { - res = hsr_check_dev_ok(dev); + res = hsr_check_dev_ok(dev, extack); if (res) return res; } diff --git a/net/hsr/hsr_slave.h b/net/hsr/hsr_slave.h index 64b549529592..8953ea279ce9 100644 --- a/net/hsr/hsr_slave.h +++ b/net/hsr/hsr_slave.h @@ -13,7 +13,7 @@ #include "hsr_main.h" int hsr_add_port(struct hsr_priv *hsr, struct net_device *dev, - enum hsr_port_type pt); + enum hsr_port_type pt, struct netlink_ext_ack *extack); void hsr_del_port(struct hsr_port *port); bool hsr_port_exists(const struct net_device *dev); From patchwork Fri Feb 28 18:01:46 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Taehee Yoo X-Patchwork-Id: 1246765 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=E/g3eo9C; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 48Tcmz2Z0Cz9sQt for ; Sat, 29 Feb 2020 05:01:55 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726733AbgB1SBy (ORCPT ); Fri, 28 Feb 2020 13:01:54 -0500 Received: from mail-pj1-f68.google.com ([209.85.216.68]:33986 "EHLO mail-pj1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725730AbgB1SBy (ORCPT ); Fri, 28 Feb 2020 13:01:54 -0500 Received: by mail-pj1-f68.google.com with SMTP id f2so4543301pjq.1 for ; Fri, 28 Feb 2020 10:01:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=q4MFo5bjVCZH4uqjjKMHTGirPSQBeeM7T0vVU3JGwlo=; b=E/g3eo9Cast0PPxafdSzb7ct4d6PsM0P41k6yikUdle7dNXKOKMID+4O3mPYAmYfdy knb997OvADOaZoTSMcVKfmhOy3wDy2MrnbZNRP3ORoluFawcYU4d89Iujt6K6dEQ5bb7 4jYN2cqyPWyMpUNoEKTSae6BVdIICDSKVAOBPjHuGqorEYH+pgPC4ojSDZTipX7Sd8/l ewwwyFQD85sOUkf4zdqgKxxeO5WStmWvDUeaTetamhJGZkKBoR1SNR7t7Ho9TGeMSMG5 7zYWdR8Zlu+IEwg4UGfe3a2Urz/CsO44OmV2RuBZIzfBnNqf1WeLY1Q36wqOpOBQbspy Q44A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=q4MFo5bjVCZH4uqjjKMHTGirPSQBeeM7T0vVU3JGwlo=; b=FzuSEVbRzYdfcvzKAbKbSzyoRd/XP/so+D4j97IyMbJIOxzoh7klxkd91UE5CxJ3Hv wa7wLajEAvApt1MjSpNpBg0Nee8PyhGx8ZVnjAPHmZA8BmnmYGmL2kT0qt+C+6+o8mkk 9HihCccdvgclKBVf7LVnMtUYHhR5lS7rlRUq7C45pQtsgBu7Pw+Qj0xd8eyF+YN+jliP ss1bQpcT3gh1f7mqVHK8BlK/SDhZDboj2vbcMwQrHy/VCaqtKEXaEfmz9YUfQhprIQrs cQCEvqrnVt29hODEXSZtl3QEZbiYZG117QI2P66UzFHoG0jTp6RDCNv7MiNiX7ijEX9p L9Jg== X-Gm-Message-State: APjAAAVK4pJ1AefwqHf0rY6to8FEbmscyS3YM7Sdu5Nc1z6tOQ4Y7GYS zdQ826rgDaZCPHVxdsnbSvg= X-Google-Smtp-Source: APXvYqxO5CT4qosA2aQlpbpxtx/n34mCU5dhrSpdCQWaatxDFSyHnN2LxaNCpV5AF3DFJ5OWIzkQzg== X-Received: by 2002:a17:90a:7f93:: with SMTP id m19mr5787623pjl.92.1582912912107; Fri, 28 Feb 2020 10:01:52 -0800 (PST) Received: from localhost.localdomain ([180.70.143.152]) by smtp.gmail.com with ESMTPSA id a9sm11557625pfo.35.2020.02.28.10.01.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 Feb 2020 10:01:51 -0800 (PST) From: Taehee Yoo To: davem@davemloft.net, kuba@kernel.org, netdev@vger.kernel.org Cc: ap420073@gmail.com Subject: [PATCH net-next 3/5] hsr: use netdev_err() instead of WARN_ONCE() Date: Fri, 28 Feb 2020 18:01:46 +0000 Message-Id: <20200228180146.27762-1-ap420073@gmail.com> X-Mailer: git-send-email 2.17.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org When HSR interface is sending a frame, it finds a node with the destination ethernet address from the list. If there is no node, it calls WARN_ONCE(). But, using WARN_ONCE() for this situation is a little bit overdoing. So, in this patch, the netdev_err() is used instead. Signed-off-by: Taehee Yoo --- net/hsr/hsr_framereg.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/net/hsr/hsr_framereg.c b/net/hsr/hsr_framereg.c index 364ea2cc028e..36cf582afad2 100644 --- a/net/hsr/hsr_framereg.c +++ b/net/hsr/hsr_framereg.c @@ -317,7 +317,8 @@ void hsr_addr_subst_dest(struct hsr_node *node_src, struct sk_buff *skb, node_dst = find_node_by_addr_A(&port->hsr->node_db, eth_hdr(skb)->h_dest); if (!node_dst) { - WARN_ONCE(1, "%s: Unknown node\n", __func__); + if (net_ratelimit()) + netdev_err(skb->dev, "%s: Unknown node\n", __func__); return; } if (port->type != node_dst->addr_B_port) From patchwork Fri Feb 28 18:01:56 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Taehee Yoo X-Patchwork-Id: 1246766 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=DBGRoOXj; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 48Tcn951M2z9sQt for ; Sat, 29 Feb 2020 05:02:05 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726752AbgB1SCE (ORCPT ); Fri, 28 Feb 2020 13:02:04 -0500 Received: from mail-pj1-f65.google.com ([209.85.216.65]:54960 "EHLO mail-pj1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725730AbgB1SCE (ORCPT ); Fri, 28 Feb 2020 13:02:04 -0500 Received: by mail-pj1-f65.google.com with SMTP id dw13so1595130pjb.4 for ; Fri, 28 Feb 2020 10:02:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=1wj0tuS0GdkZUdja4ZsgAE8dIYmZ2kpjseZ0Vnnf+pU=; b=DBGRoOXjR6w6D0MHalsgRm0MtTusVkb4GLhAqG7aKzOA+oYAl5M3buHxYC3ntcoaLw grsbJNDn4+JZL5OPODBlO7N6pzJT7dlm0rBpF4r8ldaRlWAyBf5L3bXsmeiNXQKdFPbS i1VsaJTxHGsdJwo1k0MxPwdn3YgxsnalS2eKJe4Do5MCymFIO27w3F+0V2UUNtAbcsP1 7vgBBTXE+ikqd9gSabMkNW4gXXpEMjhiirY0g85rcTGUPv6FaiChjf4cdIgEUggxOB+r +7v989ePTmm3JOX50BKx2SE9BF9S5e+pGVX3VS8WFdFB+hCrfWctvbTzL0cZWvTP6+rw Wi+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=1wj0tuS0GdkZUdja4ZsgAE8dIYmZ2kpjseZ0Vnnf+pU=; b=MSrt+NNFFNpJ170im6Q879jIwvarCDFpk3UmCS0gs99U08OdcjBM4otV1//GZ1DWwg lLjzqMHDpec6HF0Mde8gPjPEpYZl+iwJsJ7w9UiqtwJnvrP4UrXDrajThpZDBQq4teSy in0XU3Kk2Q3cA2eMgnk0u0gxrhST0FEeCBis8FYJK/HlEwnKoNvvHhkrLQNZ1irqTAmp KF+IfdCXszRIyrwed1xnuVIB9uLAEzmFyQLH9mkwlX7BreD73bigFuwqdV6BhUNoDsGI pjM5q07AZXmuzAbyONw3bkOmHrS6wb3vKHj89sKvWzPxE3wBj0u20EolZ9ic5rJvdtoE bkfg== X-Gm-Message-State: APjAAAUo7s5fpIZqu7iMOxvPU84/wUCvBzTDPgLlrPvBmyj1l+//bd5p J7yCVx/lyzWpKr7JHEwLdgA= X-Google-Smtp-Source: APXvYqzVq4iCgJd/Lx1PJ+8VJ8vyc8CKvZqkKAm7ULSEQMoLWy8hD3nK2S199WsLCrUXtW0rz6O59Q== X-Received: by 2002:a17:90a:cc04:: with SMTP id b4mr5780707pju.136.1582912923087; Fri, 28 Feb 2020 10:02:03 -0800 (PST) Received: from localhost.localdomain ([180.70.143.152]) by smtp.gmail.com with ESMTPSA id l13sm3043467pjq.23.2020.02.28.10.02.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 Feb 2020 10:02:01 -0800 (PST) From: Taehee Yoo To: davem@davemloft.net, kuba@kernel.org, netdev@vger.kernel.org Cc: ap420073@gmail.com Subject: [PATCH net-next 4/5] hsr: remove unnecessary rcu_read_lock() in hsr module Date: Fri, 28 Feb 2020 18:01:56 +0000 Message-Id: <20200228180156.27841-1-ap420073@gmail.com> X-Mailer: git-send-email 2.17.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org In order to access the port list, the hsr_port_get_hsr() is used. And this is protected by RTNL and RCU. The hsr_fill_info(), hsr_check_carrier(), hsr_dev_open() and hsr_get_max_mtu() are protected by RTNL. So, rcu_read_lock() in these functions are not necessary. The hsr_handle_frame() also uses rcu_read_lock() but this function is called by packet path. It's already protected by RCU. So, the rcu_read_lock() in hsr_handle_frame() can be removed. Signed-off-by: Taehee Yoo --- net/hsr/hsr_device.c | 23 +++++++---------------- net/hsr/hsr_netlink.c | 27 +++++++++------------------ net/hsr/hsr_slave.c | 3 --- 3 files changed, 16 insertions(+), 37 deletions(-) diff --git a/net/hsr/hsr_device.c b/net/hsr/hsr_device.c index a48f621c2fec..00532d14fc7c 100644 --- a/net/hsr/hsr_device.c +++ b/net/hsr/hsr_device.c @@ -57,24 +57,19 @@ static void hsr_set_operstate(struct hsr_port *master, bool has_carrier) static bool hsr_check_carrier(struct hsr_port *master) { struct hsr_port *port; - bool has_carrier; - has_carrier = false; + ASSERT_RTNL(); - rcu_read_lock(); - hsr_for_each_port(master->hsr, port) + hsr_for_each_port(master->hsr, port) { if (port->type != HSR_PT_MASTER && is_slave_up(port->dev)) { - has_carrier = true; - break; + netif_carrier_on(master->dev); + return true; } - rcu_read_unlock(); + } - if (has_carrier) - netif_carrier_on(master->dev); - else - netif_carrier_off(master->dev); + netif_carrier_off(master->dev); - return has_carrier; + return false; } static void hsr_check_announce(struct net_device *hsr_dev, @@ -118,11 +113,9 @@ int hsr_get_max_mtu(struct hsr_priv *hsr) struct hsr_port *port; mtu_max = ETH_DATA_LEN; - rcu_read_lock(); hsr_for_each_port(hsr, port) if (port->type != HSR_PT_MASTER) mtu_max = min(port->dev->mtu, mtu_max); - rcu_read_unlock(); if (mtu_max < HSR_HLEN) return 0; @@ -157,7 +150,6 @@ static int hsr_dev_open(struct net_device *dev) hsr = netdev_priv(dev); designation = '\0'; - rcu_read_lock(); hsr_for_each_port(hsr, port) { if (port->type == HSR_PT_MASTER) continue; @@ -175,7 +167,6 @@ static int hsr_dev_open(struct net_device *dev) netdev_warn(dev, "Slave %c (%s) is not up; please bring it up to get a fully working HSR network\n", designation, port->dev->name); } - rcu_read_unlock(); if (designation == '\0') netdev_warn(dev, "No slave devices configured\n"); diff --git a/net/hsr/hsr_netlink.c b/net/hsr/hsr_netlink.c index 7ed308a0c035..64d39c1e93a2 100644 --- a/net/hsr/hsr_netlink.c +++ b/net/hsr/hsr_netlink.c @@ -79,29 +79,20 @@ static int hsr_newlink(struct net *src_net, struct net_device *dev, static int hsr_fill_info(struct sk_buff *skb, const struct net_device *dev) { - struct hsr_priv *hsr; + struct hsr_priv *hsr = netdev_priv(dev); struct hsr_port *port; - int res; - - hsr = netdev_priv(dev); - - res = 0; - rcu_read_lock(); port = hsr_port_get_hsr(hsr, HSR_PT_SLAVE_A); - if (port) - res = nla_put_u32(skb, IFLA_HSR_SLAVE1, port->dev->ifindex); - rcu_read_unlock(); - if (res) - goto nla_put_failure; + if (port) { + if (nla_put_u32(skb, IFLA_HSR_SLAVE1, port->dev->ifindex)) + goto nla_put_failure; + } - rcu_read_lock(); port = hsr_port_get_hsr(hsr, HSR_PT_SLAVE_B); - if (port) - res = nla_put_u32(skb, IFLA_HSR_SLAVE2, port->dev->ifindex); - rcu_read_unlock(); - if (res) - goto nla_put_failure; + if (port) { + if (nla_put_u32(skb, IFLA_HSR_SLAVE2, port->dev->ifindex)) + goto nla_put_failure; + } if (nla_put(skb, IFLA_HSR_SUPERVISION_ADDR, ETH_ALEN, hsr->sup_multicast_addr) || diff --git a/net/hsr/hsr_slave.c b/net/hsr/hsr_slave.c index 127ebcc0e28f..07edc7f626fe 100644 --- a/net/hsr/hsr_slave.c +++ b/net/hsr/hsr_slave.c @@ -25,7 +25,6 @@ static rx_handler_result_t hsr_handle_frame(struct sk_buff **pskb) return RX_HANDLER_PASS; } - rcu_read_lock(); /* hsr->node_db, hsr->ports */ port = hsr_port_get_rcu(skb->dev); if (!port) goto finish_pass; @@ -45,11 +44,9 @@ static rx_handler_result_t hsr_handle_frame(struct sk_buff **pskb) hsr_forward_skb(skb, port); finish_consume: - rcu_read_unlock(); /* hsr->node_db, hsr->ports */ return RX_HANDLER_CONSUMED; finish_pass: - rcu_read_unlock(); /* hsr->node_db, hsr->ports */ return RX_HANDLER_PASS; } From patchwork Fri Feb 28 18:02:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Taehee Yoo X-Patchwork-Id: 1246767 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=QjAzlG/U; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 48TcnR4RdDz9sQt for ; Sat, 29 Feb 2020 05:02:19 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726766AbgB1SCS (ORCPT ); Fri, 28 Feb 2020 13:02:18 -0500 Received: from mail-pg1-f195.google.com ([209.85.215.195]:40147 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725730AbgB1SCS (ORCPT ); Fri, 28 Feb 2020 13:02:18 -0500 Received: by mail-pg1-f195.google.com with SMTP id t24so1893315pgj.7 for ; Fri, 28 Feb 2020 10:02:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=dh8cj01nYdUYJjeSSaiv1Lu2wcuphSMfktQi/Z4uiCE=; b=QjAzlG/UeFzn4WgN1RRQbdcjtoTrg69JQTU2JmXEKTVnokpr+zAIbtW7WZL9YkYw+s iSS79ibXstdhd0NdHBNLiW6txQgaMiY4/KWH/H3k1VICknXgYfg1vJOdzhJCAXvyqsI0 87uPPNxgMvllETpHJxV3h7Y77UUWPYYK3VQMxzrGoAl37+2gbTPF99tA9ufflGURc3fV igMo51URoNASWptsjyHkB6IhibmNViy5BNQKretCv7H3JLb+qmKP2ZjdNzKIiBm6egct dRhdEu084tT6626twuKVK4EDxnKl/lL4PUIk11+xwdT5kWZuuzx/ILu4MJZ2jEUfEEQI ra4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=dh8cj01nYdUYJjeSSaiv1Lu2wcuphSMfktQi/Z4uiCE=; b=Hj1M4xSFObZ12tJh+ASbk+baflt8xOMQx0VEHcPrclAYQ0FNEUHopn58jqRiicCl26 dWk8nGdQ+xYNEtxlJuZsGgwzITDOdWlqyHCVzB2QRl/b1OPDXaaR0hdJEwPoYtL0veNJ MJm1ShrZZ7pRmnWRwqtaEY7hKgQFtKhcqlBu4kgoME+mZU5yteFXV4w1/gtBj1AKyzGQ 5Y4p4UdMiguReEidOBvIsirKR/nXJdF5au36GakDyc2yHut7ReUPanth16nZHDE5lthf uBL3ehHGNgq/gs7O9A4WvwHrXLSfhwpHAljhfpIrnF2tQb0f07uGOdVZjqSDSP8/h3Ao J7ig== X-Gm-Message-State: APjAAAVyp6wWRfhQlBT+MtGN+UtXSBPiE0se/ieChH/sBFFw8eemoUYX AKf4jQMeRYJJl0X3TO4eFd7Mvhzu8Ls= X-Google-Smtp-Source: APXvYqy0qS3eCH4nmDW5cX+P629sHzyqmX/y+5cuH7Xh5VOZWlS5sgf86zGgwXDbI8YN1+mGfzbHGw== X-Received: by 2002:a63:c30e:: with SMTP id c14mr6065559pgd.168.1582912937004; Fri, 28 Feb 2020 10:02:17 -0800 (PST) Received: from localhost.localdomain ([180.70.143.152]) by smtp.gmail.com with ESMTPSA id e4sm3159457pfj.22.2020.02.28.10.02.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 Feb 2020 10:02:16 -0800 (PST) From: Taehee Yoo To: davem@davemloft.net, kuba@kernel.org, netdev@vger.kernel.org Cc: ap420073@gmail.com Subject: [PATCH net-next 5/5] hsr: use upper/lower device infrastructure Date: Fri, 28 Feb 2020 18:02:10 +0000 Message-Id: <20200228180210.27920-1-ap420073@gmail.com> X-Mailer: git-send-email 2.17.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org netdev_upper_dev_link() is useful to manage lower/upper interfaces. And this function internally validates looping, maximum depth. All or most virtual interfaces that could have a real interface (e.g. macsec, macvlan, ipvlan etc.) use lower/upper infrastructure. Signed-off-by: Taehee Yoo --- net/hsr/hsr_device.c | 32 ++++++++++++++++++++------------ net/hsr/hsr_main.c | 3 ++- net/hsr/hsr_slave.c | 35 ++++++++++++++++++----------------- 3 files changed, 40 insertions(+), 30 deletions(-) diff --git a/net/hsr/hsr_device.c b/net/hsr/hsr_device.c index 00532d14fc7c..fc7027314ad8 100644 --- a/net/hsr/hsr_device.c +++ b/net/hsr/hsr_device.c @@ -341,22 +341,33 @@ static void hsr_announce(struct timer_list *t) rcu_read_unlock(); } +static void hsr_del_ports(struct hsr_priv *hsr) +{ + struct hsr_port *port; + + port = hsr_port_get_hsr(hsr, HSR_PT_SLAVE_A); + if (port) + hsr_del_port(port); + + port = hsr_port_get_hsr(hsr, HSR_PT_SLAVE_B); + if (port) + hsr_del_port(port); + + port = hsr_port_get_hsr(hsr, HSR_PT_MASTER); + if (port) + hsr_del_port(port); +} + /* This has to be called after all the readers are gone. * Otherwise we would have to check the return value of * hsr_port_get_hsr(). */ static void hsr_dev_destroy(struct net_device *hsr_dev) { - struct hsr_priv *hsr; - struct hsr_port *port; - struct hsr_port *tmp; - - hsr = netdev_priv(hsr_dev); + struct hsr_priv *hsr = netdev_priv(hsr_dev); hsr_debugfs_term(hsr); - - list_for_each_entry_safe(port, tmp, &hsr->ports, port_list) - hsr_del_port(port); + hsr_del_ports(hsr); del_timer_sync(&hsr->prune_timer); del_timer_sync(&hsr->announce_timer); @@ -426,8 +437,6 @@ int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2], struct netlink_ext_ack *extack) { struct hsr_priv *hsr; - struct hsr_port *port; - struct hsr_port *tmp; int res; hsr = netdev_priv(hsr_dev); @@ -494,8 +503,7 @@ int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2], err_add_slaves: unregister_netdevice(hsr_dev); err_unregister: - list_for_each_entry_safe(port, tmp, &hsr->ports, port_list) - hsr_del_port(port); + hsr_del_ports(hsr); err_add_master: hsr_del_self_node(hsr); diff --git a/net/hsr/hsr_main.c b/net/hsr/hsr_main.c index 9e389accbfc7..26d6c39f24e1 100644 --- a/net/hsr/hsr_main.c +++ b/net/hsr/hsr_main.c @@ -85,7 +85,8 @@ static int hsr_netdev_notify(struct notifier_block *nb, unsigned long event, master->dev->mtu = mtu_max; break; case NETDEV_UNREGISTER: - hsr_del_port(port); + if (!is_hsr_master(dev)) + hsr_del_port(port); break; case NETDEV_PRE_TYPE_CHANGE: /* HSR works only on Ethernet devices. Refuse slave to change diff --git a/net/hsr/hsr_slave.c b/net/hsr/hsr_slave.c index 07edc7f626fe..123605cb5420 100644 --- a/net/hsr/hsr_slave.c +++ b/net/hsr/hsr_slave.c @@ -97,19 +97,25 @@ static int hsr_check_dev_ok(struct net_device *dev, } /* Setup device to be added to the HSR bridge. */ -static int hsr_portdev_setup(struct net_device *dev, struct hsr_port *port) +static int hsr_portdev_setup(struct hsr_priv *hsr, struct net_device *dev, + struct hsr_port *port, + struct netlink_ext_ack *extack) + { + struct net_device *hsr_dev; + struct hsr_port *master; int res; - dev_hold(dev); res = dev_set_promiscuity(dev, 1); if (res) goto fail_promiscuity; - /* FIXME: - * What does net device "adjacency" mean? Should we do - * res = netdev_master_upper_dev_link(port->dev, port->hsr->dev); ? - */ + master = hsr_port_get_hsr(hsr, HSR_PT_MASTER); + hsr_dev = master->dev; + + res = netdev_upper_dev_link(dev, hsr_dev, extack); + if (res) + goto fail_upper_dev_link; res = netdev_rx_handler_register(dev, hsr_handle_frame, port); if (res) @@ -119,6 +125,8 @@ static int hsr_portdev_setup(struct net_device *dev, struct hsr_port *port) return 0; fail_rx_handler: + netdev_upper_dev_unlink(dev, hsr_dev); +fail_upper_dev_link: dev_set_promiscuity(dev, -1); fail_promiscuity: dev_put(dev); @@ -147,7 +155,7 @@ int hsr_add_port(struct hsr_priv *hsr, struct net_device *dev, return -ENOMEM; if (type != HSR_PT_MASTER) { - res = hsr_portdev_setup(dev, port); + res = hsr_portdev_setup(hsr, dev, port, extack); if (res) goto fail_dev_setup; } @@ -180,21 +188,14 @@ void hsr_del_port(struct hsr_port *port) list_del_rcu(&port->port_list); if (port != master) { - if (master) { - netdev_update_features(master->dev); - dev_set_mtu(master->dev, hsr_get_max_mtu(hsr)); - } + netdev_update_features(master->dev); + dev_set_mtu(master->dev, hsr_get_max_mtu(hsr)); netdev_rx_handler_unregister(port->dev); dev_set_promiscuity(port->dev, -1); + netdev_upper_dev_unlink(port->dev, master->dev); } - /* FIXME? - * netdev_upper_dev_unlink(port->dev, port->hsr->dev); - */ - synchronize_rcu(); - if (port != master) - dev_put(port->dev); kfree(port); }