From: Yury Norov <yury.norov@gmail.com>
To: linux-kernel@vger.kernel.org,
"David S. Miller" <davem@davemloft.net>,
Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
Barry Song <baohua@kernel.org>, Ben Segall <bsegall@google.com>,
Daniel Bristot de Oliveira <bristot@redhat.com>,
Dietmar Eggemann <dietmar.eggemann@arm.com>,
Gal Pressman <gal@nvidia.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Heiko Carstens <hca@linux.ibm.com>,
Ingo Molnar <mingo@redhat.com>, Jakub Kicinski <kuba@kernel.org>,
Jason Gunthorpe <jgg@nvidia.com>,
Jesse Brandeburg <jesse.brandeburg@intel.com>,
Jonathan Cameron <Jonathan.Cameron@huawei.com>,
Juri Lelli <juri.lelli@redhat.com>,
Leon Romanovsky <leonro@nvidia.com>, Mel Gorman <mgorman@suse.de>,
Peter Zijlstra <peterz@infradead.org>,
Rasmus Villemoes <linux@rasmusvillemoes.dk>,
Saeed Mahameed <saeedm@nvidia.com>,
Steven Rostedt <rostedt@goodmis.org>,
Tariq Toukan <tariqt@nvidia.com>,
Tariq Toukan <ttoukan.linux@gmail.com>,
Tony Luck <tony.luck@intel.com>,
Valentin Schneider <vschneid@redhat.com>,
Vincent Guittot <vincent.guittot@linaro.org>
Cc: Yury Norov <yury.norov@gmail.com>,
linux-crypto@vger.kernel.org, netdev@vger.kernel.org,
linux-rdma@vger.kernel.org
Subject: [PATCH 3/4] sched: add sched_numa_find_nth_cpu()
Date: Thu, 10 Nov 2022 20:00:26 -0800 [thread overview]
Message-ID: <20221111040027.621646-4-yury.norov@gmail.com> (raw)
In-Reply-To: <20221111040027.621646-1-yury.norov@gmail.com>
The function finds Nth set CPU in a given cpumask starting from a given
node.
Leveraging the fact that each hop in sched_domains_numa_masks includes the
same or greater number of CPUs than the previous one, we can use binary
search on hops instead of linear walk, which makes the overall complexity
of O(log n) in terms of number of cpumask_weight() calls.
Signed-off-by: Yury Norov <yury.norov@gmail.com>
---
include/linux/topology.h | 8 ++++++++
kernel/sched/topology.c | 42 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 50 insertions(+)
diff --git a/include/linux/topology.h b/include/linux/topology.h
index 4564faafd0e1..63048ac3207c 100644
--- a/include/linux/topology.h
+++ b/include/linux/topology.h
@@ -245,5 +245,13 @@ static inline const struct cpumask *cpu_cpu_mask(int cpu)
return cpumask_of_node(cpu_to_node(cpu));
}
+#ifdef CONFIG_NUMA
+int sched_numa_find_nth_cpu(const struct cpumask *cpus, int cpu, int node);
+#else
+int sched_numa_find_nth_cpu(const struct cpumask *cpus, int cpu, int node)
+{
+ return cpumask_nth(cpu, cpus);
+}
+#endif /* CONFIG_NUMA */
#endif /* _LINUX_TOPOLOGY_H */
diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c
index 8739c2a5a54e..c8f56287de46 100644
--- a/kernel/sched/topology.c
+++ b/kernel/sched/topology.c
@@ -2067,6 +2067,48 @@ int sched_numa_find_closest(const struct cpumask *cpus, int cpu)
return found;
}
+/*
+ * sched_numa_find_nth_cpu() - given the NUMA topology, find the Nth next cpu
+ * closest to @cpu from @cpumask.
+ * cpumask: cpumask to find a cpu from
+ * cpu: Nth cpu to find
+ *
+ * returns: cpu, or >= nr_cpu_ids when nothing found.
+ */
+int sched_numa_find_nth_cpu(const struct cpumask *cpus, int cpu, int node)
+{
+ unsigned int first = 0, mid, last = sched_domains_numa_levels;
+ struct cpumask ***masks;
+ int w, ret = nr_cpu_ids;
+
+ rcu_read_lock();
+ masks = rcu_dereference(sched_domains_numa_masks);
+ if (!masks)
+ goto out;
+
+ while (last >= first) {
+ mid = (last + first) / 2;
+
+ if (cpumask_weight_and(cpus, masks[mid][node]) <= cpu) {
+ first = mid + 1;
+ continue;
+ }
+
+ w = (mid == 0) ? 0 : cpumask_weight_and(cpus, masks[mid - 1][node]);
+ if (w <= cpu)
+ break;
+
+ last = mid - 1;
+ }
+
+ ret = (mid == 0) ?
+ cpumask_nth_and(cpu - w, cpus, masks[mid][node]) :
+ cpumask_nth_and_andnot(cpu - w, cpus, masks[mid][node], masks[mid - 1][node]);
+out:
+ rcu_read_unlock();
+ return ret;
+}
+EXPORT_SYMBOL_GPL(sched_numa_find_nth_cpu);
#endif /* CONFIG_NUMA */
static int __sdt_alloc(const struct cpumask *cpu_map)
--
2.34.1
next prev parent reply other threads:[~2022-11-11 4:00 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-11 4:00 [PATCH 0/4] cpumask: improve on cpumask_local_spread() locality Yury Norov
2022-11-11 4:00 ` [PATCH 1/4] lib/find: introduce find_nth_and_andnot_bit Yury Norov
2022-11-11 4:00 ` [PATCH 2/4] cpumask: introduce cpumask_nth_and_andnot() Yury Norov
2022-11-11 4:00 ` Yury Norov [this message]
2022-11-11 4:11 ` [PATCH 3/4] sched: add sched_numa_find_nth_cpu() Yury Norov
2022-11-11 11:42 ` Andy Shevchenko
2022-11-11 17:07 ` Yury Norov
2022-11-11 18:14 ` Andy Shevchenko
2022-11-12 18:14 ` Yury Norov
2022-11-11 4:00 ` [PATCH 4/4] cpumask: improve on cpumask_local_spread() locality Yury Norov
2022-11-11 16:25 ` [PATCH 0/4] " Jakub Kicinski
[not found] ` <CAAH8bW9jG5US0Ymn1wax9tNK3MgZpcWfQsYgu-Km_E+WZw3yiA@mail.gmail.com>
2022-11-13 7:37 ` Tariq Toukan
2022-11-13 12:29 ` Andy Shevchenko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221111040027.621646-4-yury.norov@gmail.com \
--to=yury.norov@gmail.com \
--cc=Jonathan.Cameron@huawei.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=baohua@kernel.org \
--cc=bristot@redhat.com \
--cc=bsegall@google.com \
--cc=davem@davemloft.net \
--cc=dietmar.eggemann@arm.com \
--cc=gal@nvidia.com \
--cc=gregkh@linuxfoundation.org \
--cc=hca@linux.ibm.com \
--cc=jesse.brandeburg@intel.com \
--cc=jgg@nvidia.com \
--cc=juri.lelli@redhat.com \
--cc=kuba@kernel.org \
--cc=leonro@nvidia.com \
--cc=linux-crypto@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=linux@rasmusvillemoes.dk \
--cc=mgorman@suse.de \
--cc=mingo@redhat.com \
--cc=netdev@vger.kernel.org \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=saeedm@nvidia.com \
--cc=tariqt@nvidia.com \
--cc=tony.luck@intel.com \
--cc=ttoukan.linux@gmail.com \
--cc=vincent.guittot@linaro.org \
--cc=vschneid@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox