All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Fix isocpus's param handling when CPUMASK_OFFSTACK=n.
@ 2017-10-15 13:18 Rakib Mullick
  2017-10-20  8:49 ` Ingo Molnar
  0 siblings, 1 reply; 6+ messages in thread
From: Rakib Mullick @ 2017-10-15 13:18 UTC (permalink / raw)
  To: peterz, mingo; +Cc: mka, longman, adobriyan, tglx, akpm, tj, linux-kernel

 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 2404ad2..f9a7c9b 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)
 {
@@ -179,6 +184,17 @@ static inline unsigned int cpumask_first(const struct cpumask *srcp)
 }
 
 /**
+ * cpumask_last - get the last cpu in a cpumask
+ * @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);
+}
+
+/**
  * cpumask_next - get the next cpu in a cpumask
  * @n: the cpu prior to the place to search (ie. return will be > @n)
  * @srcp: the cpumask pointer
diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c
index 1b0b4fb..55b5e09 100644
--- a/kernel/sched/topology.c
+++ b/kernel/sched/topology.c
@@ -452,12 +452,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 %d\n", nr_cpu_ids);
+	lastcpu = cpumask_last(cpu_isolated_map);
+	if (ret || lastcpu >= nr_cpu_ids) {
+		pr_err("sched: Error, all isolcpus= values must be between 0 and %d\n",
+				nr_cpu_ids-1);
 		return 0;
 	}
 	return 1;
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] Fix isocpus's param handling when CPUMASK_OFFSTACK=n.
  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
  0 siblings, 1 reply; 6+ messages in thread
From: Ingo Molnar @ 2017-10-20  8:49 UTC (permalink / raw)
  To: Rakib Mullick
  Cc: peterz, mka, longman, adobriyan, tglx, akpm, tj, linux-kernel


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

>  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(-)

What kernel is this against? It does not apply to the latest kernels.

Thanks,

	Ingo

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH]  Fix isocpus's param handling when CPUMASK_OFFSTACK=n.
  2017-10-20  8:49 ` Ingo Molnar
@ 2017-10-21  7:10   ` Rakib Mullick
  2017-10-23 11:50     ` Ingo Molnar
  0 siblings, 1 reply; 6+ messages in thread
From: Rakib Mullick @ 2017-10-21  7:10 UTC (permalink / raw)
  To: mingo; +Cc: peterz, mka, longman, adobriyan, tglx, akpm, tj, linux-kernel

>  *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
+ * @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) {
+		pr_err("sched: Error, all isolcpus= values must be between 0 and %u\n",
+				nr_cpu_ids-1);
 		return 0;
 	}
 	return 1;
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH]  Fix isocpus's param handling when CPUMASK_OFFSTACK=n.
  2017-10-21  7:10   ` Rakib Mullick
@ 2017-10-23 11:50     ` Ingo Molnar
  2017-10-23 13:01       ` Rakib Mullick
  0 siblings, 1 reply; 6+ messages in thread
From: Ingo Molnar @ 2017-10-23 11:50 UTC (permalink / raw)
  To: Rakib Mullick
  Cc: peterz, mka, longman, adobriyan, tglx, akpm, tj, linux-kernel


* 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

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH]  Fix isocpus's param handling when CPUMASK_OFFSTACK=n.
  2017-10-23 11:50     ` Ingo Molnar
@ 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
  0 siblings, 1 reply; 6+ messages in thread
From: Rakib Mullick @ 2017-10-23 13:01 UTC (permalink / raw)
  To: mingo; +Cc: peterz, mka, longman, adobriyan, tglx, akpm, tj, linux-kernel


> On Mon, Oct 23, 2017 at 5:50 PM, Ingo Molnar <mingo@kernel.org> wrote:
>
>> * Rakib Mullick <rakib.mullick@gmail.com> wrote:
>> +/**
>> + * cpumask_last - get the last cpu in a cpumask
>
> Please capitalize 'CPU' properly in documentation.
>
OK.
>> +     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.
Thought it reflects what we're doing here, but yes, actually it's redundant.

>> +             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.
>
Yes, right, mindlessly followed what checkpatch was complaining.

Please see the following patch, with changes made based on your review and
patched up against -rc6.

Thanks,
Rakib
---

[PATCH](v1) Fix isocpus's param handling when CPUMASK_OFFSTACK=n.

 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.

Changes since v0 (Ingo):
	* use cpumask_last() directly into the condition.
	* use CPU rather cpu in documentation
	* undo line break

Signed-off-by: Rakib Mullick <rakib.mullick@gmail.com>
---
 include/linux/cpumask.h | 16 ++++++++++++++++
 kernel/sched/topology.c |  4 ++--
 2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h
index cd415b7..63661de 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
+ * @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..060cee5 100644
--- a/kernel/sched/topology.c
+++ b/kernel/sched/topology.c
@@ -470,8 +470,8 @@ static int __init isolated_cpu_setup(char *str)
 
 	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);
+	if (ret || cpumask_last(cpu_isolated_map) >= nr_cpu_ids) {
+		pr_err("sched: Error, all isolcpus= values must be between 0 and %u\n", nr_cpu_ids-1);
 		return 0;
 	}
 	return 1;
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [tip:sched/core] sched/isolcpus: Fix "isolcpus=" boot parameter handling when !CONFIG_CPUMASK_OFFSTACK
  2017-10-23 13:01       ` Rakib Mullick
@ 2017-10-24 10:17         ` tip-bot for Rakib Mullick
  0 siblings, 0 replies; 6+ messages in thread
From: tip-bot for Rakib Mullick @ 2017-10-24 10:17 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: mingo, rakib.mullick, linux-kernel, peterz, tglx, torvalds, hpa

Commit-ID:  e22cdc3fc5991956146b9856d36b4971fe54dcd6
Gitweb:     https://git.kernel.org/tip/e22cdc3fc5991956146b9856d36b4971fe54dcd6
Author:     Rakib Mullick <rakib.mullick@gmail.com>
AuthorDate: Mon, 23 Oct 2017 19:01:54 +0600
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Tue, 24 Oct 2017 11:47:25 +0200

sched/isolcpus: Fix "isolcpus=" boot parameter handling when !CONFIG_CPUMASK_OFFSTACK

cpulist_parse() uses nr_cpumask_bits as a limit to parse the
passed buffer from kernel commandline. What nr_cpumask_bits
represents varies depending upon the CONFIG_CPUMASK_OFFSTACK option:

 - If CONFIG_CPUMASK_OFFSTACK=n, then nr_cpumask_bits is the same as
   NR_CPUS, which might not represent the # of CPUs that really exist
   (default 64). So, there's a chance of a gap between nr_cpu_ids
   and NR_CPUS, which ultimately lead towards invalid cpulist_parse()
   operation. For example, if isolcpus=9 is passed on an 8 cpu
   system (CONFIG_CPUMASK_OFFSTACK=n) it doesn't show the error
   that it's supposed to.

This patch fixes this bug by finding the last CPU of the passed
isolcpus= list and checking it against nr_cpu_ids.

It also fixes the error message where the nr_cpu_ids should be
nr_cpu_ids-1, since CPU numbering starts from 0.

Signed-off-by: Rakib Mullick <rakib.mullick@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: adobriyan@gmail.com
Cc: akpm@linux-foundation.org
Cc: longman@redhat.com
Cc: mka@chromium.org
Cc: tj@kernel.org
Link: http://lkml.kernel.org/r/20171023130154.9050-1-rakib.mullick@gmail.com
[ Enhanced the changelog and the kernel message. ]
Signed-off-by: Ingo Molnar <mingo@kernel.org>

 include/linux/cpumask.h |   16 ++++++++++++++++
 kernel/sched/topology.c |    4 ++--
 2 files changed, 18 insertions(+), 2 deletions(-)
---
 include/linux/cpumask.h | 16 ++++++++++++++++
 kernel/sched/topology.c |  4 ++--
 2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h
index cd415b7..63661de 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
+ * @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 e50450c..e3d31b0 100644
--- a/kernel/sched/topology.c
+++ b/kernel/sched/topology.c
@@ -476,8 +476,8 @@ static int __init isolated_cpu_setup(char *str)
 
 	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);
+	if (ret || cpumask_last(cpu_isolated_map) >= nr_cpu_ids) {
+		pr_err("sched: Error, all isolcpus= values must be between 0 and %u - ignoring them.\n", nr_cpu_ids-1);
 		return 0;
 	}
 	return 1;

^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2017-10-24 10:22 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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
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

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.