From nobody Mon Sep 28 17:49:59 2026 Received: from mta-65-225.siemens.flowmailer.net (mta-65-225.siemens.flowmailer.net [185.136.65.225]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 428EE3B8D79 for ; Wed, 19 Aug 2026 14:30:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.136.65.225 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787149850; cv=none; b=EQ0/UqA12TbFlh6aOjkGGXj92Pqw0RuctaPYBEjMLyaTh6kZW9WVs1FJU+hDpHFPWB9YhQUd3fQIvfzG4U/MrEl0MOfWoKegvhgM8aEfbyncwkRaKAKrpwXFphRTW3etNgXbygRqWuCwShvF2++J1+ZD6bCisER5RxyE0hSk4LM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787149850; c=relaxed/simple; bh=4xhhR3bu1NVSWIwX5g40uWrKhyT+t13dMc6Cm+ZB6p0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Hpzgld6ZzT+JT+TZswjjhJNz23g9F2cdFvFMRg2/KNDtgQyogET8yFuONybA9nT/TZ6S3/I0du2ccLGwImydkqi3aav5JNOX49sAx8qGHAy0oPTE2YWOXYtOSlS6Ug1iRlCBxMNYi3PZjJk83w5nxDqbEmo6B1mSjio1PEzcDlA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=siemens.com; spf=pass smtp.mailfrom=rts-flowmailer.siemens.com; dkim=pass (2048-bit key) header.d=siemens.com header.i=florian.bezdeka@siemens.com header.b=QVtxtt6M; arc=none smtp.client-ip=185.136.65.225 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=siemens.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rts-flowmailer.siemens.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=siemens.com header.i=florian.bezdeka@siemens.com header.b="QVtxtt6M" Received: by mta-65-225.siemens.flowmailer.net with ESMTPSA id 20260819143033ad1f9d42670002071c for ; Wed, 19 Aug 2026 16:30:33 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=fm2; d=siemens.com; i=florian.bezdeka@siemens.com; h=Date:From:Subject:To:Message-ID:MIME-Version:Content-Type:Content-Transfer-Encoding:Cc:References:In-Reply-To; bh=Vvv1sBUaBjcEUFUZGnIymSGGot8dFYipkz2vCCdspeg=; b=QVtxtt6MaUFxp1ZH6eI+kErHX2u5GQOB9t6Xmhg/I+9OPexC3uPKmQZg0ZDD2Dk4ISPW6j oOMnQx18jh8IyucabgFrayd4vxBC9nHrwe6ucjxiU010Ep/V9QuDxLVsPG5mpSJLLzQQ2qey +TerQIBTfK0X1gf5rbIgT0CuKkp2cagerI8MxgurCS64y8jZRCWAERtNwe2LuXpDJMU/clcu qBR/doqvchL5NmXqbV0w01cohq0NJAG5uexVi3cu5oWp9xOpVnHAvFmXhGwG9TuFuID2u/HZ jN+fkIof+zI4Wx/kDJ/OzYqXDQF3yQ0RPBhsLv+sVxarCq3nzgTlVBnw==; From: Florian Bezdeka Date: Wed, 19 Aug 2026 16:30:30 +0200 Subject: [PATCH RFC 1/3] cpumask: Honor irq_default_affinity in cpumask_local_spread() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260819-flo-net-7-2-make-stmmac-default-affinity-aware-v1-1-3f79a99cadaf@siemens.com> References: <20260819-flo-net-7-2-make-stmmac-default-affinity-aware-v1-0-3f79a99cadaf@siemens.com> In-Reply-To: <20260819-flo-net-7-2-make-stmmac-default-affinity-aware-v1-0-3f79a99cadaf@siemens.com> To: Maxime Chevallier , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Maxime Coquelin , Alexandre Torgue , Yury Norov , Rasmus Villemoes , Andrew Morton , Sebastian Andrzej Siewior , Clark Williams , Steven Rostedt , Thomas Gleixner Cc: Jan Kiszka , netdev@vger.kernel.org, linux-stm32@st-md-mailman.stormreply.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-rt-devel@lists.linux.dev, Florian Bezdeka X-Flowmailer-Platform: Siemens Feedback-ID: 519:519-68982:519-21489:flowmailer Many drivers call cpumask_local_spread() to spread IRQs to several CPUs, mainly to get best performance and balance CPU load. For realtime (PREEMPT_RT) and other cpu-isolating workloads the old implementation was triggering an IRQ placement problem. IRQs were targeting CPUs that were isolated for those sensitive workloads. Userland will tell the kernel about the desired IRQ configuration for new interrupts by writing a proper cpumask to /proc/irq/default_smp_affinity. This cpu mask has to be honored to avoid IRQ noise on isolated cores. The default for irq_default_affinity is "all CPUs". So all CPUs will be taken into account for spreading when userland did not configure something special. --- lib/cpumask.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/cpumask.c b/lib/cpumask.c index 5adb9874fbd0f5a42ea8cd9e6c3729a70599781f..73e7b60a9201174f83df6067eff= be7d1889dcdb9 100644 --- a/lib/cpumask.c +++ b/lib/cpumask.c @@ -6,6 +6,7 @@ #include #include #include +#include =20 /* These are not inline because of header tangles. */ #ifdef CONFIG_CPUMASK_OFFSTACK @@ -81,8 +82,9 @@ void __init free_bootmem_cpumask_var(cpumask_var_t mask) * @i: index number * @node: local numa_node * - * Return: online CPU according to a numa aware policy; local cpus are ret= urned - * first, followed by non-local ones, then it wraps around. + * Return: online CPU according to the default IRQ affinity and a numa awa= re + * policy; local cpus are returned first, followed by non-local ones, then= it + * wraps around. * * For those who wants to enumerate all CPUs based on their NUMA distances, * i.e. call this function in a loop, like: @@ -110,9 +112,9 @@ unsigned int cpumask_local_spread(unsigned int i, int n= ode) unsigned int cpu; =20 /* Wrap: we always want a cpu. */ - i %=3D num_online_cpus(); + i %=3D cpumask_weight(irq_default_affinity); =20 - cpu =3D sched_numa_find_nth_cpu(cpu_online_mask, i, node); + cpu =3D sched_numa_find_nth_cpu(irq_default_affinity, i, node); =20 WARN_ON(cpu >=3D nr_cpu_ids); return cpu; --=20 2.55.0 From nobody Mon Sep 28 17:49:59 2026 Received: from mta-64-227.siemens.flowmailer.net (mta-64-227.siemens.flowmailer.net [185.136.64.227]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 86A513932E1 for ; Wed, 19 Aug 2026 14:30:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.136.64.227 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787149850; cv=none; b=qfiAJ5IcZcADT3oFfFDDXg9gn8Haf+hlelTZMaAcWLv/8xaWVVrB3OT/BoGTDiSCpvBEdGYTOM7T5KFeq7yjq8R6F8WmN5HafsV+8Ff+mMlkeC19VaskHBr5x8Vqi5LYgkBBVddBL6WUPglatbFiIH/kKRIaiBjFNNeoUfECBGQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787149850; c=relaxed/simple; bh=myNiNudWlAOhHqf78CNgDEMC2LXtqJxhUWb4ja/JZyo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hC181cne3HgPNiYV28K5avOr1spd0da5KZDKxFAPnk56vhvpdDxjiWIVLeRo8MqWCm/0nnSPM9+oZAMDdWz1kqTzsyUqS5XfgZq8EmtUQR0lkLM8WzpQz7IWSrwx6KTuaLwTK9ZOec7WLILrOTiy371tLgE9KDT1zzfkVrY7dRU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=siemens.com; spf=pass smtp.mailfrom=rts-flowmailer.siemens.com; dkim=pass (2048-bit key) header.d=siemens.com header.i=florian.bezdeka@siemens.com header.b=Krf5ghZ9; arc=none smtp.client-ip=185.136.64.227 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=siemens.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rts-flowmailer.siemens.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=siemens.com header.i=florian.bezdeka@siemens.com header.b="Krf5ghZ9" Received: by mta-64-227.siemens.flowmailer.net with ESMTPSA id 20260819143033590ea0ad18000207e2 for ; Wed, 19 Aug 2026 16:30:33 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=fm2; d=siemens.com; i=florian.bezdeka@siemens.com; h=Date:From:Subject:To:Message-ID:MIME-Version:Content-Type:Content-Transfer-Encoding:Cc:References:In-Reply-To; bh=IoNmqk4kFe1ffi9HtpCtyUHKbQwKZ6Jed6SDch4oW9M=; b=Krf5ghZ9dUUHTj7Dh50SkIbWovR1VpLHU5vQyUfG0H0aqDOFeJuPJpqsNWdfvGzz2tM2Yb 62YwWfAmla6In6QMb96eWCeNtft/RpDt5ZAVgR42w0BTzqoZ+ixyK3yqwory5ETNCaldAYx2 iTLhrkdNalnGyE9Wnrivw+ZbDmeLWx31WRnizgD3okPjOsWKfdQC6ickBE/XPeNveHHip8SM amtBqX/abZgRXsuhA9ecQqlohTyravo6wYZ8yIl1MlEoK6ijfJY7FuGSKSjx6mx8WRXmcpSY U6GeoZZHyZaDDTa4bBxkfuLryIrdwLalGGVA6BgsuFUXLiZzwES/cOkQ==; From: Florian Bezdeka Date: Wed, 19 Aug 2026 16:30:31 +0200 Subject: [PATCH RFC 2/3] genirq: Honor existing IRQ affinities when setting affinity hints Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260819-flo-net-7-2-make-stmmac-default-affinity-aware-v1-2-3f79a99cadaf@siemens.com> References: <20260819-flo-net-7-2-make-stmmac-default-affinity-aware-v1-0-3f79a99cadaf@siemens.com> In-Reply-To: <20260819-flo-net-7-2-make-stmmac-default-affinity-aware-v1-0-3f79a99cadaf@siemens.com> To: Maxime Chevallier , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Maxime Coquelin , Alexandre Torgue , Yury Norov , Rasmus Villemoes , Andrew Morton , Sebastian Andrzej Siewior , Clark Williams , Steven Rostedt , Thomas Gleixner Cc: Jan Kiszka , netdev@vger.kernel.org, linux-stm32@st-md-mailman.stormreply.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-rt-devel@lists.linux.dev, Florian Bezdeka X-Flowmailer-Platform: Siemens Feedback-ID: 519:519-68982:519-21489:flowmailer Some device drivers implement an IRQ balancing / spreading mechanism based on cpumask_local_spread() and irq_set_affinity_hint() (deprecated) or irq_set_affinity_and_hint(). __irq_apply_affinity_hint() was overwriting already configured affinities and with that violating user defined affinities. This was especially a problem on systems with isolated CPUs, a common pattern on PREEMPT_RT enabled systems. Device IRQs were balanced over CPUs that were isolated for RT workloads. Note that only the first call of irq_set_affinity_hint() and irq_set_affinity_and_hint() - for each IRQ - will have any effect. Afterward affinities might be controlled from userspace using the /proc/irq//smp_affinity{_list} interface. Signed-off-by: Florian Bezdeka --- kernel/irq/manage.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 7eb07e3bdb4c2419e0a58a75c29d88b4b00b8287..3937ba24df6d63375dda88164cf= 92fd49e70a3eb 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -503,11 +503,21 @@ EXPORT_SYMBOL_GPL(irq_force_affinity); =20 int __irq_apply_affinity_hint(unsigned int irq, const struct cpumask *m, b= ool setaffinity) { + struct irq_data *irq_data; int ret =3D -EINVAL; =20 scoped_irqdesc_get_and_lock(irq, IRQ_GET_DESC_CHECK_GLOBAL) { scoped_irqdesc->affinity_hint =3D m; + irq_data =3D irq_desc_get_irq_data(scoped_irqdesc); ret =3D 0; + + /* + * Do not overwrite the affinity in case an affinity for this + * IRQ has already been requested, e.g. by writing to + * /proc/irq//smp_affinity + */ + if (irqd_affinity_was_set(irq_data)) + setaffinity =3D false; } =20 if (!ret && m && setaffinity) --=20 2.55.0 From nobody Mon Sep 28 17:49:59 2026 Received: from mta-65-228.siemens.flowmailer.net (mta-65-228.siemens.flowmailer.net [185.136.65.228]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4A6D93093CF for ; Wed, 19 Aug 2026 14:30:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.136.65.228 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787149844; cv=none; b=LE+ozwI486VafsbTy3r0FEO6v0/kaMAb9r/+a9b5uNqoyCSxgdz9lVf/RqWuZNb8oepodOxCJFTUAjAuWoGZ8hVl9DgtCUsLN9GYffg2AXbE58X4ifjtXInpUZH5TA+rtnJVGVKuMOZxs75j9fSu+D09Luqk3BLc5CPuDWXLvlw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787149844; c=relaxed/simple; bh=chBfGMfp844oBzIINw5wmS5LW9kGFWDQ7Hz8+j5O7rI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KcLQGjUENxl74TikB+aXJ3lC0jhuPu6K8BrJ1gE8phKDzW7PKHOIyL0E3D7tWutfzpLFXqYCSBRUjlrYKHSc+v5k/kFO3sH4NHGwLGfUthQ56gNDAfqnChxJjU1CUhRGg/hlvk/0b4gIOqYWZP0rsv741x7wzs6VwSv3lshj4qM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=siemens.com; spf=pass smtp.mailfrom=rts-flowmailer.siemens.com; dkim=pass (2048-bit key) header.d=siemens.com header.i=florian.bezdeka@siemens.com header.b=bU551jOP; arc=none smtp.client-ip=185.136.65.228 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=siemens.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rts-flowmailer.siemens.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=siemens.com header.i=florian.bezdeka@siemens.com header.b="bU551jOP" Received: by mta-65-228.siemens.flowmailer.net with ESMTPSA id 202608191430333b42eb458a000207fc for ; Wed, 19 Aug 2026 16:30:34 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=fm2; d=siemens.com; i=florian.bezdeka@siemens.com; h=Date:From:Subject:To:Message-ID:MIME-Version:Content-Type:Content-Transfer-Encoding:Cc:References:In-Reply-To; bh=0N9FotERGZ2lP2bVikDRA8ACC8o9IjXehs1SgZCuBjA=; b=bU551jOPa15ZRd5Mh4WqHDNawdcmCuNzOmevR9LSg4HtaKLsiC/ge2AHvfsT9g0oAVOgcb mmspCU9JWhIFcORYKWAy1IbD0jP5VIi56LP+CUzJ4MDCAUV3w5ksOyPxN8t2bc6TfEAULMKw BUMO+ZzMYNF7hRH+v/D9vpml07Woh4+/BJyoC5yPYrNCfKFnoh2zbfOBvhi8bFDSDhnDAFLz kpGZ6D5kWqoe5TkaVi8jKYE8UvrOJo4scovH11cVqgxLVUkwQsSl9Oym0l7h2ksrgQ7SrIGi T5kGgrgcVkj1tB5n1aDVDPu7jhNs7uZ9zAuTdYiTLvV4+UNR0gvPo79g==; From: Florian Bezdeka Date: Wed, 19 Aug 2026 16:30:32 +0200 Subject: [PATCH RFC 3/3] net: stmmac: Migrate IRQ balancing to cpumask_local_spread() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260819-flo-net-7-2-make-stmmac-default-affinity-aware-v1-3-3f79a99cadaf@siemens.com> References: <20260819-flo-net-7-2-make-stmmac-default-affinity-aware-v1-0-3f79a99cadaf@siemens.com> In-Reply-To: <20260819-flo-net-7-2-make-stmmac-default-affinity-aware-v1-0-3f79a99cadaf@siemens.com> To: Maxime Chevallier , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Maxime Coquelin , Alexandre Torgue , Yury Norov , Rasmus Villemoes , Andrew Morton , Sebastian Andrzej Siewior , Clark Williams , Steven Rostedt , Thomas Gleixner Cc: Jan Kiszka , netdev@vger.kernel.org, linux-stm32@st-md-mailman.stormreply.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-rt-devel@lists.linux.dev, Florian Bezdeka X-Flowmailer-Platform: Siemens Feedback-ID: 519:519-68982:519-21489:flowmailer The previous balancing mechanism was based on num_online_cpus(), which is a problem for systems cpu-isolating workloads. IRQs were targeting CPUs that were isolated for those sensitive workloads. With a migration to cpumask_local_spread() we - get NUMA locality - honor the default SMP affinity mask, which avoids targeting isolated CPUs. This also aligns with the pattern used by most network drivers dealing with IRQ affinities / affinity hints. Signed-off-by: Florian Bezdeka --- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 21 +++++++++++++++++--= -- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/ne= t/ethernet/stmicro/stmmac/stmmac_main.c index a71f0df263785dd8badc45292ca3067ab33bda05..949ced7e46d2814b57c6bd86b48= 86ac3bf33996c 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -3826,11 +3826,16 @@ static int stmmac_request_irq_multi_msi(struct net_= device *dev) struct stmmac_priv *priv =3D netdev_priv(dev); struct stmmac_msi *msi =3D priv->msi; enum request_irq_err irq_err; + cpumask_var_t affinity; int irq_idx =3D 0; char *int_name; + int node; int ret; int i; =20 + if (!zalloc_cpumask_var(&affinity, GFP_KERNEL)) + return -ENOMEM; + /* For common interrupt */ int_name =3D msi->int_name_mac; sprintf(int_name, "%s:%s", dev->name, "mac"); @@ -3916,6 +3921,7 @@ static int stmmac_request_irq_multi_msi(struct net_de= vice *dev) } =20 /* Request Rx MSI irq */ + node =3D dev_to_node(&priv->dev->dev); for (i =3D 0; i < priv->plat->rx_queues_to_use; i++) { if (i >=3D MTL_MAX_RX_QUEUES) break; @@ -3935,8 +3941,10 @@ static int stmmac_request_irq_multi_msi(struct net_d= evice *dev) irq_idx =3D i; goto irq_error; } - irq_set_affinity_hint(msi->rx_irq[i], - cpumask_of(i % num_online_cpus())); + + cpumask_clear(affinity); + cpumask_set_cpu(cpumask_local_spread(i, node), affinity); + irq_set_affinity_and_hint(msi->rx_irq[i], affinity); } =20 /* Request Tx MSI irq */ @@ -3959,13 +3967,18 @@ static int stmmac_request_irq_multi_msi(struct net_= device *dev) irq_idx =3D i; goto irq_error; } - irq_set_affinity_hint(msi->tx_irq[i], - cpumask_of(i % num_online_cpus())); + + cpumask_clear(affinity); + cpumask_set_cpu(cpumask_local_spread(i, node), affinity); + irq_set_affinity_and_hint(msi->tx_irq[i], affinity); } =20 + free_cpumask_var(affinity); + return 0; =20 irq_error: + free_cpumask_var(affinity); stmmac_free_irq(dev, irq_err, irq_idx); return ret; } --=20 2.55.0