FAILED: patch "[PATCH] net: expect instance lock in netdev_queue_get_dma_dev()" failed to apply to 7.1-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 7.1-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-7.1.y
git checkout FETCH_HEAD
git cherry-pick -x 92465f46f3c3a92e4758af20d2363b7adc43e1f5
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026081708-gracious-yard-1b78@gregkh' --subject-prefix 'PATCH 7.1.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 92465f46f3c3a92e4758af20d2363b7adc43e1f5 Mon Sep 17 00:00:00 2001
From: Jakub Kicinski <[email protected]>
Date: Thu, 6 Aug 2026 15:56:26 -0700
Subject: [PATCH] net: expect instance lock in netdev_queue_get_dma_dev()
netdev_queue_get_dma_dev() uses "compat" locking assert which wants either the rtnl_lock or netdev instance lock. This is not right, the callers are taking the instance lock unconditionally. All entry points for queue config are purely instance locked.
In other words the callers use netdev_get_by_index_lock(), not netdev_get_by_index_lock_ops_compat(). All the state we will access is effectively instance lock protected (it's const for devices which are not ops-locked).
Update the assert to avoid false positive warnings.
net/core/netdev_queues.c +1 -1
@@ -40,7 +40,7 @@ struct device *netdev_queue_get_dma_dev(struct net_device *dev,struct netdev_rx_queue *hw_rxq;struct device *dma_dev; -netdev_assert_locked_ops_compat (dev); +netdev_assert_locked (dev);/* Only RX side supports queue leasing today. */ if (type !=NETDEV_QUEUE_TYPE_RX || !netif_rxq_is_leased (dev, idx))
Sasha Levin
maintainerPATCH 1/2 net: rename netdev_ops_assert_locked()
From: Jakub Kicinski <[email protected]>
[ Upstream commit 251bc9db88fb351ea2dfbd976c4e6aaae6507a91 ]
Jakub suggests renaming the existing assert to match the netdev_lock_ops_compat() semantics.
We want netdev_assert_locked_ops() to mean - if the driver is ops locked - check that it's holding the device lock.
The existing helper check for either ops lock or rtnl_lock, which is the locking behavior of netdev_lock_ops_compat().
The reason for naming divergence is likely that netdev_ops_assert_locked() predated the _compat() helpers.
Stable-dep-of: 92465f46f3c3 ("net: expect instance lock in netdev_queue_get_dma_dev()")
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 +- include/net/netdev_lock.h | 6 +++--- net/core/dev.c | 26 +++++++++++------------ net/core/dev_addr_lists.c | 2 +- net/core/link_watch.c | 2 +- net/core/lock_debug.c | 2 +- net/core/netdev_queues.c | 2 +- net/ethtool/netlink.c | 4 ++-- net/ipv6/addrconf.c | 2 +- net/xdp/xsk_buff_pool.c | 2 +- 10 files changed, 25 insertions(+), 25 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +1 -1
@@ -16854,7 +16854,7 @@ int bnxt_restore_pf_fw_resources(struct bnxt *bp) {int rc; -netdev_ops_assert_locked (bp->dev); +netdev_assert_locked_ops_compat (bp->dev);bnxt_hwrm_func_qcaps (bp);if (netif_running (bp->dev))
include/net/netdev_lock.h +3 -3
@@ -64,7 +64,7 @@ static inline void netdev_unlock_full_to_ops(struct net_device *dev)netdev_unlock (dev); } -static inline void netdev_ops_assert_locked (const struct net_device *dev) +static inline void netdev_assert_locked_ops_compat (const struct net_device *dev) {if (netdev_need_ops_lock (dev))lockdep_assert_held (&dev->lock);
@@ -73,11 +73,11 @@ static inline void netdev_ops_assert_locked(const struct net_device *dev) }static inline void -netdev_ops_assert_locked_or_invisible (const struct net_device *dev) +netdev_assert_locked_ops_compat_or_invisible (const struct net_device *dev) {if (dev->reg_state ==NETREG_REGISTERED || dev->reg_state ==NETREG_UNREGISTERING ) -netdev_ops_assert_locked (dev); +netdev_assert_locked_ops_compat (dev); }static inline void netdev_lock_ops_compat (struct net_device *dev)
net/core/dev.c +13 -13
@@ -1593,7 +1593,7 @@ EXPORT_SYMBOL(netdev_features_change);void netif_state_change (struct net_device *dev) { -netdev_ops_assert_locked_or_invisible (dev); +netdev_assert_locked_ops_compat_or_invisible (dev);if (dev->flags &IFF_UP ) { struct netdev_notifier_change_info change_info = {
@@ -1693,7 +1693,7 @@ static int __dev_open(struct net_device *dev, struct netlink_ext_ack *extack)set_bit (__LINK_STATE_START, &dev->state); -netdev_ops_assert_locked (dev); +netdev_assert_locked_ops_compat (dev);if (ops->ndo_validate_addr) ret = ops->ndo_validate_addr (dev);
@@ -1770,7 +1770,7 @@ static void __dev_close_many(struct list_head *head)* event. */ -netdev_ops_assert_locked (dev); +netdev_assert_locked_ops_compat (dev);if (ops->ndo_stop) ops->ndo_stop (dev);
@@ -3198,7 +3198,7 @@ int netif_set_real_num_tx_queues(struct net_device *dev, unsigned int txq)if (dev->reg_state ==NETREG_REGISTERED || dev->reg_state ==NETREG_UNREGISTERING ) { -netdev_ops_assert_locked (dev); +netdev_assert_locked_ops_compat (dev); rc =netdev_queue_update_kobjects (dev, dev->real_num_tx_queues, txq);
@@ -3247,7 +3247,7 @@ int netif_set_real_num_rx_queues(struct net_device *dev, unsigned int rxq)return -EINVAL ;if (dev->reg_state ==NETREG_REGISTERED ) { -netdev_ops_assert_locked (dev); +netdev_assert_locked_ops_compat (dev); rc =net_rx_queue_update_kobjects (dev, dev->real_num_rx_queues, rxq);
@@ -7313,7 +7313,7 @@ void netif_queue_set_napi(struct net_device *dev, unsigned int queue_index,if (WARN_ON_ONCE (napi && !napi->dev))return ; -netdev_ops_assert_locked_or_invisible (dev); +netdev_assert_locked_ops_compat_or_invisible (dev);switch (type) {case NETDEV_QUEUE_TYPE_RX :
@@ -9608,7 +9608,7 @@ int __dev_set_promiscuity(struct net_device *dev, int inc, bool notify)kuid_t uid;kgid_t gid; -netdev_ops_assert_locked (dev); +netdev_assert_locked_ops_compat (dev); promiscuity = dev->promiscuity + inc;if (promiscuity ==0 ) {
@@ -9667,7 +9667,7 @@ int netif_set_allmulti(struct net_device *dev, int inc, bool notify)unsigned int old_flags = dev->flags, old_gflags = dev->gflags;unsigned int allmulti, flags; -netdev_ops_assert_locked (dev); +netdev_assert_locked_ops_compat (dev); allmulti = dev->allmulti + inc;if (allmulti ==0 ) {
@@ -9735,7 +9735,7 @@ int __dev_change_flags(struct net_device *dev, unsigned int flags,unsigned int old_flags = dev->flags;int ret; -netdev_ops_assert_locked (dev); +netdev_assert_locked_ops_compat (dev);/* * Set the flags on our device.
@@ -9883,7 +9883,7 @@ int netif_set_mtu_ext(struct net_device *dev, int new_mtu, {int err, orig_mtu; -netdev_ops_assert_locked (dev); +netdev_assert_locked_ops_compat (dev);if (new_mtu == dev->mtu)return 0 ;
@@ -10317,7 +10317,7 @@ static int dev_xdp_install(struct net_device *dev, enum bpf_xdp_mode mode,struct netdev_bpf xdp;int err; -netdev_ops_assert_locked (dev); +netdev_assert_locked_ops_compat (dev);if (dev->cfg->hds_config ==ETHTOOL_TCP_DATA_SPLIT_ENABLED && prog && !prog->aux->xdp_has_frags) {
@@ -10769,7 +10769,7 @@ u32 dev_get_min_mp_channel_count(const struct net_device *dev) {int i; -netdev_ops_assert_locked (dev); +netdev_assert_locked_ops_compat (dev);for (i = dev->real_num_rx_queues -1 ; i >=0 ; i--)if (dev->_rx[i].mp_params.mp_priv)
@@ -10997,7 +10997,7 @@ int __netdev_update_features(struct net_device *dev)int err =-1 ;ASSERT_RTNL (); -netdev_ops_assert_locked (dev); +netdev_assert_locked_ops_compat (dev); features =netdev_get_wanted_features (dev);
net/core/dev_addr_lists.c +1 -1
@@ -1260,7 +1260,7 @@ static void netif_rx_mode_run(struct net_device *dev)int err;might_sleep (); -netdev_ops_assert_locked (dev); +netdev_assert_locked_ops_compat (dev);__hw_addr_init (&uc_snap);__hw_addr_init (&mc_snap);
net/core/link_watch.c +1 -1
@@ -277,7 +277,7 @@ static bool linkwatch_clean_dev(struct net_device *dev)void __linkwatch_sync_dev (struct net_device *dev) { -netdev_ops_assert_locked (dev); +netdev_assert_locked_ops_compat (dev);if (linkwatch_clean_dev (dev)) {linkwatch_do_dev (dev);
net/core/lock_debug.c +1 -1
@@ -24,7 +24,7 @@ int netdev_debug_event(struct notifier_block *nb, unsigned long event,case NETDEV_CHANGE :case NETDEV_REGISTER :case NETDEV_UP : -netdev_ops_assert_locked (dev); +netdev_assert_locked_ops_compat (dev); fallthrough;case NETDEV_DOWN :case NETDEV_REBOOT :
net/core/netdev_queues.c +1 -1
@@ -40,7 +40,7 @@ struct device *netdev_queue_get_dma_dev(struct net_device *dev,struct netdev_rx_queue *hw_rxq;struct device *dma_dev; -netdev_ops_assert_locked (dev); +netdev_assert_locked_ops_compat (dev);/* Only RX side supports queue leasing today. */ if (type !=NETDEV_QUEUE_TYPE_RX || !netif_rxq_is_leased (dev, idx))
net/ethtool/netlink.c +2 -2
@@ -98,7 +98,7 @@ int ethnl_ops_begin(struct net_device *dev)if (dev->dev.parent)pm_runtime_get_sync (dev->dev.parent); -netdev_ops_assert_locked (dev); +netdev_assert_locked_ops_compat (dev);if (!netif_device_present (dev) || dev->reg_state >=NETREG_UNREGISTERING ) {
@@ -1003,7 +1003,7 @@ static void ethnl_default_notify(struct net_device *dev, unsigned int cmd, ops->req_info_size - sizeof(*req_info)); } -netdev_ops_assert_locked (dev); +netdev_assert_locked_ops_compat (dev);ethnl_init_reply_data (reply_data, ops, dev); ret = ops->prepare_data (req_info, reply_data, &info);
net/ipv6/addrconf.c +1 -1
@@ -380,7 +380,7 @@ static struct inet6_dev *ipv6_add_dev(struct net_device *dev)int err = -ENOMEM ;ASSERT_RTNL (); -netdev_ops_assert_locked (dev); +netdev_assert_locked_ops_compat (dev);if (dev->mtu <IPV6_MIN_MTU && dev != blackhole_netdev)return ERR_PTR (-EINVAL );
net/xdp/xsk_buff_pool.c +1 -1
@@ -244,7 +244,7 @@ int xp_assign_dev(struct xsk_buff_pool *pool, bpf.xsk.pool = pool; bpf.xsk.queue_id = queue_id; -netdev_ops_assert_locked (netdev); +netdev_assert_locked_ops_compat (netdev); err = netdev->netdev_ops->ndo_bpf (netdev, &bpf);if (err) goto err_unreg_pool;
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/2 net: expect instance lock in netdev_queue_get_dma_dev()
From: Jakub Kicinski <[email protected]>
[ Upstream commit 92465f46f3c3a92e4758af20d2363b7adc43e1f5 ]
netdev_queue_get_dma_dev() uses "compat" locking assert which wants either the rtnl_lock or netdev instance lock. This is not right, the callers are taking the instance lock unconditionally. All entry points for queue config are purely instance locked.
In other words the callers use netdev_get_by_index_lock(), not netdev_get_by_index_lock_ops_compat(). All the state we will access is effectively instance lock protected (it's const for devices which are not ops-locked).
Update the assert to avoid false positive warnings.
--- net/core/netdev_queues.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/core/netdev_queues.c +1 -1
@@ -40,7 +40,7 @@ struct device *netdev_queue_get_dma_dev(struct net_device *dev,struct netdev_rx_queue *hw_rxq;struct device *dma_dev; -netdev_assert_locked_ops_compat (dev); +netdev_assert_locked (dev);/* Only RX side supports queue leasing today. */ if (type !=NETDEV_QUEUE_TYPE_RX || !netif_rxq_is_leased (dev, idx))
Signature · 1 line
2.53.0