diff options
author | Tejun Heo <tj@kernel.org> | 2017-02-08 17:30:56 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-02-14 18:25:34 -0500 |
commit | c4236b0c71169b6e5fb5f2272dd0292156c81e97 (patch) | |
tree | d8598dbfc6e89c24365a7200c371183779bb841b /include/linux/cpumask.h | |
parent | d2485c03ce8db7246e2b00cb8d9af82cea32ab60 (diff) |
cpumask: use nr_cpumask_bits for parsing functions
commit 4d59b6ccf000862beed6fc0765d3209f98a8d8a2 upstream.
Commit 513e3d2d11c9 ("cpumask: always use nr_cpu_ids in formatting and
parsing functions") converted both cpumask printing and parsing
functions to use nr_cpu_ids instead of nr_cpumask_bits. While this was
okay for the printing functions as it just picked one of the two output
formats that we were alternating between depending on a kernel config,
doing the same for parsing wasn't okay.
nr_cpumask_bits can be either nr_cpu_ids or NR_CPUS. We can always use
nr_cpu_ids but that is a variable while NR_CPUS is a constant, so it can
be more efficient to use NR_CPUS when we can get away with it.
Converting the printing functions to nr_cpu_ids makes sense because it
affects how the masks get presented to userspace and doesn't break
anything; however, using nr_cpu_ids for parsing functions can
incorrectly leave the higher bits uninitialized while reading in these
masks from userland. As all testing and comparison functions use
nr_cpumask_bits which can be larger than nr_cpu_ids, the parsed cpumasks
can erroneously yield false negative results.
This made the taskstats interface incorrectly return -EINVAL even when
the inputs were correct.
Fix it by restoring the parse functions to use nr_cpumask_bits instead
of nr_cpu_ids.
Link: http://lkml.kernel.org/r/20170206182442.GB31078@htj.duckdns.org
Fixes: 513e3d2d11c9 ("cpumask: always use nr_cpu_ids in formatting and parsing functions")
Signed-off-by: Tejun Heo <tj@kernel.org>
Reported-by: Martin Steigerwald <martin.steigerwald@teamix.de>
Debugged-by: Ben Hutchings <ben.hutchings@codethink.co.uk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'include/linux/cpumask.h')
-rw-r--r-- | include/linux/cpumask.h | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h index da7fbf1cdd56..fa3b155ce7e1 100644 --- a/include/linux/cpumask.h +++ b/include/linux/cpumask.h | |||
@@ -560,7 +560,7 @@ static inline void cpumask_copy(struct cpumask *dstp, | |||
560 | static inline int cpumask_parse_user(const char __user *buf, int len, | 560 | static inline int cpumask_parse_user(const char __user *buf, int len, |
561 | struct cpumask *dstp) | 561 | struct cpumask *dstp) |
562 | { | 562 | { |
563 | return bitmap_parse_user(buf, len, cpumask_bits(dstp), nr_cpu_ids); | 563 | return bitmap_parse_user(buf, len, cpumask_bits(dstp), nr_cpumask_bits); |
564 | } | 564 | } |
565 | 565 | ||
566 | /** | 566 | /** |
@@ -575,7 +575,7 @@ static inline int cpumask_parselist_user(const char __user *buf, int len, | |||
575 | struct cpumask *dstp) | 575 | struct cpumask *dstp) |
576 | { | 576 | { |
577 | return bitmap_parselist_user(buf, len, cpumask_bits(dstp), | 577 | return bitmap_parselist_user(buf, len, cpumask_bits(dstp), |
578 | nr_cpu_ids); | 578 | nr_cpumask_bits); |
579 | } | 579 | } |
580 | 580 | ||
581 | /** | 581 | /** |
@@ -590,7 +590,7 @@ static inline int cpumask_parse(const char *buf, struct cpumask *dstp) | |||
590 | char *nl = strchr(buf, '\n'); | 590 | char *nl = strchr(buf, '\n'); |
591 | unsigned int len = nl ? (unsigned int)(nl - buf) : strlen(buf); | 591 | unsigned int len = nl ? (unsigned int)(nl - buf) : strlen(buf); |
592 | 592 | ||
593 | return bitmap_parse(buf, len, cpumask_bits(dstp), nr_cpu_ids); | 593 | return bitmap_parse(buf, len, cpumask_bits(dstp), nr_cpumask_bits); |
594 | } | 594 | } |
595 | 595 | ||
596 | /** | 596 | /** |
@@ -602,7 +602,7 @@ static inline int cpumask_parse(const char *buf, struct cpumask *dstp) | |||
602 | */ | 602 | */ |
603 | static inline int cpulist_parse(const char *buf, struct cpumask *dstp) | 603 | static inline int cpulist_parse(const char *buf, struct cpumask *dstp) |
604 | { | 604 | { |
605 | return bitmap_parselist(buf, cpumask_bits(dstp), nr_cpu_ids); | 605 | return bitmap_parselist(buf, cpumask_bits(dstp), nr_cpumask_bits); |
606 | } | 606 | } |
607 | 607 | ||
608 | /** | 608 | /** |