]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: stmmac: Fix accessing freed irq affinity_hint
authorQingfang Deng <dqfext@gmail.com>
Tue, 18 Mar 2025 03:24:23 +0000 (11:24 +0800)
committerJakub Kicinski <kuba@kernel.org>
Mon, 24 Mar 2025 18:32:20 +0000 (11:32 -0700)
The cpumask should not be a local variable, since its pointer is saved
to irq_desc and may be accessed from procfs.
To fix it, use the persistent mask cpumask_of(cpu#).

Cc: stable@vger.kernel.org
Fixes: 8deec94c6040 ("net: stmmac: set IRQ affinity hint for multi MSI vectors")
Signed-off-by: Qingfang Deng <dqfext@gmail.com>
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Link: https://patch.msgid.link/20250318032424.112067-1-dqfext@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

index c0ae7db96f46ffc21279d273911a668b23f9c35f..b7c3bfdaa1802b1b7fdc75bef5daef9e0a426f9b 100644 (file)
@@ -3640,7 +3640,6 @@ static int stmmac_request_irq_multi_msi(struct net_device *dev)
 {
        struct stmmac_priv *priv = netdev_priv(dev);
        enum request_irq_err irq_err;
-       cpumask_t cpu_mask;
        int irq_idx = 0;
        char *int_name;
        int ret;
@@ -3769,9 +3768,8 @@ static int stmmac_request_irq_multi_msi(struct net_device *dev)
                        irq_idx = i;
                        goto irq_error;
                }
-               cpumask_clear(&cpu_mask);
-               cpumask_set_cpu(i % num_online_cpus(), &cpu_mask);
-               irq_set_affinity_hint(priv->rx_irq[i], &cpu_mask);
+               irq_set_affinity_hint(priv->rx_irq[i],
+                                     cpumask_of(i % num_online_cpus()));
        }
 
        /* Request Tx MSI irq */
@@ -3794,9 +3792,8 @@ static int stmmac_request_irq_multi_msi(struct net_device *dev)
                        irq_idx = i;
                        goto irq_error;
                }
-               cpumask_clear(&cpu_mask);
-               cpumask_set_cpu(i % num_online_cpus(), &cpu_mask);
-               irq_set_affinity_hint(priv->tx_irq[i], &cpu_mask);
+               irq_set_affinity_hint(priv->tx_irq[i],
+                                     cpumask_of(i % num_online_cpus()));
        }
 
        return 0;