FAILED: patch "[PATCH] batman-adv: Drop unmanaged ELP metric worker" failed to apply to 5.10-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.10-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.10.y
git checkout FETCH_HEAD
git cherry-pick -x 8c8ecc98f5c65947b0070a24bac11e12e47cc65d
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2025021841-atrium-settle-8b58@gregkh' --subject-prefix 'PATCH 5.10.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 8c8ecc98f5c65947b0070a24bac11e12e47cc65d Mon Sep 17 00:00:00 2001
From: Sven Eckelmann <[email protected]>
Date: Mon, 20 Jan 2025 00:06:11 +0100
Subject: [PATCH] batman-adv: Drop unmanaged ELP metric worker
The ELP worker needs to calculate new metric values for all neighbors "reachable" over an interface. Some of the used metric sources require locks which might need to sleep. This sleep is incompatible with the RCU list iterator used for the recorded neighbors. The initial approach to work around of this problem was to queue another work item per neighbor and then run this in a new context.
Even when this solved the RCU vs might_sleep() conflict, it has a major
problems: Nothing was stopping the work item in case it is not needed anymore - for example because one of the related interfaces was removed or the batman-adv module was unloaded - resulting in potential invalid memory accesses.
Directly canceling the metric worker also has various problems:
* cancel_work_sync for a to-be-deactivated interface is called with rtnl_lock held. But the code in the ELP metric worker also tries to use rtnl_lock() - which will never return in this case. This also means that cancel_work_sync would never return because it is waiting for the worker to finish.
* iterating over the neighbor list for the to-be-deactivated interface is currently done using the RCU specific methods. Which means that it is possible to miss items when iterating over it without the associated spinlock - a behaviour which is acceptable for a periodic metric check but not for a cleanup routine (which must "stop" all still running workers)
The better approch is to get rid of the per interface neighbor metric worker and handle everything in the interface worker. The original problems are solved by:
* creating a list of neighbors which require new metric information inside the RCU protected context, gathering the metric according to the new list outside the RCU protected context
* only use rcu_trylock inside metric gathering code to avoid a deadlock when the cancel_delayed_work_sync is called in the interface removal code (which is called with the rtnl_lock held)
net/batman-adv/bat_v.c +0 -2
@@ -113,8 +113,6 @@ static void batadv_v_hardif_neigh_init(struct batadv_hardif_neigh_node *hardif_neigh) {ewma_throughput_init (&hardif_neigh->bat_v.throughput); -INIT_WORK (&hardif_neigh->bat_v.metric_work, - batadv_v_elp_throughput_metric_update); }/**
net/batman-adv/bat_v_elp.c +48 -23
143 lines not on this page · raw message
net/batman-adv/bat_v_elp.h +0 -2
@@ -10,7 +10,6 @@#include "main.h" #include <linux/skbuff.h> -#include <linux/workqueue.h> int batadv_v_elp_iface_enable (struct batadv_hard_iface *hard_iface);void batadv_v_elp_iface_disable (struct batadv_hard_iface *hard_iface);
@@ -19,6 +18,5 @@ void batadv_v_elp_iface_activate(struct batadv_hard_iface *primary_iface,void batadv_v_elp_primary_iface_set (struct batadv_hard_iface *primary_iface);int batadv_v_elp_packet_recv (struct sk_buff *skb,struct batadv_hard_iface *if_incoming); -void batadv_v_elp_throughput_metric_update (struct work_struct *work);#endif /* _NET_BATMAN_ADV_BAT_V_ELP_H_ */
net/batman-adv/types.h +0 -3
@@ -596,9 +596,6 @@ struct batadv_hardif_neigh_node_bat_v {* neighbor */ unsigned long last_unicast_tx; - -/** @metric_work: work queue callback item for metric update */ -struct work_struct metric_work; };/**
Sven Eckelmann
maintainerPATCH 1/1 batman-adv: Drop unmanaged ELP metric worker
commit 8c8ecc98f5c65947b0070a24bac11e12e47cc65d upstream.
The ELP worker needs to calculate new metric values for all neighbors "reachable" over an interface. Some of the used metric sources require locks which might need to sleep. This sleep is incompatible with the RCU list iterator used for the recorded neighbors. The initial approach to work around of this problem was to queue another work item per neighbor and then run this in a new context.
Even when this solved the RCU vs might_sleep() conflict, it has a major
problems: Nothing was stopping the work item in case it is not needed anymore - for example because one of the related interfaces was removed or the batman-adv module was unloaded - resulting in potential invalid memory accesses.
Directly canceling the metric worker also has various problems:
* cancel_work_sync for a to-be-deactivated interface is called with rtnl_lock held. But the code in the ELP metric worker also tries to use rtnl_lock() - which will never return in this case. This also means that cancel_work_sync would never return because it is waiting for the worker to finish.
* iterating over the neighbor list for the to-be-deactivated interface is currently done using the RCU specific methods. Which means that it is possible to miss items when iterating over it without the associated spinlock - a behaviour which is acceptable for a periodic metric check but not for a cleanup routine (which must "stop" all still running workers)
The better approch is to get rid of the per interface neighbor metric worker and handle everything in the interface worker. The original problems are solved by:
* creating a list of neighbors which require new metric information inside the RCU protected context, gathering the metric according to the new list outside the RCU protected context
* only use rcu_trylock inside metric gathering code to avoid a deadlock when the cancel_delayed_work_sync is called in the interface removal code (which is called with the rtnl_lock held)
--- net/batman-adv/bat_v.c | 2 -- net/batman-adv/bat_v_elp.c | 74 +++++++++++++++++++++++++------------- net/batman-adv/bat_v_elp.h | 2 -- net/batman-adv/types.h | 3 -- 4 files changed, 50 insertions(+), 31 deletions(-)
net/batman-adv/bat_v.c +0 -2
@@ -115,8 +115,6 @@ static void batadv_v_hardif_neigh_init(struct batadv_hardif_neigh_node *hardif_neigh) {ewma_throughput_init (&hardif_neigh->bat_v.throughput); -INIT_WORK (&hardif_neigh->bat_v.metric_work, - batadv_v_elp_throughput_metric_update); }#ifdef CONFIG_BATMAN_ADV_DEBUGFS
net/batman-adv/bat_v_elp.c +50 -24
146 lines not on this page · raw message
net/batman-adv/bat_v_elp.h +0 -2
@@ -10,7 +10,6 @@#include "main.h" #include <linux/skbuff.h> -#include <linux/workqueue.h> int batadv_v_elp_iface_enable (struct batadv_hard_iface *hard_iface);void batadv_v_elp_iface_disable (struct batadv_hard_iface *hard_iface);
@@ -19,6 +18,5 @@ void batadv_v_elp_iface_activate(struct batadv_hard_iface *primary_iface,void batadv_v_elp_primary_iface_set (struct batadv_hard_iface *primary_iface);int batadv_v_elp_packet_recv (struct sk_buff *skb,struct batadv_hard_iface *if_incoming); -void batadv_v_elp_throughput_metric_update (struct work_struct *work);#endif /* _NET_BATMAN_ADV_BAT_V_ELP_H_ */
net/batman-adv/types.h +0 -3
@@ -606,9 +606,6 @@ struct batadv_hardif_neigh_node_bat_v {* neighbor */ unsigned long last_unicast_tx; - -/** @metric_work: work queue callback item for metric update */ -struct work_struct metric_work; };/**
Signature · 1 line
2.39.5
Sasha Levin
maintainerRe: [PATCH 5.10.y] batman-adv: Drop unmanaged ELP metric worker
[ Sasha's backport helper bot ]
Hi,
Summary of potential issues:
❌ Build failures detected
The upstream commit SHA1 provided is correct: 8c8ecc98f5c65947b0070a24bac11e12e47cc65d
Status in newer kernel trees:
6.13.y | Present (different SHA1: 7350aafa40a7) 6.12.y | Present (different SHA1: c09f874f226b) 6.6.y | Present (different SHA1: c8db60b2a7fd) 6.1.y | Present (different SHA1: 831dda93b13c) 5.15.y | Present (different SHA1: 72203462f255) 5.4.y | Not found
Note: The patch differs from the upstream commit:
---
Failed to apply patch cleanly.
---
Results of testing on various branches:
| Branch | Patch Apply | Build Test | |---------------------------|-------------|------------| | stable/linux-5.10.y | Failed | N/A |
Build Errors:
Patch failed to apply on stable/linux-5.10.y. Reject:
diff a/net/batman-adv/bat_v_elp.c b/net/batman-adv/bat_v_elp.c (rejected hunks)
@@ -176,31 +198,19 @@ static bool batadv_v_elp_get_throughput(struct batadv_hardif_neigh_node *neigh,
/**
* batadv_v_elp_throughput_metric_update() - worker updating the throughput
* metric of a single hop neighbour
- * @work: the work queue item
+ * @neigh: the neighbour to probe
*/
-void batadv_v_elp_throughput_metric_update(struct work_struct *work)
+static void
+batadv_v_elp_throughput_metric_update(struct batadv_hardif_neigh_node *neigh)
{
- struct batadv_hardif_neigh_node_bat_v *neigh_bat_v;
- struct batadv_hardif_neigh_node *neigh;
u32 throughput;
bool valid;
- neigh_bat_v = container_of(work, struct batadv_hardif_neigh_node_bat_v,
- metric_work);
- neigh = container_of(neigh_bat_v, struct batadv_hardif_neigh_node,
- bat_v);
-
valid = batadv_v_elp_get_throughput(neigh, &throughput); if (!valid)
- goto put_neigh;
+ return;
ewma_throughput_add(&neigh->bat_v.throughput, throughput);
-
-put_neigh:
- /* decrement refcounter to balance increment performed before scheduling
- * this task
- */
- batadv_hardif_neigh_put(neigh);
}
/**
Sven Eckelmann
maintainerRe: [PATCH 5.10.y] batman-adv: Drop unmanaged ELP metric worker
Quoted 18 lines · On Wednesday, 19 February 2025 23:09:58 GMT+1 Sasha Levin wrote:
[ Sasha's backport helper bot ]
Hi,
Summary of potential issues:
❌ Build failures detectedThe upstream commit SHA1 provided is correct:
8c8ecc98f5c65947b0070a24bac11e12e47cc65dStatus in newer kernel trees:
6.13.y | Present (different SHA1:7350aafa40a7) 6.12.y | Present (different SHA1:c09f874f226b) 6.6.y | Present (different SHA1:c8db60b2a7fd) 6.1.y | Present (different SHA1:831dda93b13c) 5.15.y | Present (different SHA1:72203462f255) 5.4.y | Not found
Quoted 3 lines
Note: The patch differs from the upstream commit:
---
Failed to apply patch cleanly.
Was this patch applied with or without the already queued up patches from
https://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git/tree/queue-5.10 ? They are required for this patch to apply correctly.
Kind regards,
Sven
Sven Eckelmann
maintainerRe: [PATCH 5.10.y] batman-adv: Drop unmanaged ELP metric worker
Quoted 19 lines · On Wednesday, 19 February 2025 23:38:33 CET Sven Eckelmann wrote:
Quoted 18 lines · On Wednesday, 19 February 2025 23:09:58 GMT+1 Sasha Levin wrote:
[ Sasha's backport helper bot ]
Hi,
Summary of potential issues:
❌ Build failures detectedThe upstream commit SHA1 provided is correct:
8c8ecc98f5c65947b0070a24bac11e12e47cc65dStatus in newer kernel trees:
6.13.y | Present (different SHA1:7350aafa40a7) 6.12.y | Present (different SHA1:c09f874f226b) 6.6.y | Present (different SHA1:c8db60b2a7fd) 6.1.y | Present (different SHA1:831dda93b13c) 5.15.y | Present (different SHA1:72203462f255) 5.4.y | Not found
Quoted 8 lines
Quoted 3 lines
Note: The patch differs from the upstream commit:
---
Failed to apply patch cleanly.Was this patch applied with or without the already queued up patches from
https://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git/tree/queue-5.10 ? They are required for this patch to apply correctly.
Ok, now it will definitely fail because you've added your own backport..
Kind regards,
Sven
Sasha Levin
maintainerRe: [PATCH 5.10.y] batman-adv: Drop unmanaged ELP metric worker
Quoted 25 lines · Sven Eckelmann
Quoted 24 lines · On Wednesday, 19 February 2025 23:38:33 CET Sven Eckelmann wrote:
Quoted 21 lines · On Wednesday, 19 February 2025 23:09:58 GMT+1 Sasha Levin wrote:
[ Sasha's backport helper bot ]
Hi,
Summary of potential issues:
❌ Build failures detectedThe upstream commit SHA1 provided is correct:
8c8ecc98f5c65947b0070a24bac11e12e47cc65dStatus in newer kernel trees:
6.13.y | Present (different SHA1:7350aafa40a7) 6.12.y | Present (different SHA1:c09f874f226b) 6.6.y | Present (different SHA1:c8db60b2a7fd) 6.1.y | Present (different SHA1:831dda93b13c) 5.15.y | Present (different SHA1:72203462f255) 5.4.y | Not foundNote: The patch differs from the upstream commit:
---
Failed to apply patch cleanly.
Quoted 5 lines
Quoted 3 lines
Was this patch applied with or without the already queued up patches from
https://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git/tree/queue-5.10 ? They are required for this patch to apply correctly.Ok, now it will definitely fail because you've added your own backport..
Ah, sorry, the bot only tests against "vanilla" -stable releases.
I had a backport queued up which brought in a dependency rather than changing the original commit, does it make sense in this case? I think it'll make future backports easier.
Signature · 2 lines
Thanks, Sasha
Sven Eckelmann
maintainerRe: [PATCH 5.10.y] batman-adv: Drop unmanaged ELP metric worker
Quoted 5 lines · On Friday, 21 February 2025 21:05:42 GMT+1 Sasha Levin wrote:
Ah, sorry, the bot only tests against "vanilla" -stable releases.
I had a backport queued up which brought in a dependency rather than changing the original commit, does it make sense in this case? I think it'll make future backports easier.
The imported changes by you are minimal and should be fine. Thank you for your backporting efforts.
Kind regards,
Sven