All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ingo Molnar <mingo@kernel.org>
To: Rakib Mullick <rakib.mullick@gmail.com>
Cc: peterz@infradead.org, mka@chromium.org, longman@redhat.com,
	adobriyan@gmail.com, tglx@linutronix.de,
	akpm@linux-foundation.org, tj@kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH]  Fix isocpus's param handling when CPUMASK_OFFSTACK=n.
Date: Mon, 23 Oct 2017 13:50:50 +0200	[thread overview]
Message-ID: <20171023115050.twyx4kn7ttvon2ch@gmail.com> (raw)
In-Reply-To: <20171021071017.10554-1-rakib.mullick@gmail.com>


* Rakib Mullick <rakib.mullick@gmail.com> wrote:

> >  *On Fri, Oct 20, 2017 at 2:49 PM, Ingo Molnar <mingo@kernel.org> wrote:
> >
> >> Rakib Mullick <rakib.mullick@gmail.com> wrote:
> >>  include/linux/cpumask.h | 16 ++++++++++++++++
> >>  kernel/sched/topology.c |  8 +++++---
> >>  2 files changed, 21 insertions(+), 3 deletions(-)
> >
> > What kernel is this against? It does not apply to the latest kernels.
> 
> It was against 4.14-rc4, prepared before -rc5 release. Please, consider
> the below one, against -rc5.
> 
>  cpulist_parse() uses nr_cpumask_bits as limit to parse the
> passed buffer from kernel commandline. What nr_cpumask_bits
> represents varies depends upon CONFIG_CPUMASK_OFFSTACK option.
> If CONFIG_CPUMASK_OFFSTACK=n, then nr_cpumask_bits is same as
> NR_CPUS, which might not represent the # of cpus really exist
> (default 64). So, there's a chance of gap between nr_cpu_ids
> and NR_CPUS, which ultimately lead towards invalid cpulist_parse()
> operation. For example, if isolcpus=9 is passed on a 8 cpu
> system (CONFIG_CPUMASK_OFFSTACK=n) it doesn't show the error
> that it suppose to.
> 
> This patch fixes this issue by effectively find out the last
> cpu of the passed isolcpus list and checking it with nr_cpu_ids.
> Also, fixes the error message where the nr_cpu_ids should be
> nr_cpu_ids-1, since the cpu numbering starts from 0.
> 
> Signed-off-by: Rakib Mullick <rakib.mullick@gmail.com>
> ---
>  include/linux/cpumask.h | 16 ++++++++++++++++
>  kernel/sched/topology.c |  8 +++++---
>  2 files changed, 21 insertions(+), 3 deletions(-)
> 
> diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h
> index cd415b7..5631725 100644
> --- a/include/linux/cpumask.h
> +++ b/include/linux/cpumask.h
> @@ -130,6 +130,11 @@ static inline unsigned int cpumask_first(const struct cpumask *srcp)
>  	return 0;
>  }
>  
> +static inline unsigned int cpumask_last(const struct cpumask *srcp)
> +{
> +	return 0;
> +}
> +
>  /* Valid inputs for n are -1 and 0. */
>  static inline unsigned int cpumask_next(int n, const struct cpumask *srcp)
>  {
> @@ -178,6 +183,17 @@ static inline unsigned int cpumask_first(const struct cpumask *srcp)
>  	return find_first_bit(cpumask_bits(srcp), nr_cpumask_bits);
>  }
>  
> +/**
> + * cpumask_last - get the last cpu in a cpumask

Please capitalize 'CPU' properly in documentation.

> + * @srcp:	- the cpumask pointer
> + *
> + * Returns	>= nr_cpumask_bits if no cpus set.
> + */
> +static inline unsigned int cpumask_last(const struct cpumask *srcp)
> +{
> +	return find_last_bit(cpumask_bits(srcp), nr_cpumask_bits);
> +}
> +
>  unsigned int cpumask_next(int n, const struct cpumask *srcp);
>  
>  /**
> diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c
> index f1cf4f3..b9265c8 100644
> --- a/kernel/sched/topology.c
> +++ b/kernel/sched/topology.c
> @@ -466,12 +466,14 @@ cpu_attach_domain(struct sched_domain *sd, struct root_domain *rd, int cpu)
>  /* Setup the mask of CPUs configured for isolated domains */
>  static int __init isolated_cpu_setup(char *str)
>  {
> -	int ret;
> +	int ret, lastcpu;
>  
>  	alloc_bootmem_cpumask_var(&cpu_isolated_map);
>  	ret = cpulist_parse(str, cpu_isolated_map);
> -	if (ret) {
> -		pr_err("sched: Error, all isolcpus= values must be between 0 and %u\n", nr_cpu_ids);
> +	lastcpu = cpumask_last(cpu_isolated_map);
> +	if (ret || lastcpu >= nr_cpu_ids) {

Any reason why 'lastcpu' has to be introduced - why not just use cpumask_last() 
directly in the condition? It looks obvious enough of a pattern.

> +		pr_err("sched: Error, all isolcpus= values must be between 0 and %u\n",
> +				nr_cpu_ids-1);

Please don't break the line mindlessly just due to checkpatch complaining - it 
makes the code less readable.

Thanks,

	Ingo

  reply	other threads:[~2017-10-23 11:51 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-15 13:18 [PATCH] Fix isocpus's param handling when CPUMASK_OFFSTACK=n Rakib Mullick
2017-10-20  8:49 ` Ingo Molnar
2017-10-21  7:10   ` Rakib Mullick
2017-10-23 11:50     ` Ingo Molnar [this message]
2017-10-23 13:01       ` Rakib Mullick
2017-10-24 10:17         ` [tip:sched/core] sched/isolcpus: Fix "isolcpus=" boot parameter handling when !CONFIG_CPUMASK_OFFSTACK tip-bot for Rakib Mullick

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=20171023115050.twyx4kn7ttvon2ch@gmail.com \
    --to=mingo@kernel.org \
    --cc=adobriyan@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=longman@redhat.com \
    --cc=mka@chromium.org \
    --cc=peterz@infradead.org \
    --cc=rakib.mullick@gmail.com \
    --cc=tglx@linutronix.de \
    --cc=tj@kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.