From: Dennis Zhou <dennis@kernel.org>
To: Wonhuyk Yang <vvghjk1234@gmail.com>
Cc: Tejun Heo <tj@kernel.org>, Christoph Lameter <cl@linux.com>,
linux-mm@kvack.org
Subject: Re: [PATCH] percpu: Reduce the number of cpu distance comparisions
Date: Fri, 30 Oct 2020 20:19:46 +0000 [thread overview]
Message-ID: <20201030201946.GA1061822@google.com> (raw)
In-Reply-To: <20201030013820.29758-1-vvghjk1234@gmail.com>
Hello,
On Fri, Oct 30, 2020 at 10:38:20AM +0900, Wonhuyk Yang wrote:
> From: Wonhyuk Yang <vvghjk1234@gmail.com>
>
> To build group_map[] and group_cnt[], we find out which group
> CPUs belong to by comparing the distance of the cpu. However,
> this includes cases where comparisons are not required.
>
> This patch uses a bitmap to record CPUs that is not classified in
> the group. CPUs that we know which group they belong to should be
> cleared from the bitmap. In result, we can reduce the number of
> unnecessary comparisons.
>
> Signed-off-by: Wonhyuk Yang <vvghjk1234@gmail.com>
> ---
> mm/percpu.c | 32 ++++++++++++++++++--------------
> 1 file changed, 18 insertions(+), 14 deletions(-)
>
> diff --git a/mm/percpu.c b/mm/percpu.c
> index 66a93f096394..d19ca484eee4 100644
> --- a/mm/percpu.c
> +++ b/mm/percpu.c
> @@ -2669,6 +2669,7 @@ static struct pcpu_alloc_info * __init pcpu_build_alloc_info(
> {
> static int group_map[NR_CPUS] __initdata;
> static int group_cnt[NR_CPUS] __initdata;
> + static struct cpumask mask __initdata;
> const size_t static_size = __per_cpu_end - __per_cpu_start;
> int nr_groups = 1, nr_units = 0;
> size_t size_sum, min_unit_size, alloc_size;
> @@ -2702,24 +2703,27 @@ static struct pcpu_alloc_info * __init pcpu_build_alloc_info(
> upa--;
> max_upa = upa;
>
> + cpumask_copy(&mask, cpu_possible_mask);
> +
> /* group cpus according to their proximity */
> - for_each_possible_cpu(cpu) {
> - group = 0;
> - next_group:
> - for_each_possible_cpu(tcpu) {
> - if (cpu == tcpu)
> - break;
> - if (group_map[tcpu] == group && cpu_distance_fn &&
> - (cpu_distance_fn(cpu, tcpu) > LOCAL_DISTANCE ||
> - cpu_distance_fn(tcpu, cpu) > LOCAL_DISTANCE)) {
> - group++;
> - nr_groups = max(nr_groups, group + 1);
> - goto next_group;
> - }
> - }
> + for (group = 0; !cpumask_empty(&mask); group++) {
> + /* pop the group's first cpu */
> + cpu = cpumask_first(&mask);
> group_map[cpu] = group;
> group_cnt[group]++;
> + cpumask_clear_cpu(cpu, &mask);
> +
> + for_each_cpu(tcpu, &mask) {
> + if (!cpu_distance_fn ||
> + (cpu_distance_fn(cpu, tcpu) == LOCAL_DISTANCE &&
> + cpu_distance_fn(tcpu, cpu) == LOCAL_DISTANCE)) {
> + group_map[tcpu] = group;
> + group_cnt[group]++;
> + cpumask_clear_cpu(tcpu, &mask);
> + }
> + }
> }
> + nr_groups = group;
>
> /*
> * Wasted space is caused by a ratio imbalance of upa to group_cnt.
> --
> 2.17.1
>
Sorry for the delay. It's been a little bit of a busy week for me and it
always takes me a moment to wrap my head around this code.
I've applied this to percpu#for-5.11.
Thanks,
Dennis
prev parent reply other threads:[~2020-10-30 20:20 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-30 1:38 Wonhuyk Yang
2020-10-30 20:19 ` Dennis Zhou [this message]
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=20201030201946.GA1061822@google.com \
--to=dennis@kernel.org \
--cc=cl@linux.com \
--cc=linux-mm@kvack.org \
--cc=tj@kernel.org \
--cc=vvghjk1234@gmail.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