]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: airoha: Delay offloading until all net_devices are fully registered
authorLorenzo Bianconi <lorenzo@kernel.org>
Sun, 29 Mar 2026 10:32:27 +0000 (12:32 +0200)
committerJakub Kicinski <kuba@kernel.org>
Tue, 31 Mar 2026 00:58:40 +0000 (17:58 -0700)
Netfilter flowtable can theoretically try to offload flower rules as soon
as a net_device is registered while all the other ones are not
registered or initialized, triggering a possible NULL pointer dereferencing
of qdma pointer in airoha_ppe_set_cpu_port routine. Moreover, if
register_netdev() fails for a particular net_device, there is a small
race if Netfilter tries to offload flowtable rules before all the
net_devices are properly unregistered in airoha_probe() error patch,
triggering a NULL pointer dereferencing in airoha_ppe_set_cpu_port
routine. In order to avoid any possible race, delay offloading until
all net_devices are registered in the networking subsystem.

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Link: https://patch.msgid.link/20260329-airoha-regiser-race-fix-v2-1-f4ebb139277b@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/airoha/airoha_eth.c
drivers/net/ethernet/airoha/airoha_eth.h
drivers/net/ethernet/airoha/airoha_ppe.c

index c2a54dbcbb0d576da298f2a36a354afaef89b240..95ba99b89428e4cafb91ff7813e43ffeb38e6d9b 100644 (file)
@@ -2962,6 +2962,8 @@ static int airoha_register_gdm_devices(struct airoha_eth *eth)
                        return err;
        }
 
+       set_bit(DEV_STATE_REGISTERED, &eth->state);
+
        return 0;
 }
 
index 20e602d61e615e0cf73ac7125bee85ff98986229..a97903569335ff119891a4867c094ce982b24754 100644 (file)
@@ -88,6 +88,7 @@ enum {
 
 enum {
        DEV_STATE_INITIALIZED,
+       DEV_STATE_REGISTERED,
 };
 
 enum {
index 5724f8f2defd51fd40a81a40491ce9db3119451e..c2c32b6833df94031101913807147a7a04343bad 100644 (file)
@@ -1368,6 +1368,13 @@ int airoha_ppe_setup_tc_block_cb(struct airoha_ppe_dev *dev, void *type_data)
        struct airoha_eth *eth = ppe->eth;
        int err = 0;
 
+       /* Netfilter flowtable can try to offload flower rules while not all
+        * the net_devices are registered or initialized. Delay offloading
+        * until all net_devices are registered in the system.
+        */
+       if (!test_bit(DEV_STATE_REGISTERED, &eth->state))
+               return -EBUSY;
+
        mutex_lock(&flow_offload_mutex);
 
        if (!eth->npu)