]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
6.1-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 18 Oct 2024 09:00:24 +0000 (11:00 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 18 Oct 2024 09:00:24 +0000 (11:00 +0200)
added patches:
devlink-bump-the-instance-index-directly-when-iterating.patch
devlink-drop-the-filter-argument-from-devlinks_xa_find_get.patch

queue-6.1/devlink-bump-the-instance-index-directly-when-iterating.patch [new file with mode: 0644]
queue-6.1/devlink-drop-the-filter-argument-from-devlinks_xa_find_get.patch [new file with mode: 0644]
queue-6.1/series

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 (file)
index 0000000..91e5a66
--- /dev/null
@@ -0,0 +1,98 @@
+From d772781964415c63759572b917e21c4f7ec08d9f Mon Sep 17 00:00:00 2001
+From: Jakub Kicinski <kuba@kernel.org>
+Date: Thu, 5 Jan 2023 22:33:54 -0800
+Subject: devlink: bump the instance index directly when iterating
+
+From: Jakub Kicinski <kuba@kernel.org>
+
+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 <kuba@kernel.org>
+Reviewed-by: Jiri Pirko <jiri@nvidia.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+[ Ido: Moved the changes from core.c and devl_internal.h to leftover.c ]
+Signed-off-by: Ido Schimmel <idosch@nvidia.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..550f95a
--- /dev/null
@@ -0,0 +1,74 @@
+From 8861c0933c78e3631fe752feadc0d2a6e5eab1e1 Mon Sep 17 00:00:00 2001
+From: Jakub Kicinski <kuba@kernel.org>
+Date: Wed, 4 Jan 2023 20:05:24 -0800
+Subject: devlink: drop the filter argument from devlinks_xa_find_get
+
+From: Jakub Kicinski <kuba@kernel.org>
+
+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 <jiri@nvidia.com>
+Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+[ 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 <idosch@nvidia.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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)
index 1e73d083ff5c565c462fbab88499d0a747541cde..e92c9ea7b53542b47ac6aa6e739a07762ba6f455 100644 (file)
@@ -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