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 --- v2: use cpumask_of()
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index b22417167cac..ec63452187d0 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -3667,7 +3667,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; @@ -3796,9 +3795,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 */ @@ -3821,9 +3819,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;
-----Original Message----- From: Qingfang Deng dqfext@gmail.com Sent: Monday, March 17, 2025 8:24 PM To: Andrew Lunn andrew+netdev@lunn.ch; David S. Miller davem@davemloft.net; Dumazet, Eric edumazet@google.com; Jakub Kicinski kuba@kernel.org; Paolo Abeni pabeni@redhat.com; Maxime Coquelin mcoquelin.stm32@gmail.com; Alexandre Torgue alexandre.torgue@foss.st.com; Ong, Boon Leong boon.leong.ong@intel.com; netdev@vger.kernel.org; linux-stm32@st-md- mailman.stormreply.com; linux-arm-kernel@lists.infradead.org; linux- kernel@vger.kernel.org Cc: stable@vger.kernel.org Subject: [PATCH net v2] net: stmmac: Fix accessing freed irq affinity_hint
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
v2: use cpumask_of()
Reviewed-by: Jacob Keller jacob.e.keller@intel.com
On Tue, 18 Mar 2025 11:24:23 +0800 Qingfang Deng wrote:
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()));
This does fix the bug you're targeting, but FWIW num_online_cpus() is not great in general. The online CPU mask can be sparse. You may want to look into finding 'nth' online CPU instead of the naive modulo as a follow up.
Hello:
This patch was applied to netdev/net.git (main) by Jakub Kicinski kuba@kernel.org:
On Tue, 18 Mar 2025 11:24:23 +0800 you wrote:
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
[...]
Here is the summary with links: - [net,v2] net: stmmac: Fix accessing freed irq affinity_hint https://git.kernel.org/netdev/net/c/c60d101a226f
You are awesome, thank you!
linux-stable-mirror@lists.linaro.org