From: Greg Kroah-Hartman Date: Fri, 18 Oct 2024 09:00:24 +0000 (+0200) Subject: 6.1-stable patches X-Git-Tag: v5.10.228~59 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e0cb0f35adcb02317d0cddd0cb9d1279509f7ab3;p=thirdparty%2Fkernel%2Fstable-queue.git 6.1-stable patches added patches: devlink-bump-the-instance-index-directly-when-iterating.patch devlink-drop-the-filter-argument-from-devlinks_xa_find_get.patch --- diff --git a/queue-6.1/devlink-bump-the-instance-index-directly-when-iterating.patch b/queue-6.1/devlink-bump-the-instance-index-directly-when-iterating.patch new file mode 100644 index 00000000000..91e5a66f5e6 --- /dev/null +++ b/queue-6.1/devlink-bump-the-instance-index-directly-when-iterating.patch @@ -0,0 +1,98 @@ +From d772781964415c63759572b917e21c4f7ec08d9f Mon Sep 17 00:00:00 2001 +From: Jakub Kicinski +Date: Thu, 5 Jan 2023 22:33:54 -0800 +Subject: devlink: bump the instance index directly when iterating + +From: Jakub Kicinski + +commit d772781964415c63759572b917e21c4f7ec08d9f upstream. + +xa_find_after() is designed to handle multi-index entries correctly. +If a xarray has two entries one which spans indexes 0-3 and one at +index 4 xa_find_after(0) will return the entry at index 4. + +Having to juggle the two callbacks, however, is unnecessary in case +of the devlink xarray, as there is 1:1 relationship with indexes. + +Always use xa_find() and increment the index manually. + +Signed-off-by: Jakub Kicinski +Reviewed-by: Jiri Pirko +Signed-off-by: David S. Miller +[ Ido: Moved the changes from core.c and devl_internal.h to leftover.c ] +Signed-off-by: Ido Schimmel +Signed-off-by: Greg Kroah-Hartman +--- + net/devlink/leftover.c | 35 ++++++++++------------------------- + 1 file changed, 10 insertions(+), 25 deletions(-) + +--- a/net/devlink/leftover.c ++++ b/net/devlink/leftover.c +@@ -289,15 +289,13 @@ void devl_unlock(struct devlink *devlink + EXPORT_SYMBOL_GPL(devl_unlock); + + static struct devlink * +-devlinks_xa_find_get(struct net *net, unsigned long *indexp, +- void * (*xa_find_fn)(struct xarray *, unsigned long *, +- unsigned long, xa_mark_t)) ++devlinks_xa_find_get(struct net *net, unsigned long *indexp) + { +- struct devlink *devlink; ++ struct devlink *devlink = NULL; + + rcu_read_lock(); + retry: +- devlink = xa_find_fn(&devlinks, indexp, ULONG_MAX, DEVLINK_REGISTERED); ++ devlink = xa_find(&devlinks, indexp, ULONG_MAX, DEVLINK_REGISTERED); + if (!devlink) + goto unlock; + +@@ -306,31 +304,20 @@ retry: + * This prevents live-lock of devlink_unregister() wait for completion. + */ + if (xa_get_mark(&devlinks, *indexp, DEVLINK_UNREGISTERING)) +- goto retry; ++ goto next; + +- /* For a possible retry, the xa_find_after() should be always used */ +- xa_find_fn = xa_find_after; + if (!devlink_try_get(devlink)) +- goto retry; ++ goto next; + if (!net_eq(devlink_net(devlink), net)) { + devlink_put(devlink); +- goto retry; ++ goto next; + } + unlock: + rcu_read_unlock(); + return devlink; +-} +- +-static struct devlink *devlinks_xa_find_get_first(struct net *net, +- unsigned long *indexp) +-{ +- return devlinks_xa_find_get(net, indexp, xa_find); +-} +- +-static struct devlink *devlinks_xa_find_get_next(struct net *net, +- unsigned long *indexp) +-{ +- return devlinks_xa_find_get(net, indexp, xa_find_after); ++next: ++ (*indexp)++; ++ goto retry; + } + + /* Iterate over devlink pointers which were possible to get reference to. +@@ -338,9 +325,7 @@ static struct devlink *devlinks_xa_find_ + * in loop body in order to release the reference. + */ + #define devlinks_xa_for_each_registered_get(net, index, devlink) \ +- for (index = 0, \ +- devlink = devlinks_xa_find_get_first(net, &index); \ +- devlink; devlink = devlinks_xa_find_get_next(net, &index)) ++ for (index = 0; (devlink = devlinks_xa_find_get(net, &index)); index++) + + static struct devlink *devlink_get_from_attrs(struct net *net, + struct nlattr **attrs) diff --git a/queue-6.1/devlink-drop-the-filter-argument-from-devlinks_xa_find_get.patch b/queue-6.1/devlink-drop-the-filter-argument-from-devlinks_xa_find_get.patch new file mode 100644 index 00000000000..550f95ab614 --- /dev/null +++ b/queue-6.1/devlink-drop-the-filter-argument-from-devlinks_xa_find_get.patch @@ -0,0 +1,74 @@ +From 8861c0933c78e3631fe752feadc0d2a6e5eab1e1 Mon Sep 17 00:00:00 2001 +From: Jakub Kicinski +Date: Wed, 4 Jan 2023 20:05:24 -0800 +Subject: devlink: drop the filter argument from devlinks_xa_find_get + +From: Jakub Kicinski + +commit 8861c0933c78e3631fe752feadc0d2a6e5eab1e1 upstream. + +Looks like devlinks_xa_find_get() was intended to get the mark +from the @filter argument. It doesn't actually use @filter, passing +DEVLINK_REGISTERED to xa_find_fn() directly. Walking marks other +than registered is unlikely so drop @filter argument completely. + +Reviewed-by: Jiri Pirko +Reviewed-by: Jacob Keller +Signed-off-by: Jakub Kicinski +[ Ido: Moved the changes from core.c and devl_internal.h to leftover.c ] +Stable-dep-of: d77278196441 ("devlink: bump the instance index directly when iterating") +Signed-off-by: Ido Schimmel +Signed-off-by: Greg Kroah-Hartman +--- + net/devlink/leftover.c | 21 ++++++++------------- + 1 file changed, 8 insertions(+), 13 deletions(-) + +--- a/net/devlink/leftover.c ++++ b/net/devlink/leftover.c +@@ -289,7 +289,7 @@ void devl_unlock(struct devlink *devlink + EXPORT_SYMBOL_GPL(devl_unlock); + + static struct devlink * +-devlinks_xa_find_get(struct net *net, unsigned long *indexp, xa_mark_t filter, ++devlinks_xa_find_get(struct net *net, unsigned long *indexp, + void * (*xa_find_fn)(struct xarray *, unsigned long *, + unsigned long, xa_mark_t)) + { +@@ -322,30 +322,25 @@ unlock: + } + + static struct devlink *devlinks_xa_find_get_first(struct net *net, +- unsigned long *indexp, +- xa_mark_t filter) ++ unsigned long *indexp) + { +- return devlinks_xa_find_get(net, indexp, filter, xa_find); ++ return devlinks_xa_find_get(net, indexp, xa_find); + } + + static struct devlink *devlinks_xa_find_get_next(struct net *net, +- unsigned long *indexp, +- xa_mark_t filter) ++ unsigned long *indexp) + { +- return devlinks_xa_find_get(net, indexp, filter, xa_find_after); ++ return devlinks_xa_find_get(net, indexp, xa_find_after); + } + + /* Iterate over devlink pointers which were possible to get reference to. + * devlink_put() needs to be called for each iterated devlink pointer + * in loop body in order to release the reference. + */ +-#define devlinks_xa_for_each_get(net, index, devlink, filter) \ +- for (index = 0, \ +- devlink = devlinks_xa_find_get_first(net, &index, filter); \ +- devlink; devlink = devlinks_xa_find_get_next(net, &index, filter)) +- + #define devlinks_xa_for_each_registered_get(net, index, devlink) \ +- devlinks_xa_for_each_get(net, index, devlink, DEVLINK_REGISTERED) ++ for (index = 0, \ ++ devlink = devlinks_xa_find_get_first(net, &index); \ ++ devlink; devlink = devlinks_xa_find_get_next(net, &index)) + + static struct devlink *devlink_get_from_attrs(struct net *net, + struct nlattr **attrs) diff --git a/queue-6.1/series b/queue-6.1/series index 1e73d083ff5..e92c9ea7b53 100644 --- a/queue-6.1/series +++ b/queue-6.1/series @@ -31,3 +31,5 @@ net-macb-avoid-20s-boot-delay-by-skipping-mdio-bus-registration-for-fixed-link-p irqchip-gic-v3-its-fix-vsync-referencing-an-unmapped-vpe-on-gic-v4.1.patch fat-fix-uninitialized-variable.patch mm-swapfile-skip-hugetlb-pages-for-unuse_vma.patch +devlink-drop-the-filter-argument-from-devlinks_xa_find_get.patch +devlink-bump-the-instance-index-directly-when-iterating.patch