linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
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


      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