Too many unfixed later patches do not apply.
+++ /dev/null
-From 1b6476dd699424b28a16a280bb327df8cdc65580 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-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 <lucien.xin@gmail.com>
-
-[ 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 <lucien.xin@gmail.com>
-Reviewed-by: David Ahern <dsahern@kernel.org>
-Reviewed-by: Eric Dumazet <edumazet@google.com>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Stable-dep-of: fef5b228dd38 ("rtnetlink: move IFLA_GSO_ tb check to validate_linkmsg")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- 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
-
+++ /dev/null
-From a3f6c7f0c515b5aedcd5e76921eb427033780600 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 2 Nov 2022 17:01:59 +0100
-Subject: net: devlink: convert devlink port type-specific pointers to union
-
-From: Jiri Pirko <jiri@nvidia.com>
-
-[ 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 <jiri@nvidia.com>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Stable-dep-of: fef5b228dd38 ("rtnetlink: move IFLA_GSO_ tb check to validate_linkmsg")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- 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
-
+++ /dev/null
-From 6c123dd21384cb6ba0ea718cdc92231237ad2624 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-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 <jiri@nvidia.com>
-
-[ 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 <jiri@nvidia.com>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Stable-dep-of: fef5b228dd38 ("rtnetlink: move IFLA_GSO_ tb check to validate_linkmsg")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- 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
-
+++ /dev/null
-From 30acfeed998f4bfd42d905c2d63c335a6c098697 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-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 <jiri@nvidia.com>
-
-[ 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 <jiri@nvidia.com>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Stable-dep-of: fef5b228dd38 ("rtnetlink: move IFLA_GSO_ tb check to validate_linkmsg")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- 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
-
+++ /dev/null
-From 68d81614aec1851d3e794c9cc8a5ad703d0234ad Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-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 <jiri@nvidia.com>
-
-[ 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 <jiri@nvidia.com>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Stable-dep-of: fef5b228dd38 ("rtnetlink: move IFLA_GSO_ tb check to validate_linkmsg")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- 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
-
+++ /dev/null
-From 71fe4bb7e1513846e9be4229e11c805d991d4768 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 2 Nov 2022 17:02:03 +0100
-Subject: net: devlink: track netdev with devlink_port assigned
-
-From: Jiri Pirko <jiri@nvidia.com>
-
-[ 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 <jiri@nvidia.com>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Stable-dep-of: fef5b228dd38 ("rtnetlink: move IFLA_GSO_ tb check to validate_linkmsg")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- 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
-
+++ /dev/null
-From 96d23a5586e52e38e77bfbb6a937696d0857a85f Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 2 Nov 2022 17:02:11 +0100
-Subject: net: expose devlink port over rtnetlink
-
-From: Jiri Pirko <jiri@nvidia.com>
-
-[ 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 <jiri@nvidia.com>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Stable-dep-of: fef5b228dd38 ("rtnetlink: move IFLA_GSO_ tb check to validate_linkmsg")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- 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 <net/fib_rules.h>
- #include <net/rtnetlink.h>
- #include <net/net_namespace.h>
-+#include <net/devlink.h>
-
- #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
-
+++ /dev/null
-From 4e69ce98b1501f833b1cde2381fdfd81a52fdadf Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 31 May 2023 12:01:44 -0400
-Subject: rtnetlink: add the missing IFLA_GRO_ tb check in validate_linkmsg
-
-From: Xin Long <lucien.xin@gmail.com>
-
-[ 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 <xmu@redhat.com>
-Signed-off-by: Xin Long <lucien.xin@gmail.com>
-Reviewed-by: Simon Horman <simon.horman@corigine.com>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- 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
-
-From 2bad0d28d345a30d75037080916b13deaca88a3e Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
+From b0ad3c179059089d809b477a1d445c1183a7b8fe Mon Sep 17 00:00:00 2001
+From: Xin Long <lucien.xin@gmail.com>
Date: Wed, 31 May 2023 12:01:42 -0400
Subject: rtnetlink: call validate_linkmsg in rtnl_create_link
From: Xin Long <lucien.xin@gmail.com>
-[ Upstream commit b0ad3c179059089d809b477a1d445c1183a7b8fe ]
+commit b0ad3c179059089d809b477a1d445c1183a7b8fe upstream.
validate_linkmsg() was introduced by commit 1840bb13c22f5b ("[RTNL]:
Validate hardware and broadcast address attribute for RTM_NEWLINK")
Signed-off-by: Xin Long <lucien.xin@gmail.com>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
- 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;
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);
err = dev_validate_mtu(dev, mtu, extack);
if (err) {
---
-2.39.2
-
+++ /dev/null
-From c7415cb989a51dbb899bea64f3d7f26971e1e018 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 31 May 2023 12:01:43 -0400
-Subject: rtnetlink: move IFLA_GSO_ tb check to validate_linkmsg
-
-From: Xin Long <lucien.xin@gmail.com>
-
-[ 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 <lucien.xin@gmail.com>
-Reviewed-by: Simon Horman <simon.horman@corigine.com>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- 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
-
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