mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-23 16:53:58 -05:00
lib: Restrict cpumask_local_spread to houskeeping CPUs
The current implementation of cpumask_local_spread() does not respect the isolated CPUs, i.e., even if a CPU has been isolated for Real-Time task, it will return it to the caller for pinning of its IRQ threads. Having these unwanted IRQ threads on an isolated CPU adds up to a latency overhead. Restrict the CPUs that are returned for spreading IRQs only to the available housekeeping CPUs. Signed-off-by: Alex Belits <abelits@marvell.com> Signed-off-by: Nitesh Narayan Lal <nitesh@redhat.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lkml.kernel.org/r/20200625223443.2684-2-nitesh@redhat.com
This commit is contained in:
parent
46609ce227
commit
1abdfe706a
1 changed files with 11 additions and 5 deletions
|
@ -6,6 +6,7 @@
|
||||||
#include <linux/export.h>
|
#include <linux/export.h>
|
||||||
#include <linux/memblock.h>
|
#include <linux/memblock.h>
|
||||||
#include <linux/numa.h>
|
#include <linux/numa.h>
|
||||||
|
#include <linux/sched/isolation.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cpumask_next - get the next cpu in a cpumask
|
* cpumask_next - get the next cpu in a cpumask
|
||||||
|
@ -205,22 +206,27 @@ void __init free_bootmem_cpumask_var(cpumask_var_t mask)
|
||||||
*/
|
*/
|
||||||
unsigned int cpumask_local_spread(unsigned int i, int node)
|
unsigned int cpumask_local_spread(unsigned int i, int node)
|
||||||
{
|
{
|
||||||
int cpu;
|
int cpu, hk_flags;
|
||||||
|
const struct cpumask *mask;
|
||||||
|
|
||||||
|
hk_flags = HK_FLAG_DOMAIN | HK_FLAG_MANAGED_IRQ;
|
||||||
|
mask = housekeeping_cpumask(hk_flags);
|
||||||
/* Wrap: we always want a cpu. */
|
/* Wrap: we always want a cpu. */
|
||||||
i %= num_online_cpus();
|
i %= cpumask_weight(mask);
|
||||||
|
|
||||||
if (node == NUMA_NO_NODE) {
|
if (node == NUMA_NO_NODE) {
|
||||||
for_each_cpu(cpu, cpu_online_mask)
|
for_each_cpu(cpu, mask) {
|
||||||
if (i-- == 0)
|
if (i-- == 0)
|
||||||
return cpu;
|
return cpu;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/* NUMA first. */
|
/* NUMA first. */
|
||||||
for_each_cpu_and(cpu, cpumask_of_node(node), cpu_online_mask)
|
for_each_cpu_and(cpu, cpumask_of_node(node), mask) {
|
||||||
if (i-- == 0)
|
if (i-- == 0)
|
||||||
return cpu;
|
return cpu;
|
||||||
|
}
|
||||||
|
|
||||||
for_each_cpu(cpu, cpu_online_mask) {
|
for_each_cpu(cpu, mask) {
|
||||||
/* Skip NUMA nodes, done above. */
|
/* Skip NUMA nodes, done above. */
|
||||||
if (cpumask_test_cpu(cpu, cpumask_of_node(node)))
|
if (cpumask_test_cpu(cpu, cpumask_of_node(node)))
|
||||||
continue;
|
continue;
|
||||||
|
|
Loading…
Add table
Reference in a new issue