mirror of
https://github.com/torvalds/linux.git
synced 2026-05-12 16:18:45 +02:00
Here is a batman-adv bugfix:
- Avoid double-rtnl_lock ELP metric worker, by Sven Eckelmann -----BEGIN PGP SIGNATURE----- iQJKBAABCgA0FiEE1ilQI7G+y+fdhnrfoSvjmEKSnqEFAmmes84WHHN3QHNpbW9u d3VuZGVybGljaC5kZQAKCRChK+OYQpKeoSxDD/wI/ssEvqmay/4okfp6Fk/+hjLi 2BvCLwKei8JKqsnNvUSW7I+inrp0AilwfUuMqQlIiOdz6zJ6O4s4SXdiwl8TH49p uVp4dSwoOPHzBKaPH+dU15fcLD4yBqRYnl6gyxem7hWtsDU04fn96se7lagUdJc/ 35LZ2ni9cRmxgmvcLECNGOj4Tm7TxbcG0wkifS/rIO7gd05rXb7c7T1lCGRPeBf4 2i4RVQXwSEVhff1ig7yU/1gs2FUzIKnrlKHayyfYkynEI37Ggc4IBiqLkdyBuxJ4 Z+qlCfumrtdrt79kirzezrcWEzQEj5Yn3fnXj0X27QYy5FJVKnLczHnGuLUSUqzl QgwvQ87tNwEmz50ODsq+TFY9GuowWJ5yLTMFb18u/5hJrAGvux5wU+mIbloTOpBg M/kMv8kZIMNzVEirxbD08Ygx9Fsxu3UWGptDAunlv1GkHBj7XqA2Jkoq77eDfxx+ lIa0tu1s/y1eTb5tA9JXUn0BsoNrafDIY5zrjz+lDKYpmmeNUgiTbQBGuVCZ+t2o EWLYPxdV84QpwuoaXZ/ZkD0YVAx/sfDLptxaBGViWbThLGVYxYSELePO94Mkr6Os Fa/8gEg0Z+jNUZ3UfVVnjyjPaa5/BM2vtbwSQFgv1udJGLoa/AkWIcOEgkeZAzWc B5cubcmbSHx4mBCEuA== =Ng/2 -----END PGP SIGNATURE----- Merge tag 'batadv-net-pullrequest-20260225' of https://git.open-mesh.org/linux-merge Simon Wunderlich says: ==================== Here is a batman-adv bugfix: - Avoid double-rtnl_lock ELP metric worker, by Sven Eckelmann * tag 'batadv-net-pullrequest-20260225' of https://git.open-mesh.org/linux-merge: batman-adv: Avoid double-rtnl_lock ELP metric worker ==================== Link: https://patch.msgid.link/20260225084614.229077-1-sw@simonwunderlich.de Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
754a3d081a
|
|
@ -111,7 +111,15 @@ static bool batadv_v_elp_get_throughput(struct batadv_hardif_neigh_node *neigh,
|
|||
/* unsupported WiFi driver version */
|
||||
goto default_throughput;
|
||||
|
||||
real_netdev = batadv_get_real_netdev(hard_iface->net_dev);
|
||||
/* only use rtnl_trylock because the elp worker will be cancelled while
|
||||
* the rntl_lock is held. the cancel_delayed_work_sync() would otherwise
|
||||
* wait forever when the elp work_item was started and it is then also
|
||||
* trying to rtnl_lock
|
||||
*/
|
||||
if (!rtnl_trylock())
|
||||
return false;
|
||||
real_netdev = __batadv_get_real_netdev(hard_iface->net_dev);
|
||||
rtnl_unlock();
|
||||
if (!real_netdev)
|
||||
goto default_throughput;
|
||||
|
||||
|
|
|
|||
|
|
@ -204,7 +204,7 @@ static bool batadv_is_valid_iface(const struct net_device *net_dev)
|
|||
}
|
||||
|
||||
/**
|
||||
* batadv_get_real_netdevice() - check if the given netdev struct is a virtual
|
||||
* __batadv_get_real_netdev() - check if the given netdev struct is a virtual
|
||||
* interface on top of another 'real' interface
|
||||
* @netdev: the device to check
|
||||
*
|
||||
|
|
@ -214,7 +214,7 @@ static bool batadv_is_valid_iface(const struct net_device *net_dev)
|
|||
* Return: the 'real' net device or the original net device and NULL in case
|
||||
* of an error.
|
||||
*/
|
||||
static struct net_device *batadv_get_real_netdevice(struct net_device *netdev)
|
||||
struct net_device *__batadv_get_real_netdev(struct net_device *netdev)
|
||||
{
|
||||
struct batadv_hard_iface *hard_iface = NULL;
|
||||
struct net_device *real_netdev = NULL;
|
||||
|
|
@ -267,7 +267,7 @@ struct net_device *batadv_get_real_netdev(struct net_device *net_device)
|
|||
struct net_device *real_netdev;
|
||||
|
||||
rtnl_lock();
|
||||
real_netdev = batadv_get_real_netdevice(net_device);
|
||||
real_netdev = __batadv_get_real_netdev(net_device);
|
||||
rtnl_unlock();
|
||||
|
||||
return real_netdev;
|
||||
|
|
@ -336,7 +336,7 @@ static u32 batadv_wifi_flags_evaluate(struct net_device *net_device)
|
|||
if (batadv_is_cfg80211_netdev(net_device))
|
||||
wifi_flags |= BATADV_HARDIF_WIFI_CFG80211_DIRECT;
|
||||
|
||||
real_netdev = batadv_get_real_netdevice(net_device);
|
||||
real_netdev = __batadv_get_real_netdev(net_device);
|
||||
if (!real_netdev)
|
||||
return wifi_flags;
|
||||
|
||||
|
|
|
|||
|
|
@ -67,6 +67,7 @@ enum batadv_hard_if_bcast {
|
|||
|
||||
extern struct notifier_block batadv_hard_if_notifier;
|
||||
|
||||
struct net_device *__batadv_get_real_netdev(struct net_device *net_device);
|
||||
struct net_device *batadv_get_real_netdev(struct net_device *net_device);
|
||||
bool batadv_is_cfg80211_hardif(struct batadv_hard_iface *hard_iface);
|
||||
bool batadv_is_wifi_hardif(struct batadv_hard_iface *hard_iface);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user