]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: hold netdev instance lock during nft ndo_setup_tc
authorStanislav Fomichev <sdf@fomichev.me>
Wed, 5 Mar 2025 16:37:20 +0000 (08:37 -0800)
committerJakub Kicinski <kuba@kernel.org>
Thu, 6 Mar 2025 20:59:43 +0000 (12:59 -0800)
Introduce new dev_setup_tc for nft ndo_setup_tc paths.

Reviewed-by: Eric Dumazet <edumazet@google.com>
Cc: Saeed Mahameed <saeed@kernel.org>
Signed-off-by: Stanislav Fomichev <sdf@fomichev.me>
Link: https://patch.msgid.link/20250305163732.2766420-3-sdf@fomichev.me
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/intel/iavf/iavf_main.c
include/linux/netdevice.h
net/core/dev.c
net/netfilter/nf_flow_table_offload.c
net/netfilter/nf_tables_offload.c

index 9f4d223dffcfb5efa0e3a47308367069e2e06cfe..032e1a58af6f11d2dfef270fb2d2451ce9282bf8 100644 (file)
@@ -3894,10 +3894,8 @@ exit:
        if (test_bit(__IAVF_IN_REMOVE_TASK, &adapter->crit_section))
                return 0;
 
-       netdev_lock(netdev);
        netif_set_real_num_rx_queues(netdev, total_qps);
        netif_set_real_num_tx_queues(netdev, total_qps);
-       netdev_unlock(netdev);
 
        return ret;
 }
index 33066b155c842646fb15bb7977cb3f16569a89fd..69951eeb96d26dd9764fde45c42c59322d969eb7 100644 (file)
@@ -3353,6 +3353,8 @@ int dev_alloc_name(struct net_device *dev, const char *name);
 int dev_open(struct net_device *dev, struct netlink_ext_ack *extack);
 void dev_close(struct net_device *dev);
 void dev_close_many(struct list_head *head, bool unlink);
+int dev_setup_tc(struct net_device *dev, enum tc_setup_type type,
+                void *type_data);
 void dev_disable_lro(struct net_device *dev);
 int dev_loopback_xmit(struct net *net, struct sock *sk, struct sk_buff *newskb);
 u16 dev_pick_tx_zero(struct net_device *dev, struct sk_buff *skb,
index 7a327c782ea46a4419df7029b2c65059f8a34b56..57af25683ea1b8dcf1feadd225688dd9614ed62a 100644 (file)
@@ -1786,6 +1786,24 @@ void dev_close(struct net_device *dev)
 }
 EXPORT_SYMBOL(dev_close);
 
+int dev_setup_tc(struct net_device *dev, enum tc_setup_type type,
+                void *type_data)
+{
+       const struct net_device_ops *ops = dev->netdev_ops;
+       int ret;
+
+       ASSERT_RTNL();
+
+       if (!ops->ndo_setup_tc)
+               return -EOPNOTSUPP;
+
+       netdev_lock_ops(dev);
+       ret = ops->ndo_setup_tc(dev, type, type_data);
+       netdev_unlock_ops(dev);
+
+       return ret;
+}
+EXPORT_SYMBOL(dev_setup_tc);
 
 /**
  *     dev_disable_lro - disable Large Receive Offload on a device
index e06bc36f49fe74e89c4074eb8b32409bc7035e8c..0ec4abded10decba4fed9c09a5aaf66275a5e0b9 100644 (file)
@@ -1175,7 +1175,7 @@ static int nf_flow_table_offload_cmd(struct flow_block_offload *bo,
        nf_flow_table_block_offload_init(bo, dev_net(dev), cmd, flowtable,
                                         extack);
        down_write(&flowtable->flow_block_lock);
-       err = dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_FT, bo);
+       err = dev_setup_tc(dev, TC_SETUP_FT, bo);
        up_write(&flowtable->flow_block_lock);
        if (err < 0)
                return err;
index 64675f1c7f2953d31a7cf48be721f752f45211a9..b761899c143cd26d62244308060fdc130761ce6e 100644 (file)
@@ -390,7 +390,7 @@ static int nft_block_offload_cmd(struct nft_base_chain *chain,
 
        nft_flow_block_offload_init(&bo, dev_net(dev), cmd, chain, &extack);
 
-       err = dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_BLOCK, &bo);
+       err = dev_setup_tc(dev, TC_SETUP_BLOCK, &bo);
        if (err < 0)
                return err;