From: Greg Kroah-Hartman Date: Wed, 7 Jun 2023 19:41:13 +0000 (+0200) Subject: drop a bunch of networking devlink patches as they are too much X-Git-Tag: v4.14.317~9 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1d60f881ab9176d203b070cfb280a709cb0ee796;p=thirdparty%2Fkernel%2Fstable-queue.git drop a bunch of networking devlink patches as they are too much Too many unfixed later patches do not apply. --- diff --git a/queue-6.1/net-add-gso_ipv4_max_size-and-gro_ipv4_max_size-per-.patch b/queue-6.1/net-add-gso_ipv4_max_size-and-gro_ipv4_max_size-per-.patch deleted file mode 100644 index 29145880886..00000000000 --- a/queue-6.1/net-add-gso_ipv4_max_size-and-gro_ipv4_max_size-per-.patch +++ /dev/null @@ -1,218 +0,0 @@ -From 1b6476dd699424b28a16a280bb327df8cdc65580 Mon Sep 17 00:00:00 2001 -From: Sasha Levin -Date: Sat, 28 Jan 2023 10:58:38 -0500 -Subject: net: add gso_ipv4_max_size and gro_ipv4_max_size per device - -From: Xin Long - -[ Upstream commit 9eefedd58ae1daece2ba907849a44db2941fb4b0 ] - -This patch introduces gso_ipv4_max_size and gro_ipv4_max_size -per device and adds netlink attributes for them, so that IPV4 -BIG TCP can be guarded by a separate tunable in the next patch. - -To not break the old application using "gso/gro_max_size" for -IPv4 GSO packets, this patch updates "gso/gro_ipv4_max_size" -in netif_set_gso/gro_max_size() if the new size isn't greater -than GSO_LEGACY_MAX_SIZE, so that nothing will change even if -userspace doesn't realize the new netlink attributes. - -Signed-off-by: Xin Long -Reviewed-by: David Ahern -Reviewed-by: Eric Dumazet -Signed-off-by: Jakub Kicinski -Stable-dep-of: fef5b228dd38 ("rtnetlink: move IFLA_GSO_ tb check to validate_linkmsg") -Signed-off-by: Sasha Levin ---- - include/linux/netdevice.h | 6 ++++++ - include/uapi/linux/if_link.h | 3 +++ - net/core/dev.c | 4 ++++ - net/core/dev.h | 18 ++++++++++++++++++ - net/core/rtnetlink.c | 33 +++++++++++++++++++++++++++++++++ - 5 files changed, 64 insertions(+) - -diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h -index 1f8e1cff035da..6d6ae5b1b681d 100644 ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -1960,6 +1960,8 @@ enum netdev_ml_priv_type { - * @gso_max_segs: Maximum number of segments that can be passed to the - * NIC for GSO - * @tso_max_segs: Device (as in HW) limit on the max TSO segment count -+ * @gso_ipv4_max_size: Maximum size of generic segmentation offload, -+ * for IPv4. - * - * @dcbnl_ops: Data Center Bridging netlink ops - * @num_tc: Number of traffic classes in the net device -@@ -2000,6 +2002,8 @@ enum netdev_ml_priv_type { - * keep a list of interfaces to be deleted. - * @gro_max_size: Maximum size of aggregated packet in generic - * receive offload (GRO) -+ * @gro_ipv4_max_size: Maximum size of aggregated packet in generic -+ * receive offload (GRO), for IPv4. - * - * @dev_addr_shadow: Copy of @dev_addr to catch direct writes. - * @linkwatch_dev_tracker: refcount tracker used by linkwatch. -@@ -2202,6 +2206,7 @@ struct net_device { - */ - #define GRO_MAX_SIZE (8 * 65535u) - unsigned int gro_max_size; -+ unsigned int gro_ipv4_max_size; - rx_handler_func_t __rcu *rx_handler; - void __rcu *rx_handler_data; - -@@ -2325,6 +2330,7 @@ struct net_device { - u16 gso_max_segs; - #define TSO_MAX_SEGS U16_MAX - u16 tso_max_segs; -+ unsigned int gso_ipv4_max_size; - - #ifdef CONFIG_DCB - const struct dcbnl_rtnl_ops *dcbnl_ops; -diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h -index 9af9da1db4e84..134b86568087c 100644 ---- a/include/uapi/linux/if_link.h -+++ b/include/uapi/linux/if_link.h -@@ -374,6 +374,9 @@ enum { - - IFLA_DEVLINK_PORT, - -+ IFLA_GSO_IPV4_MAX_SIZE, -+ IFLA_GRO_IPV4_MAX_SIZE, -+ - __IFLA_MAX - }; - -diff --git a/net/core/dev.c b/net/core/dev.c -index ba9a0c1a4c505..a633a9bf9329f 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -3010,6 +3010,8 @@ void netif_set_tso_max_size(struct net_device *dev, unsigned int size) - dev->tso_max_size = min(GSO_MAX_SIZE, size); - if (size < READ_ONCE(dev->gso_max_size)) - netif_set_gso_max_size(dev, size); -+ if (size < READ_ONCE(dev->gso_ipv4_max_size)) -+ netif_set_gso_ipv4_max_size(dev, size); - } - EXPORT_SYMBOL(netif_set_tso_max_size); - -@@ -10612,6 +10614,8 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name, - dev->gso_max_size = GSO_LEGACY_MAX_SIZE; - dev->gso_max_segs = GSO_MAX_SEGS; - dev->gro_max_size = GRO_LEGACY_MAX_SIZE; -+ dev->gso_ipv4_max_size = GSO_LEGACY_MAX_SIZE; -+ dev->gro_ipv4_max_size = GRO_LEGACY_MAX_SIZE; - dev->tso_max_size = TSO_LEGACY_MAX_SIZE; - dev->tso_max_segs = TSO_MAX_SEGS; - dev->upper_level = 1; -diff --git a/net/core/dev.h b/net/core/dev.h -index cbb8a925175a2..bd6584fcaf524 100644 ---- a/net/core/dev.h -+++ b/net/core/dev.h -@@ -93,6 +93,8 @@ static inline void netif_set_gso_max_size(struct net_device *dev, - { - /* dev->gso_max_size is read locklessly from sk_setup_caps() */ - WRITE_ONCE(dev->gso_max_size, size); -+ if (size <= GSO_LEGACY_MAX_SIZE) -+ WRITE_ONCE(dev->gso_ipv4_max_size, size); - } - - static inline void netif_set_gso_max_segs(struct net_device *dev, -@@ -107,6 +109,22 @@ static inline void netif_set_gro_max_size(struct net_device *dev, - { - /* This pairs with the READ_ONCE() in skb_gro_receive() */ - WRITE_ONCE(dev->gro_max_size, size); -+ if (size <= GRO_LEGACY_MAX_SIZE) -+ WRITE_ONCE(dev->gro_ipv4_max_size, size); -+} -+ -+static inline void netif_set_gso_ipv4_max_size(struct net_device *dev, -+ unsigned int size) -+{ -+ /* dev->gso_ipv4_max_size is read locklessly from sk_setup_caps() */ -+ WRITE_ONCE(dev->gso_ipv4_max_size, size); -+} -+ -+static inline void netif_set_gro_ipv4_max_size(struct net_device *dev, -+ unsigned int size) -+{ -+ /* This pairs with the READ_ONCE() in skb_gro_receive() */ -+ WRITE_ONCE(dev->gro_ipv4_max_size, size); - } - - #endif -diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c -index d3727d9151c2a..027275235858b 100644 ---- a/net/core/rtnetlink.c -+++ b/net/core/rtnetlink.c -@@ -1074,6 +1074,8 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev, - + nla_total_size(4) /* IFLA_GSO_MAX_SEGS */ - + nla_total_size(4) /* IFLA_GSO_MAX_SIZE */ - + nla_total_size(4) /* IFLA_GRO_MAX_SIZE */ -+ + nla_total_size(4) /* IFLA_GSO_IPV4_MAX_SIZE */ -+ + nla_total_size(4) /* IFLA_GRO_IPV4_MAX_SIZE */ - + nla_total_size(4) /* IFLA_TSO_MAX_SIZE */ - + nla_total_size(4) /* IFLA_TSO_MAX_SEGS */ - + nla_total_size(1) /* IFLA_OPERSTATE */ -@@ -1807,6 +1809,8 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, - nla_put_u32(skb, IFLA_GSO_MAX_SEGS, dev->gso_max_segs) || - nla_put_u32(skb, IFLA_GSO_MAX_SIZE, dev->gso_max_size) || - nla_put_u32(skb, IFLA_GRO_MAX_SIZE, dev->gro_max_size) || -+ nla_put_u32(skb, IFLA_GSO_IPV4_MAX_SIZE, dev->gso_ipv4_max_size) || -+ nla_put_u32(skb, IFLA_GRO_IPV4_MAX_SIZE, dev->gro_ipv4_max_size) || - nla_put_u32(skb, IFLA_TSO_MAX_SIZE, dev->tso_max_size) || - nla_put_u32(skb, IFLA_TSO_MAX_SEGS, dev->tso_max_segs) || - #ifdef CONFIG_RPS -@@ -1968,6 +1972,8 @@ static const struct nla_policy ifla_policy[IFLA_MAX+1] = { - [IFLA_TSO_MAX_SIZE] = { .type = NLA_REJECT }, - [IFLA_TSO_MAX_SEGS] = { .type = NLA_REJECT }, - [IFLA_ALLMULTI] = { .type = NLA_REJECT }, -+ [IFLA_GSO_IPV4_MAX_SIZE] = { .type = NLA_U32 }, -+ [IFLA_GRO_IPV4_MAX_SIZE] = { .type = NLA_U32 }, - }; - - static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = { -@@ -2883,6 +2889,29 @@ static int do_setlink(const struct sk_buff *skb, - } - } - -+ if (tb[IFLA_GSO_IPV4_MAX_SIZE]) { -+ u32 max_size = nla_get_u32(tb[IFLA_GSO_IPV4_MAX_SIZE]); -+ -+ if (max_size > dev->tso_max_size) { -+ err = -EINVAL; -+ goto errout; -+ } -+ -+ if (dev->gso_ipv4_max_size ^ max_size) { -+ netif_set_gso_ipv4_max_size(dev, max_size); -+ status |= DO_SETLINK_MODIFIED; -+ } -+ } -+ -+ if (tb[IFLA_GRO_IPV4_MAX_SIZE]) { -+ u32 gro_max_size = nla_get_u32(tb[IFLA_GRO_IPV4_MAX_SIZE]); -+ -+ if (dev->gro_ipv4_max_size ^ gro_max_size) { -+ netif_set_gro_ipv4_max_size(dev, gro_max_size); -+ status |= DO_SETLINK_MODIFIED; -+ } -+ } -+ - if (tb[IFLA_OPERSTATE]) - set_operstate(dev, nla_get_u8(tb[IFLA_OPERSTATE])); - -@@ -3329,6 +3358,10 @@ struct net_device *rtnl_create_link(struct net *net, const char *ifname, - netif_set_gso_max_segs(dev, nla_get_u32(tb[IFLA_GSO_MAX_SEGS])); - if (tb[IFLA_GRO_MAX_SIZE]) - netif_set_gro_max_size(dev, nla_get_u32(tb[IFLA_GRO_MAX_SIZE])); -+ if (tb[IFLA_GSO_IPV4_MAX_SIZE]) -+ netif_set_gso_ipv4_max_size(dev, nla_get_u32(tb[IFLA_GSO_IPV4_MAX_SIZE])); -+ if (tb[IFLA_GRO_IPV4_MAX_SIZE]) -+ netif_set_gro_ipv4_max_size(dev, nla_get_u32(tb[IFLA_GRO_IPV4_MAX_SIZE])); - - return dev; - } --- -2.39.2 - diff --git a/queue-6.1/net-devlink-convert-devlink-port-type-specific-point.patch b/queue-6.1/net-devlink-convert-devlink-port-type-specific-point.patch deleted file mode 100644 index 33bf358e8de..00000000000 --- a/queue-6.1/net-devlink-convert-devlink-port-type-specific-point.patch +++ /dev/null @@ -1,100 +0,0 @@ -From a3f6c7f0c515b5aedcd5e76921eb427033780600 Mon Sep 17 00:00:00 2001 -From: Sasha Levin -Date: Wed, 2 Nov 2022 17:01:59 +0100 -Subject: net: devlink: convert devlink port type-specific pointers to union - -From: Jiri Pirko - -[ Upstream commit 3830c5719af66fac9849cf5fb04b03d4e4bb46ff ] - -Instead of storing type_dev as a void pointer, convert it to union and -use it to store either struct net_device or struct ib_device pointer. - -Signed-off-by: Jiri Pirko -Signed-off-by: Jakub Kicinski -Stable-dep-of: fef5b228dd38 ("rtnetlink: move IFLA_GSO_ tb check to validate_linkmsg") -Signed-off-by: Sasha Levin ---- - include/net/devlink.h | 13 ++++++++++--- - net/core/devlink.c | 17 +++++++++++++---- - 2 files changed, 23 insertions(+), 7 deletions(-) - -diff --git a/include/net/devlink.h b/include/net/devlink.h -index ba6b8b0949432..6c55aabaedf19 100644 ---- a/include/net/devlink.h -+++ b/include/net/devlink.h -@@ -121,12 +121,19 @@ struct devlink_port { - struct list_head region_list; - struct devlink *devlink; - unsigned int index; -- spinlock_t type_lock; /* Protects type and type_dev -- * pointer consistency. -+ spinlock_t type_lock; /* Protects type and type_eth/ib -+ * structures consistency. - */ - enum devlink_port_type type; - enum devlink_port_type desired_type; -- void *type_dev; -+ union { -+ struct { -+ struct net_device *netdev; -+ } type_eth; -+ struct { -+ struct ib_device *ibdev; -+ } type_ib; -+ }; - struct devlink_port_attrs attrs; - u8 attrs_set:1, - switch_port:1, -diff --git a/net/core/devlink.c b/net/core/devlink.c -index 2aa77d4b80d0a..4f95987e02234 100644 ---- a/net/core/devlink.c -+++ b/net/core/devlink.c -@@ -1303,7 +1303,7 @@ static int devlink_nl_port_fill(struct sk_buff *msg, - goto nla_put_failure_type_locked; - if (devlink_port->type == DEVLINK_PORT_TYPE_ETH) { - struct net *net = devlink_net(devlink_port->devlink); -- struct net_device *netdev = devlink_port->type_dev; -+ struct net_device *netdev = devlink_port->type_eth.netdev; - - if (netdev && net_eq(net, dev_net(netdev)) && - (nla_put_u32(msg, DEVLINK_ATTR_PORT_NETDEV_IFINDEX, -@@ -1313,7 +1313,7 @@ static int devlink_nl_port_fill(struct sk_buff *msg, - goto nla_put_failure_type_locked; - } - if (devlink_port->type == DEVLINK_PORT_TYPE_IB) { -- struct ib_device *ibdev = devlink_port->type_dev; -+ struct ib_device *ibdev = devlink_port->type_ib.ibdev; - - if (ibdev && - nla_put_string(msg, DEVLINK_ATTR_PORT_IBDEV_NAME, -@@ -10006,7 +10006,16 @@ static void __devlink_port_type_set(struct devlink_port *devlink_port, - devlink_port_type_warn_cancel(devlink_port); - spin_lock_bh(&devlink_port->type_lock); - devlink_port->type = type; -- devlink_port->type_dev = type_dev; -+ switch (type) { -+ case DEVLINK_PORT_TYPE_ETH: -+ devlink_port->type_eth.netdev = type_dev; -+ break; -+ case DEVLINK_PORT_TYPE_IB: -+ devlink_port->type_ib.ibdev = type_dev; -+ break; -+ default: -+ break; -+ } - spin_unlock_bh(&devlink_port->type_lock); - devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW); - } -@@ -12021,7 +12030,7 @@ devlink_trap_report_metadata_set(struct devlink_trap_metadata *metadata, - - spin_lock(&in_devlink_port->type_lock); - if (in_devlink_port->type == DEVLINK_PORT_TYPE_ETH) -- metadata->input_dev = in_devlink_port->type_dev; -+ metadata->input_dev = in_devlink_port->type_eth.netdev; - spin_unlock(&in_devlink_port->type_lock); - } - --- -2.39.2 - diff --git a/queue-6.1/net-devlink-move-port_type_netdev_checks-call-to-__d.patch b/queue-6.1/net-devlink-move-port_type_netdev_checks-call-to-__d.patch deleted file mode 100644 index 04f17e39422..00000000000 --- a/queue-6.1/net-devlink-move-port_type_netdev_checks-call-to-__d.patch +++ /dev/null @@ -1,113 +0,0 @@ -From 6c123dd21384cb6ba0ea718cdc92231237ad2624 Mon Sep 17 00:00:00 2001 -From: Sasha Levin -Date: Wed, 2 Nov 2022 17:02:01 +0100 -Subject: net: devlink: move port_type_netdev_checks() call to - __devlink_port_type_set() - -From: Jiri Pirko - -[ Upstream commit 45791e0d00c445936bb19535fe847083b1edd26d ] - -As __devlink_port_type_set() is going to be called directly from netdevice -notifier event handle in one of the follow-up patches, move the -port_type_netdev_checks() call there. - -Signed-off-by: Jiri Pirko -Signed-off-by: Jakub Kicinski -Stable-dep-of: fef5b228dd38 ("rtnetlink: move IFLA_GSO_ tb check to validate_linkmsg") -Signed-off-by: Sasha Levin ---- - net/core/devlink.c | 63 ++++++++++++++++++++++++---------------------- - 1 file changed, 33 insertions(+), 30 deletions(-) - -diff --git a/net/core/devlink.c b/net/core/devlink.c -index 8a8d838c53cfa..7d7fc61a62553 100644 ---- a/net/core/devlink.c -+++ b/net/core/devlink.c -@@ -9997,33 +9997,6 @@ void devlink_port_unregister(struct devlink_port *devlink_port) - } - EXPORT_SYMBOL_GPL(devlink_port_unregister); - --static void __devlink_port_type_set(struct devlink_port *devlink_port, -- enum devlink_port_type type, -- void *type_dev) --{ -- ASSERT_DEVLINK_PORT_REGISTERED(devlink_port); -- -- if (type == DEVLINK_PORT_TYPE_NOTSET) -- devlink_port_type_warn_schedule(devlink_port); -- else -- devlink_port_type_warn_cancel(devlink_port); -- -- spin_lock_bh(&devlink_port->type_lock); -- devlink_port->type = type; -- switch (type) { -- case DEVLINK_PORT_TYPE_ETH: -- devlink_port->type_eth.netdev = type_dev; -- break; -- case DEVLINK_PORT_TYPE_IB: -- devlink_port->type_ib.ibdev = type_dev; -- break; -- default: -- break; -- } -- spin_unlock_bh(&devlink_port->type_lock); -- devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW); --} -- - static void devlink_port_type_netdev_checks(struct devlink_port *devlink_port, - struct net_device *netdev) - { -@@ -10061,6 +10034,38 @@ static void devlink_port_type_netdev_checks(struct devlink_port *devlink_port, - } - } - -+static void __devlink_port_type_set(struct devlink_port *devlink_port, -+ enum devlink_port_type type, -+ void *type_dev) -+{ -+ struct net_device *netdev = type_dev; -+ -+ ASSERT_DEVLINK_PORT_REGISTERED(devlink_port); -+ -+ if (type == DEVLINK_PORT_TYPE_NOTSET) { -+ devlink_port_type_warn_schedule(devlink_port); -+ } else { -+ devlink_port_type_warn_cancel(devlink_port); -+ if (type == DEVLINK_PORT_TYPE_ETH && netdev) -+ devlink_port_type_netdev_checks(devlink_port, netdev); -+ } -+ -+ spin_lock_bh(&devlink_port->type_lock); -+ devlink_port->type = type; -+ switch (type) { -+ case DEVLINK_PORT_TYPE_ETH: -+ devlink_port->type_eth.netdev = netdev; -+ break; -+ case DEVLINK_PORT_TYPE_IB: -+ devlink_port->type_ib.ibdev = type_dev; -+ break; -+ default: -+ break; -+ } -+ spin_unlock_bh(&devlink_port->type_lock); -+ devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW); -+} -+ - /** - * devlink_port_type_eth_set - Set port type to Ethernet - * -@@ -10070,9 +10075,7 @@ static void devlink_port_type_netdev_checks(struct devlink_port *devlink_port, - void devlink_port_type_eth_set(struct devlink_port *devlink_port, - struct net_device *netdev) - { -- if (netdev) -- devlink_port_type_netdev_checks(devlink_port, netdev); -- else -+ if (!netdev) - dev_warn(devlink_port->devlink->dev, - "devlink port type for port %d set to Ethernet without a software interface reference, device type not supported by the kernel?\n", - devlink_port->index); --- -2.39.2 - diff --git a/queue-6.1/net-devlink-move-port_type_warn_schedule-call-to-__d.patch b/queue-6.1/net-devlink-move-port_type_warn_schedule-call-to-__d.patch deleted file mode 100644 index 3c016011c27..00000000000 --- a/queue-6.1/net-devlink-move-port_type_warn_schedule-call-to-__d.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 30acfeed998f4bfd42d905c2d63c335a6c098697 Mon Sep 17 00:00:00 2001 -From: Sasha Levin -Date: Wed, 2 Nov 2022 17:02:00 +0100 -Subject: net: devlink: move port_type_warn_schedule() call to - __devlink_port_type_set() - -From: Jiri Pirko - -[ Upstream commit 8573a04404ddacb2d966eef09bf38b2ad6dbe86f ] - -As __devlink_port_type_set() is going to be called directly from netdevice -notifier event handle in one of the follow-up patches, move the -port_type_warn_schedule() call there. - -Signed-off-by: Jiri Pirko -Signed-off-by: Jakub Kicinski -Stable-dep-of: fef5b228dd38 ("rtnetlink: move IFLA_GSO_ tb check to validate_linkmsg") -Signed-off-by: Sasha Levin ---- - net/core/devlink.c | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - -diff --git a/net/core/devlink.c b/net/core/devlink.c -index 4f95987e02234..8a8d838c53cfa 100644 ---- a/net/core/devlink.c -+++ b/net/core/devlink.c -@@ -10003,7 +10003,11 @@ static void __devlink_port_type_set(struct devlink_port *devlink_port, - { - ASSERT_DEVLINK_PORT_REGISTERED(devlink_port); - -- devlink_port_type_warn_cancel(devlink_port); -+ if (type == DEVLINK_PORT_TYPE_NOTSET) -+ devlink_port_type_warn_schedule(devlink_port); -+ else -+ devlink_port_type_warn_cancel(devlink_port); -+ - spin_lock_bh(&devlink_port->type_lock); - devlink_port->type = type; - switch (type) { -@@ -10098,7 +10102,6 @@ EXPORT_SYMBOL_GPL(devlink_port_type_ib_set); - void devlink_port_type_clear(struct devlink_port *devlink_port) - { - __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_NOTSET, NULL); -- devlink_port_type_warn_schedule(devlink_port); - } - EXPORT_SYMBOL_GPL(devlink_port_type_clear); - --- -2.39.2 - diff --git a/queue-6.1/net-devlink-take-rtnl-in-port_fill-function-only-if-.patch b/queue-6.1/net-devlink-take-rtnl-in-port_fill-function-only-if-.patch deleted file mode 100644 index 81b91fb47ff..00000000000 --- a/queue-6.1/net-devlink-take-rtnl-in-port_fill-function-only-if-.patch +++ /dev/null @@ -1,181 +0,0 @@ -From 68d81614aec1851d3e794c9cc8a5ad703d0234ad Mon Sep 17 00:00:00 2001 -From: Sasha Levin -Date: Wed, 2 Nov 2022 17:02:02 +0100 -Subject: net: devlink: take RTNL in port_fill() function only if it is not - held - -From: Jiri Pirko - -[ Upstream commit d41c9dbd12745cfc1cb2946cd99016d83c2c5364 ] - -Follow-up patch is going to introduce a netdevice notifier event -processing which is called with RTNL mutex held. Processing of this will -eventually lead to call to port_notity() and port_fill() which currently -takes RTNL mutex internally. So as a temporary solution, propagate a -bool indicating if the mutex is already held. This will go away in one -of the follow-up patches. - -Signed-off-by: Jiri Pirko -Signed-off-by: Jakub Kicinski -Stable-dep-of: fef5b228dd38 ("rtnetlink: move IFLA_GSO_ tb check to validate_linkmsg") -Signed-off-by: Sasha Levin ---- - net/core/devlink.c | 46 +++++++++++++++++++++++++++++++--------------- - 1 file changed, 31 insertions(+), 15 deletions(-) - -diff --git a/net/core/devlink.c b/net/core/devlink.c -index 7d7fc61a62553..79cfba316438c 100644 ---- a/net/core/devlink.c -+++ b/net/core/devlink.c -@@ -1278,7 +1278,8 @@ devlink_nl_port_function_attrs_put(struct sk_buff *msg, struct devlink_port *por - static int devlink_nl_port_fill(struct sk_buff *msg, - struct devlink_port *devlink_port, - enum devlink_command cmd, u32 portid, u32 seq, -- int flags, struct netlink_ext_ack *extack) -+ int flags, struct netlink_ext_ack *extack, -+ bool rtnl_held) - { - struct devlink *devlink = devlink_port->devlink; - void *hdr; -@@ -1293,7 +1294,8 @@ static int devlink_nl_port_fill(struct sk_buff *msg, - goto nla_put_failure; - - /* Hold rtnl lock while accessing port's netdev attributes. */ -- rtnl_lock(); -+ if (!rtnl_held) -+ rtnl_lock(); - spin_lock_bh(&devlink_port->type_lock); - if (nla_put_u16(msg, DEVLINK_ATTR_PORT_TYPE, devlink_port->type)) - goto nla_put_failure_type_locked; -@@ -1321,7 +1323,8 @@ static int devlink_nl_port_fill(struct sk_buff *msg, - goto nla_put_failure_type_locked; - } - spin_unlock_bh(&devlink_port->type_lock); -- rtnl_unlock(); -+ if (!rtnl_held) -+ rtnl_unlock(); - if (devlink_nl_port_attrs_put(msg, devlink_port)) - goto nla_put_failure; - if (devlink_nl_port_function_attrs_put(msg, devlink_port, extack)) -@@ -1336,14 +1339,15 @@ static int devlink_nl_port_fill(struct sk_buff *msg, - - nla_put_failure_type_locked: - spin_unlock_bh(&devlink_port->type_lock); -- rtnl_unlock(); -+ if (!rtnl_held) -+ rtnl_unlock(); - nla_put_failure: - genlmsg_cancel(msg, hdr); - return -EMSGSIZE; - } - --static void devlink_port_notify(struct devlink_port *devlink_port, -- enum devlink_command cmd) -+static void __devlink_port_notify(struct devlink_port *devlink_port, -+ enum devlink_command cmd, bool rtnl_held) - { - struct devlink *devlink = devlink_port->devlink; - struct sk_buff *msg; -@@ -1358,7 +1362,8 @@ static void devlink_port_notify(struct devlink_port *devlink_port, - if (!msg) - return; - -- err = devlink_nl_port_fill(msg, devlink_port, cmd, 0, 0, 0, NULL); -+ err = devlink_nl_port_fill(msg, devlink_port, cmd, 0, 0, 0, NULL, -+ rtnl_held); - if (err) { - nlmsg_free(msg); - return; -@@ -1368,6 +1373,12 @@ static void devlink_port_notify(struct devlink_port *devlink_port, - 0, DEVLINK_MCGRP_CONFIG, GFP_KERNEL); - } - -+static void devlink_port_notify(struct devlink_port *devlink_port, -+ enum devlink_command cmd) -+{ -+ __devlink_port_notify(devlink_port, cmd, false); -+} -+ - static void devlink_rate_notify(struct devlink_rate *devlink_rate, - enum devlink_command cmd) - { -@@ -1534,7 +1545,7 @@ static int devlink_nl_cmd_port_get_doit(struct sk_buff *skb, - - err = devlink_nl_port_fill(msg, devlink_port, DEVLINK_CMD_PORT_NEW, - info->snd_portid, info->snd_seq, 0, -- info->extack); -+ info->extack, false); - if (err) { - nlmsg_free(msg); - return err; -@@ -1564,7 +1575,8 @@ static int devlink_nl_cmd_port_get_dumpit(struct sk_buff *msg, - DEVLINK_CMD_NEW, - NETLINK_CB(cb->skb).portid, - cb->nlh->nlmsg_seq, -- NLM_F_MULTI, cb->extack); -+ NLM_F_MULTI, cb->extack, -+ false); - if (err) { - devl_unlock(devlink); - devlink_put(devlink); -@@ -1776,7 +1788,8 @@ static int devlink_port_new_notify(struct devlink *devlink, - } - - err = devlink_nl_port_fill(msg, devlink_port, DEVLINK_CMD_NEW, -- info->snd_portid, info->snd_seq, 0, NULL); -+ info->snd_portid, info->snd_seq, 0, NULL, -+ false); - if (err) - goto out; - -@@ -10036,7 +10049,7 @@ static void devlink_port_type_netdev_checks(struct devlink_port *devlink_port, - - static void __devlink_port_type_set(struct devlink_port *devlink_port, - enum devlink_port_type type, -- void *type_dev) -+ void *type_dev, bool rtnl_held) - { - struct net_device *netdev = type_dev; - -@@ -10063,7 +10076,7 @@ static void __devlink_port_type_set(struct devlink_port *devlink_port, - break; - } - spin_unlock_bh(&devlink_port->type_lock); -- devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW); -+ __devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW, rtnl_held); - } - - /** -@@ -10080,7 +10093,8 @@ void devlink_port_type_eth_set(struct devlink_port *devlink_port, - "devlink port type for port %d set to Ethernet without a software interface reference, device type not supported by the kernel?\n", - devlink_port->index); - -- __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_ETH, netdev); -+ __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_ETH, netdev, -+ false); - } - EXPORT_SYMBOL_GPL(devlink_port_type_eth_set); - -@@ -10093,7 +10107,8 @@ EXPORT_SYMBOL_GPL(devlink_port_type_eth_set); - void devlink_port_type_ib_set(struct devlink_port *devlink_port, - struct ib_device *ibdev) - { -- __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_IB, ibdev); -+ __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_IB, ibdev, -+ false); - } - EXPORT_SYMBOL_GPL(devlink_port_type_ib_set); - -@@ -10104,7 +10119,8 @@ EXPORT_SYMBOL_GPL(devlink_port_type_ib_set); - */ - void devlink_port_type_clear(struct devlink_port *devlink_port) - { -- __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_NOTSET, NULL); -+ __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_NOTSET, NULL, -+ false); - } - EXPORT_SYMBOL_GPL(devlink_port_type_clear); - --- -2.39.2 - diff --git a/queue-6.1/net-devlink-track-netdev-with-devlink_port-assigned.patch b/queue-6.1/net-devlink-track-netdev-with-devlink_port-assigned.patch deleted file mode 100644 index b3ea1de01f6..00000000000 --- a/queue-6.1/net-devlink-track-netdev-with-devlink_port-assigned.patch +++ /dev/null @@ -1,249 +0,0 @@ -From 71fe4bb7e1513846e9be4229e11c805d991d4768 Mon Sep 17 00:00:00 2001 -From: Sasha Levin -Date: Wed, 2 Nov 2022 17:02:03 +0100 -Subject: net: devlink: track netdev with devlink_port assigned - -From: Jiri Pirko - -[ Upstream commit 02a68a47eadedf95748facfca6ced31fb0181d52 ] - -Currently, ethernet drivers are using devlink_port_type_eth_set() and -devlink_port_type_clear() to set devlink port type and link to related -netdev. - -Instead of calling them directly, let the driver use -SET_NETDEV_DEVLINK_PORT macro to assign devlink_port pointer and let -devlink to track it. Note the devlink port pointer is static during -the time netdevice is registered. - -In devlink code, use per-namespace netdev notifier to track -the netdevices with devlink_port assigned and change the internal -devlink_port type and related type pointer accordingly. - -Signed-off-by: Jiri Pirko -Signed-off-by: Jakub Kicinski -Stable-dep-of: fef5b228dd38 ("rtnetlink: move IFLA_GSO_ tb check to validate_linkmsg") -Signed-off-by: Sasha Levin ---- - include/linux/netdevice.h | 19 ++++++++++ - net/core/dev.c | 14 +++++--- - net/core/devlink.c | 75 ++++++++++++++++++++++++++++++++++++--- - 3 files changed, 99 insertions(+), 9 deletions(-) - -diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h -index eac51e22a52a8..1f8e1cff035da 100644 ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -2008,6 +2008,11 @@ enum netdev_ml_priv_type { - * registered - * @offload_xstats_l3: L3 HW stats for this netdevice. - * -+ * @devlink_port: Pointer to related devlink port structure. -+ * Assigned by a driver before netdev registration using -+ * SET_NETDEV_DEVLINK_PORT macro. This pointer is static -+ * during the time netdevice is registered. -+ * - * FIXME: cleanup struct net_device such that network protocol info - * moves out. - */ -@@ -2358,9 +2363,22 @@ struct net_device { - netdevice_tracker watchdog_dev_tracker; - netdevice_tracker dev_registered_tracker; - struct rtnl_hw_stats64 *offload_xstats_l3; -+ -+ struct devlink_port *devlink_port; - }; - #define to_net_dev(d) container_of(d, struct net_device, dev) - -+/* -+ * Driver should use this to assign devlink port instance to a netdevice -+ * before it registers the netdevice. Therefore devlink_port is static -+ * during the netdev lifetime after it is registered. -+ */ -+#define SET_NETDEV_DEVLINK_PORT(dev, port) \ -+({ \ -+ WARN_ON((dev)->reg_state != NETREG_UNINITIALIZED); \ -+ ((dev)->devlink_port = (port)); \ -+}) -+ - static inline bool netif_elide_gro(const struct net_device *dev) - { - if (!(dev->features & NETIF_F_GRO) || dev->xdp_prog) -@@ -2795,6 +2813,7 @@ enum netdev_cmd { - NETDEV_PRE_TYPE_CHANGE, - NETDEV_POST_TYPE_CHANGE, - NETDEV_POST_INIT, -+ NETDEV_PRE_UNINIT, - NETDEV_RELEASE, - NETDEV_NOTIFY_PEERS, - NETDEV_JOIN, -diff --git a/net/core/dev.c b/net/core/dev.c -index 93d430693ca0f..ba9a0c1a4c505 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -1621,10 +1621,10 @@ const char *netdev_cmd_to_name(enum netdev_cmd cmd) - N(UP) N(DOWN) N(REBOOT) N(CHANGE) N(REGISTER) N(UNREGISTER) - N(CHANGEMTU) N(CHANGEADDR) N(GOING_DOWN) N(CHANGENAME) N(FEAT_CHANGE) - N(BONDING_FAILOVER) N(PRE_UP) N(PRE_TYPE_CHANGE) N(POST_TYPE_CHANGE) -- N(POST_INIT) N(RELEASE) N(NOTIFY_PEERS) N(JOIN) N(CHANGEUPPER) -- N(RESEND_IGMP) N(PRECHANGEMTU) N(CHANGEINFODATA) N(BONDING_INFO) -- N(PRECHANGEUPPER) N(CHANGELOWERSTATE) N(UDP_TUNNEL_PUSH_INFO) -- N(UDP_TUNNEL_DROP_INFO) N(CHANGE_TX_QUEUE_LEN) -+ N(POST_INIT) N(PRE_UNINIT) N(RELEASE) N(NOTIFY_PEERS) N(JOIN) -+ N(CHANGEUPPER) N(RESEND_IGMP) N(PRECHANGEMTU) N(CHANGEINFODATA) -+ N(BONDING_INFO) N(PRECHANGEUPPER) N(CHANGELOWERSTATE) -+ N(UDP_TUNNEL_PUSH_INFO) N(UDP_TUNNEL_DROP_INFO) N(CHANGE_TX_QUEUE_LEN) - N(CVLAN_FILTER_PUSH_INFO) N(CVLAN_FILTER_DROP_INFO) - N(SVLAN_FILTER_PUSH_INFO) N(SVLAN_FILTER_DROP_INFO) - N(PRE_CHANGEADDR) N(OFFLOAD_XSTATS_ENABLE) N(OFFLOAD_XSTATS_DISABLE) -@@ -10064,7 +10064,7 @@ int register_netdevice(struct net_device *dev) - dev->reg_state = ret ? NETREG_UNREGISTERED : NETREG_REGISTERED; - write_unlock(&dev_base_lock); - if (ret) -- goto err_uninit; -+ goto err_uninit_notify; - - __netdev_update_features(dev); - -@@ -10111,6 +10111,8 @@ int register_netdevice(struct net_device *dev) - out: - return ret; - -+err_uninit_notify: -+ call_netdevice_notifiers(NETDEV_PRE_UNINIT, dev); - err_uninit: - if (dev->netdev_ops->ndo_uninit) - dev->netdev_ops->ndo_uninit(dev); -@@ -10857,6 +10859,8 @@ void unregister_netdevice_many(struct list_head *head) - netdev_name_node_alt_flush(dev); - netdev_name_node_free(dev->name_node); - -+ call_netdevice_notifiers(NETDEV_PRE_UNINIT, dev); -+ - if (dev->netdev_ops->ndo_uninit) - dev->netdev_ops->ndo_uninit(dev); - -diff --git a/net/core/devlink.c b/net/core/devlink.c -index 79cfba316438c..4d167d3e84c62 100644 ---- a/net/core/devlink.c -+++ b/net/core/devlink.c -@@ -71,6 +71,7 @@ struct devlink { - refcount_t refcount; - struct completion comp; - struct rcu_head rcu; -+ struct notifier_block netdevice_nb; - char priv[] __aligned(NETDEV_ALIGN); - }; - -@@ -9618,6 +9619,9 @@ void devlink_set_features(struct devlink *devlink, u64 features) - } - EXPORT_SYMBOL_GPL(devlink_set_features); - -+static int devlink_netdevice_event(struct notifier_block *nb, -+ unsigned long event, void *ptr); -+ - /** - * devlink_alloc_ns - Allocate new devlink instance resources - * in specific namespace -@@ -9648,10 +9652,13 @@ struct devlink *devlink_alloc_ns(const struct devlink_ops *ops, - - ret = xa_alloc_cyclic(&devlinks, &devlink->index, devlink, xa_limit_31b, - &last_id, GFP_KERNEL); -- if (ret < 0) { -- kfree(devlink); -- return NULL; -- } -+ if (ret < 0) -+ goto err_xa_alloc; -+ -+ devlink->netdevice_nb.notifier_call = devlink_netdevice_event; -+ ret = register_netdevice_notifier_net(net, &devlink->netdevice_nb); -+ if (ret) -+ goto err_register_netdevice_notifier; - - devlink->dev = dev; - devlink->ops = ops; -@@ -9678,6 +9685,12 @@ struct devlink *devlink_alloc_ns(const struct devlink_ops *ops, - init_completion(&devlink->comp); - - return devlink; -+ -+err_register_netdevice_notifier: -+ xa_erase(&devlinks, devlink->index); -+err_xa_alloc: -+ kfree(devlink); -+ return NULL; - } - EXPORT_SYMBOL_GPL(devlink_alloc_ns); - -@@ -9831,6 +9844,10 @@ void devlink_free(struct devlink *devlink) - WARN_ON(!list_empty(&devlink->port_list)); - - xa_destroy(&devlink->snapshot_ids); -+ -+ unregister_netdevice_notifier_net(devlink_net(devlink), -+ &devlink->netdevice_nb); -+ - xa_erase(&devlinks, devlink->index); - - kfree(devlink); -@@ -10124,6 +10141,56 @@ void devlink_port_type_clear(struct devlink_port *devlink_port) - } - EXPORT_SYMBOL_GPL(devlink_port_type_clear); - -+static int devlink_netdevice_event(struct notifier_block *nb, -+ unsigned long event, void *ptr) -+{ -+ struct net_device *netdev = netdev_notifier_info_to_dev(ptr); -+ struct devlink_port *devlink_port = netdev->devlink_port; -+ struct devlink *devlink; -+ -+ devlink = container_of(nb, struct devlink, netdevice_nb); -+ -+ if (!devlink_port || devlink_port->devlink != devlink) -+ return NOTIFY_OK; -+ -+ switch (event) { -+ case NETDEV_POST_INIT: -+ /* Set the type but not netdev pointer. It is going to be set -+ * later on by NETDEV_REGISTER event. Happens once during -+ * netdevice register -+ */ -+ __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_ETH, -+ NULL, true); -+ break; -+ case NETDEV_REGISTER: -+ /* Set the netdev on top of previously set type. Note this -+ * event happens also during net namespace change so here -+ * we take into account netdev pointer appearing in this -+ * namespace. -+ */ -+ __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_ETH, -+ netdev, true); -+ break; -+ case NETDEV_UNREGISTER: -+ /* Clear netdev pointer, but not the type. This event happens -+ * also during net namespace change so we need to clear -+ * pointer to netdev that is going to another net namespace. -+ */ -+ __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_ETH, -+ NULL, true); -+ break; -+ case NETDEV_PRE_UNINIT: -+ /* Clear the type and the netdev pointer. Happens one during -+ * netdevice unregister. -+ */ -+ __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_NOTSET, -+ NULL, true); -+ break; -+ } -+ -+ return NOTIFY_OK; -+} -+ - static int __devlink_port_attrs_set(struct devlink_port *devlink_port, - enum devlink_port_flavour flavour) - { --- -2.39.2 - diff --git a/queue-6.1/net-expose-devlink-port-over-rtnetlink.patch b/queue-6.1/net-expose-devlink-port-over-rtnetlink.patch deleted file mode 100644 index 645b578cadb..00000000000 --- a/queue-6.1/net-expose-devlink-port-over-rtnetlink.patch +++ /dev/null @@ -1,180 +0,0 @@ -From 96d23a5586e52e38e77bfbb6a937696d0857a85f Mon Sep 17 00:00:00 2001 -From: Sasha Levin -Date: Wed, 2 Nov 2022 17:02:11 +0100 -Subject: net: expose devlink port over rtnetlink - -From: Jiri Pirko - -[ Upstream commit dca56c3038c34a3e5acfe0aadb1f2bc9d724ae79 ] - -Expose devlink port handle related to netdev over rtnetlink. Introduce a -new nested IFLA attribute to carry the info. Call into devlink code to -fill-up the nest with existing devlink attributes that are used over -devlink netlink. - -Signed-off-by: Jiri Pirko -Signed-off-by: Jakub Kicinski -Stable-dep-of: fef5b228dd38 ("rtnetlink: move IFLA_GSO_ tb check to validate_linkmsg") -Signed-off-by: Sasha Levin ---- - include/net/devlink.h | 14 +++++++++++++ - include/uapi/linux/if_link.h | 2 ++ - net/core/devlink.c | 18 +++++++++++++++++ - net/core/rtnetlink.c | 39 ++++++++++++++++++++++++++++++++++++ - 4 files changed, 73 insertions(+) - -diff --git a/include/net/devlink.h b/include/net/devlink.h -index 6c55aabaedf19..ebd678ab5519e 100644 ---- a/include/net/devlink.h -+++ b/include/net/devlink.h -@@ -1872,6 +1872,9 @@ int devlink_compat_phys_port_name_get(struct net_device *dev, - int devlink_compat_switch_id_get(struct net_device *dev, - struct netdev_phys_item_id *ppid); - -+int devlink_nl_port_handle_fill(struct sk_buff *msg, struct devlink_port *devlink_port); -+size_t devlink_nl_port_handle_size(struct devlink_port *devlink_port); -+ - #else - - static inline struct devlink *devlink_try_get(struct devlink *devlink) -@@ -1908,6 +1911,17 @@ devlink_compat_switch_id_get(struct net_device *dev, - return -EOPNOTSUPP; - } - -+static inline int -+devlink_nl_port_handle_fill(struct sk_buff *msg, struct devlink_port *devlink_port) -+{ -+ return 0; -+} -+ -+static inline size_t devlink_nl_port_handle_size(struct devlink_port *devlink_port) -+{ -+ return 0; -+} -+ - #endif - - #endif /* _NET_DEVLINK_H_ */ -diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h -index 5e7a1041df3a4..9af9da1db4e84 100644 ---- a/include/uapi/linux/if_link.h -+++ b/include/uapi/linux/if_link.h -@@ -372,6 +372,8 @@ enum { - IFLA_TSO_MAX_SEGS, - IFLA_ALLMULTI, /* Allmulti count: > 0 means acts ALLMULTI */ - -+ IFLA_DEVLINK_PORT, -+ - __IFLA_MAX - }; - -diff --git a/net/core/devlink.c b/net/core/devlink.c -index 4d167d3e84c62..fedbea59b5d39 100644 ---- a/net/core/devlink.c -+++ b/net/core/devlink.c -@@ -880,6 +880,24 @@ static int devlink_nl_put_nested_handle(struct sk_buff *msg, struct devlink *dev - return -EMSGSIZE; - } - -+int devlink_nl_port_handle_fill(struct sk_buff *msg, struct devlink_port *devlink_port) -+{ -+ if (devlink_nl_put_handle(msg, devlink_port->devlink)) -+ return -EMSGSIZE; -+ if (nla_put_u32(msg, DEVLINK_ATTR_PORT_INDEX, devlink_port->index)) -+ return -EMSGSIZE; -+ return 0; -+} -+ -+size_t devlink_nl_port_handle_size(struct devlink_port *devlink_port) -+{ -+ struct devlink *devlink = devlink_port->devlink; -+ -+ return nla_total_size(strlen(devlink->dev->bus->name) + 1) /* DEVLINK_ATTR_BUS_NAME */ -+ + nla_total_size(strlen(dev_name(devlink->dev)) + 1) /* DEVLINK_ATTR_DEV_NAME */ -+ + nla_total_size(4); /* DEVLINK_ATTR_PORT_INDEX */ -+} -+ - struct devlink_reload_combination { - enum devlink_reload_action action; - enum devlink_reload_limit limit; -diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c -index b192c69f3936c..d3727d9151c2a 100644 ---- a/net/core/rtnetlink.c -+++ b/net/core/rtnetlink.c -@@ -53,6 +53,7 @@ - #include - #include - #include -+#include - - #include "dev.h" - -@@ -1038,6 +1039,16 @@ static size_t rtnl_proto_down_size(const struct net_device *dev) - return size; - } - -+static size_t rtnl_devlink_port_size(const struct net_device *dev) -+{ -+ size_t size = nla_total_size(0); /* nest IFLA_DEVLINK_PORT */ -+ -+ if (dev->devlink_port) -+ size += devlink_nl_port_handle_size(dev->devlink_port); -+ -+ return size; -+} -+ - static noinline size_t if_nlmsg_size(const struct net_device *dev, - u32 ext_filter_mask) - { -@@ -1091,6 +1102,7 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev, - + nla_total_size(4) /* IFLA_MAX_MTU */ - + rtnl_prop_list_size(dev) - + nla_total_size(MAX_ADDR_LEN) /* IFLA_PERM_ADDRESS */ -+ + rtnl_devlink_port_size(dev) - + 0; - } - -@@ -1728,6 +1740,30 @@ static int rtnl_fill_proto_down(struct sk_buff *skb, - return -EMSGSIZE; - } - -+static int rtnl_fill_devlink_port(struct sk_buff *skb, -+ const struct net_device *dev) -+{ -+ struct nlattr *devlink_port_nest; -+ int ret; -+ -+ devlink_port_nest = nla_nest_start(skb, IFLA_DEVLINK_PORT); -+ if (!devlink_port_nest) -+ return -EMSGSIZE; -+ -+ if (dev->devlink_port) { -+ ret = devlink_nl_port_handle_fill(skb, dev->devlink_port); -+ if (ret < 0) -+ goto nest_cancel; -+ } -+ -+ nla_nest_end(skb, devlink_port_nest); -+ return 0; -+ -+nest_cancel: -+ nla_nest_cancel(skb, devlink_port_nest); -+ return ret; -+} -+ - static int rtnl_fill_ifinfo(struct sk_buff *skb, - struct net_device *dev, struct net *src_net, - int type, u32 pid, u32 seq, u32 change, -@@ -1865,6 +1901,9 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, - dev->dev.parent->bus->name)) - goto nla_put_failure; - -+ if (rtnl_fill_devlink_port(skb, dev)) -+ goto nla_put_failure; -+ - nlmsg_end(skb, nlh); - return 0; - --- -2.39.2 - diff --git a/queue-6.1/rtnetlink-add-the-missing-ifla_gro_-tb-check-in-vali.patch b/queue-6.1/rtnetlink-add-the-missing-ifla_gro_-tb-check-in-vali.patch deleted file mode 100644 index 3166ee98d6f..00000000000 --- a/queue-6.1/rtnetlink-add-the-missing-ifla_gro_-tb-check-in-vali.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 4e69ce98b1501f833b1cde2381fdfd81a52fdadf Mon Sep 17 00:00:00 2001 -From: Sasha Levin -Date: Wed, 31 May 2023 12:01:44 -0400 -Subject: rtnetlink: add the missing IFLA_GRO_ tb check in validate_linkmsg - -From: Xin Long - -[ Upstream commit 65d6914e253f3d83b724a9bbfc889ae95711e512 ] - -This fixes the issue that dev gro_max_size and gso_ipv4_max_size -can be set to a huge value: - - # ip link add dummy1 type dummy - # ip link set dummy1 gro_max_size 4294967295 - # ip -d link show dummy1 - dummy addrgenmode eui64 ... gro_max_size 4294967295 - -Fixes: 0fe79f28bfaf ("net: allow gro_max_size to exceed 65536") -Fixes: 9eefedd58ae1 ("net: add gso_ipv4_max_size and gro_ipv4_max_size per device") -Reported-by: Xiumei Mu -Signed-off-by: Xin Long -Reviewed-by: Simon Horman -Signed-off-by: Jakub Kicinski -Signed-off-by: Sasha Levin ---- - net/core/rtnetlink.c | 12 ++++++++++++ - 1 file changed, 12 insertions(+) - -diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c -index 99c1430cde345..91b50bdd848fe 100644 ---- a/net/core/rtnetlink.c -+++ b/net/core/rtnetlink.c -@@ -2396,11 +2396,23 @@ static int validate_linkmsg(struct net_device *dev, struct nlattr *tb[], - return -EINVAL; - } - -+ if (tb[IFLA_GRO_MAX_SIZE] && -+ nla_get_u32(tb[IFLA_GRO_MAX_SIZE]) > GRO_MAX_SIZE) { -+ NL_SET_ERR_MSG(extack, "too big gro_max_size"); -+ return -EINVAL; -+ } -+ - if (tb[IFLA_GSO_IPV4_MAX_SIZE] && - nla_get_u32(tb[IFLA_GSO_IPV4_MAX_SIZE]) > dev->tso_max_size) { - NL_SET_ERR_MSG(extack, "too big gso_ipv4_max_size"); - return -EINVAL; - } -+ -+ if (tb[IFLA_GRO_IPV4_MAX_SIZE] && -+ nla_get_u32(tb[IFLA_GRO_IPV4_MAX_SIZE]) > GRO_MAX_SIZE) { -+ NL_SET_ERR_MSG(extack, "too big gro_ipv4_max_size"); -+ return -EINVAL; -+ } - } - - if (tb[IFLA_AF_SPEC]) { --- -2.39.2 - diff --git a/queue-6.1/rtnetlink-call-validate_linkmsg-in-rtnl_create_link.patch b/queue-6.1/rtnetlink-call-validate_linkmsg-in-rtnl_create_link.patch index 863cc1ba17f..39ff3bf11ba 100644 --- a/queue-6.1/rtnetlink-call-validate_linkmsg-in-rtnl_create_link.patch +++ b/queue-6.1/rtnetlink-call-validate_linkmsg-in-rtnl_create_link.patch @@ -1,11 +1,11 @@ -From 2bad0d28d345a30d75037080916b13deaca88a3e Mon Sep 17 00:00:00 2001 -From: Sasha Levin +From b0ad3c179059089d809b477a1d445c1183a7b8fe Mon Sep 17 00:00:00 2001 +From: Xin Long Date: Wed, 31 May 2023 12:01:42 -0400 Subject: rtnetlink: call validate_linkmsg in rtnl_create_link From: Xin Long -[ Upstream commit b0ad3c179059089d809b477a1d445c1183a7b8fe ] +commit b0ad3c179059089d809b477a1d445c1183a7b8fe upstream. validate_linkmsg() was introduced by commit 1840bb13c22f5b ("[RTNL]: Validate hardware and broadcast address attribute for RTM_NEWLINK") @@ -22,16 +22,14 @@ Fixes: 0e06877c6fdb ("[RTNETLINK]: rtnl_link: allow specifying initial device ad Signed-off-by: Xin Long Reviewed-by: Simon Horman Signed-off-by: Jakub Kicinski -Signed-off-by: Sasha Levin +Signed-off-by: Greg Kroah-Hartman --- - net/core/rtnetlink.c | 8 +++++++- + net/core/rtnetlink.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) -diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c -index 74864dc46a7ef..b192c69f3936c 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c -@@ -3212,6 +3212,7 @@ struct net_device *rtnl_create_link(struct net *net, const char *ifname, +@@ -3212,6 +3212,7 @@ struct net_device *rtnl_create_link(stru struct net_device *dev; unsigned int num_tx_queues = 1; unsigned int num_rx_queues = 1; @@ -39,7 +37,7 @@ index 74864dc46a7ef..b192c69f3936c 100644 if (tb[IFLA_NUM_TX_QUEUES]) num_tx_queues = nla_get_u32(tb[IFLA_NUM_TX_QUEUES]); -@@ -3247,13 +3248,18 @@ struct net_device *rtnl_create_link(struct net *net, const char *ifname, +@@ -3247,13 +3248,18 @@ struct net_device *rtnl_create_link(stru if (!dev) return ERR_PTR(-ENOMEM); @@ -59,6 +57,3 @@ index 74864dc46a7ef..b192c69f3936c 100644 err = dev_validate_mtu(dev, mtu, extack); if (err) { --- -2.39.2 - diff --git a/queue-6.1/rtnetlink-move-ifla_gso_-tb-check-to-validate_linkms.patch b/queue-6.1/rtnetlink-move-ifla_gso_-tb-check-to-validate_linkms.patch deleted file mode 100644 index b809d334a89..00000000000 --- a/queue-6.1/rtnetlink-move-ifla_gso_-tb-check-to-validate_linkms.patch +++ /dev/null @@ -1,95 +0,0 @@ -From c7415cb989a51dbb899bea64f3d7f26971e1e018 Mon Sep 17 00:00:00 2001 -From: Sasha Levin -Date: Wed, 31 May 2023 12:01:43 -0400 -Subject: rtnetlink: move IFLA_GSO_ tb check to validate_linkmsg - -From: Xin Long - -[ Upstream commit fef5b228dd38378148bc850f7e69a7783f3b95a4 ] - -These IFLA_GSO_* tb check should also be done for the new created link, -otherwise, they can be set to a huge value when creating links: - - # ip link add dummy1 gso_max_size 4294967295 type dummy - # ip -d link show dummy1 - dummy addrgenmode eui64 ... gso_max_size 4294967295 - -Fixes: 46e6b992c250 ("rtnetlink: allow GSO maximums to be set on device creation") -Fixes: 9eefedd58ae1 ("net: add gso_ipv4_max_size and gro_ipv4_max_size per device") -Signed-off-by: Xin Long -Reviewed-by: Simon Horman -Signed-off-by: Jakub Kicinski -Signed-off-by: Sasha Levin ---- - net/core/rtnetlink.c | 34 +++++++++++++++++++--------------- - 1 file changed, 19 insertions(+), 15 deletions(-) - -diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c -index 027275235858b..99c1430cde345 100644 ---- a/net/core/rtnetlink.c -+++ b/net/core/rtnetlink.c -@@ -2382,6 +2382,25 @@ static int validate_linkmsg(struct net_device *dev, struct nlattr *tb[], - if (tb[IFLA_BROADCAST] && - nla_len(tb[IFLA_BROADCAST]) < dev->addr_len) - return -EINVAL; -+ -+ if (tb[IFLA_GSO_MAX_SIZE] && -+ nla_get_u32(tb[IFLA_GSO_MAX_SIZE]) > dev->tso_max_size) { -+ NL_SET_ERR_MSG(extack, "too big gso_max_size"); -+ return -EINVAL; -+ } -+ -+ if (tb[IFLA_GSO_MAX_SEGS] && -+ (nla_get_u32(tb[IFLA_GSO_MAX_SEGS]) > GSO_MAX_SEGS || -+ nla_get_u32(tb[IFLA_GSO_MAX_SEGS]) > dev->tso_max_segs)) { -+ NL_SET_ERR_MSG(extack, "too big gso_max_segs"); -+ return -EINVAL; -+ } -+ -+ if (tb[IFLA_GSO_IPV4_MAX_SIZE] && -+ nla_get_u32(tb[IFLA_GSO_IPV4_MAX_SIZE]) > dev->tso_max_size) { -+ NL_SET_ERR_MSG(extack, "too big gso_ipv4_max_size"); -+ return -EINVAL; -+ } - } - - if (tb[IFLA_AF_SPEC]) { -@@ -2855,11 +2874,6 @@ static int do_setlink(const struct sk_buff *skb, - if (tb[IFLA_GSO_MAX_SIZE]) { - u32 max_size = nla_get_u32(tb[IFLA_GSO_MAX_SIZE]); - -- if (max_size > dev->tso_max_size) { -- err = -EINVAL; -- goto errout; -- } -- - if (dev->gso_max_size ^ max_size) { - netif_set_gso_max_size(dev, max_size); - status |= DO_SETLINK_MODIFIED; -@@ -2869,11 +2883,6 @@ static int do_setlink(const struct sk_buff *skb, - if (tb[IFLA_GSO_MAX_SEGS]) { - u32 max_segs = nla_get_u32(tb[IFLA_GSO_MAX_SEGS]); - -- if (max_segs > GSO_MAX_SEGS || max_segs > dev->tso_max_segs) { -- err = -EINVAL; -- goto errout; -- } -- - if (dev->gso_max_segs ^ max_segs) { - netif_set_gso_max_segs(dev, max_segs); - status |= DO_SETLINK_MODIFIED; -@@ -2892,11 +2901,6 @@ static int do_setlink(const struct sk_buff *skb, - if (tb[IFLA_GSO_IPV4_MAX_SIZE]) { - u32 max_size = nla_get_u32(tb[IFLA_GSO_IPV4_MAX_SIZE]); - -- if (max_size > dev->tso_max_size) { -- err = -EINVAL; -- goto errout; -- } -- - if (dev->gso_ipv4_max_size ^ max_size) { - netif_set_gso_ipv4_max_size(dev, max_size); - status |= DO_SETLINK_MODIFIED; --- -2.39.2 - diff --git a/queue-6.1/series b/queue-6.1/series index d814e9e1fe7..9ec46abd038 100644 --- a/queue-6.1/series +++ b/queue-6.1/series @@ -50,15 +50,6 @@ net-dsa-mv88e6xxx-increase-wait-after-reset-deactiva.patch mtd-rawnand-marvell-ensure-timing-values-are-written.patch mtd-rawnand-marvell-don-t-set-the-nand-frequency-sel.patch rtnetlink-call-validate_linkmsg-in-rtnl_create_link.patch -net-devlink-convert-devlink-port-type-specific-point.patch -net-devlink-move-port_type_warn_schedule-call-to-__d.patch -net-devlink-move-port_type_netdev_checks-call-to-__d.patch -net-devlink-take-rtnl-in-port_fill-function-only-if-.patch -net-devlink-track-netdev-with-devlink_port-assigned.patch -net-expose-devlink-port-over-rtnetlink.patch -net-add-gso_ipv4_max_size-and-gro_ipv4_max_size-per-.patch -rtnetlink-move-ifla_gso_-tb-check-to-validate_linkms.patch -rtnetlink-add-the-missing-ifla_gro_-tb-check-in-vali.patch mptcp-avoid-unneeded-__mptcp_nmpc_socket-usage.patch mptcp-add-annotations-around-msk-subflow-accesses.patch mptcp-avoid-unneeded-address-copy.patch