From 26472a7be73409ba33dc9ca001e7a5cc056b24fc Mon Sep 17 00:00:00 2001 Message-Id: <26472a7be73409ba33dc9ca001e7a5cc056b24fc.1507237258.git.Jim.Somerville@windriver.com> In-Reply-To: <2a9fb6a58e40e8604d97223603111e869bb774b1.1507237258.git.Jim.Somerville@windriver.com> References: <2a9fb6a58e40e8604d97223603111e869bb774b1.1507237258.git.Jim.Somerville@windriver.com> From: Chris Friesen Date: Tue, 24 Nov 2015 16:27:29 -0500 Subject: [PATCH 06/24] Affine irqs and workqueues with kthread_cpus If the kthread_cpus boot arg is set it means we want to affine kernel threads to the specified CPU mask as much as possible in order to avoid doing work on other CPUs. In this commit we extend the meaning of that boot arg to also apply to the CPU affinity of unbound and ordered workqueues. We also use the kthread_cpus value to determine the default irq affinity. Specifically, as long as the previously-calculated irq affinity intersects with the kthread_cpus affinity then we'll use the intersection of the two as the default irq affinity. Signed-off-by: Chris Friesen [VT: replacing spaces with tabs. Performed tests] Signed-off-by: Vu Tran Signed-off-by: Jim Somerville --- kernel/irq/manage.c | 7 +++++++ kernel/workqueue.c | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 90f4309..54d58bc 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -348,6 +348,13 @@ setup_affinity(unsigned int irq, struct irq_desc *desc, struct cpumask *mask) if (cpumask_intersects(mask, nodemask)) cpumask_and(mask, mask, nodemask); } + + /* This will narrow down the affinity further if we've specified + * a reduced cpu_kthread_mask in the boot args. + */ + if (cpumask_intersects(mask, cpu_kthread_mask)) + cpumask_and(mask, mask, cpu_kthread_mask); + irq_do_set_affinity(&desc->irq_data, mask, false); return 0; } diff --git a/kernel/workqueue.c b/kernel/workqueue.c index d54b4e3..99fe902 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -5417,6 +5417,8 @@ static int __init init_workqueues(void) BUG_ON(!(attrs = alloc_workqueue_attrs(GFP_KERNEL))); attrs->nice = std_nice[i]; + /* If we've specified a kthread mask apply it here too. */ + cpumask_copy(attrs->cpumask, cpu_kthread_mask); unbound_std_wq_attrs[i] = attrs; /* @@ -5427,6 +5429,8 @@ static int __init init_workqueues(void) BUG_ON(!(attrs = alloc_workqueue_attrs(GFP_KERNEL))); attrs->nice = std_nice[i]; attrs->no_numa = true; + /* If we've specified a kthread mask apply it here too. */ + cpumask_copy(attrs->cpumask, cpu_kthread_mask); ordered_wq_attrs[i] = attrs; } -- 1.8.3.1