Kindly ping for these two patches, :) On Fri, 28 Jun 2019 at 16:51, Wanpeng Li <[email protected]> wrote: > > From: Wanpeng Li <[email protected]> > > In real product setup, there will be houseeking cpus in each nodes, it > is prefer to do housekeeping from local node, fallback to global online > cpumask if failed to find houseeking cpu from local node. > > Reviewed-by: Frederic Weisbecker <[email protected]> > Reviewed-by: Srikar Dronamraju <[email protected]> > Cc: Ingo Molnar <[email protected]> > Cc: Peter Zijlstra <[email protected]> > Cc: Frederic Weisbecker <[email protected]> > Cc: Thomas Gleixner <[email protected]> > Cc: Srikar Dronamraju <[email protected]> > Signed-off-by: Wanpeng Li <[email protected]> > --- > v3 -> v4: > * have a static function for sched_numa_find_closest > * cleanup sched_numa_find_closest comments > v2 -> v3: > * add sched_numa_find_closest comments > v1 -> v2: > * introduce sched_numa_find_closest > > kernel/sched/isolation.c | 12 ++++++++++-- > kernel/sched/sched.h | 8 +++++--- > kernel/sched/topology.c | 20 ++++++++++++++++++++ > 3 files changed, 35 insertions(+), 5 deletions(-) > > diff --git a/kernel/sched/isolation.c b/kernel/sched/isolation.c > index 7b9e1e0..191f751 100644 > --- a/kernel/sched/isolation.c > +++ b/kernel/sched/isolation.c > @@ -16,9 +16,17 @@ static unsigned int housekeeping_flags; > > int housekeeping_any_cpu(enum hk_flags flags) > { > - if (static_branch_unlikely(&housekeeping_overridden)) > - if (housekeeping_flags & flags) > + int cpu; > + > + if (static_branch_unlikely(&housekeeping_overridden)) { > + if (housekeeping_flags & flags) { > + cpu = sched_numa_find_closest(housekeeping_mask, > smp_processor_id()); > + if (cpu < nr_cpu_ids) > + return cpu; > + > return cpumask_any_and(housekeeping_mask, > cpu_online_mask); > + } > + } > return smp_processor_id(); > } > EXPORT_SYMBOL_GPL(housekeeping_any_cpu); > diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h > index 802b1f3..ec65d90 100644 > --- a/kernel/sched/sched.h > +++ b/kernel/sched/sched.h > @@ -1261,16 +1261,18 @@ enum numa_topology_type { > extern enum numa_topology_type sched_numa_topology_type; > extern int sched_max_numa_distance; > extern bool find_numa_distance(int distance); > -#endif > - > -#ifdef CONFIG_NUMA > extern void sched_init_numa(void); > extern void sched_domains_numa_masks_set(unsigned int cpu); > extern void sched_domains_numa_masks_clear(unsigned int cpu); > +extern int sched_numa_find_closest(const struct cpumask *cpus, int cpu); > #else > static inline void sched_init_numa(void) { } > static inline void sched_domains_numa_masks_set(unsigned int cpu) { } > static inline void sched_domains_numa_masks_clear(unsigned int cpu) { } > +static inline int sched_numa_find_closest(const struct cpumask *cpus, int > cpu) > +{ > + return nr_cpu_ids; > +} > #endif > > #ifdef CONFIG_NUMA_BALANCING > diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c > index f751ce0..4eea2c9 100644 > --- a/kernel/sched/topology.c > +++ b/kernel/sched/topology.c > @@ -1724,6 +1724,26 @@ void sched_domains_numa_masks_clear(unsigned int cpu) > } > } > > +/* > + * sched_numa_find_closest() - given the NUMA topology, find the cpu > + * closest to @cpu from @cpumask. > + * cpumask: cpumask to find a cpu from > + * cpu: cpu to be close to > + * > + * returns: cpu, or nr_cpu_ids when nothing found. > + */ > +int sched_numa_find_closest(const struct cpumask *cpus, int cpu) > +{ > + int i, j = cpu_to_node(cpu); > + > + for (i = 0; i < sched_domains_numa_levels; i++) { > + cpu = cpumask_any_and(cpus, sched_domains_numa_masks[i][j]); > + if (cpu < nr_cpu_ids) > + return cpu; > + } > + return nr_cpu_ids; > +} > + > #endif /* CONFIG_NUMA */ > > static int __sdt_alloc(const struct cpumask *cpu_map) > -- > 2.7.4 >

