Patch "cpumask: use nr_cpumask_bits for parsing functions" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
cpumask: use nr_cpumask_bits for parsing functions
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
cpumask-use-nr_cpumask_bits-for-parsing-functions.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
4d59b6ccf000862beed6fc0765d3209f98a8d8a2Mon Sep 17 00:00:00 2001
From: Tejun Heo <[email protected]>
Date: Wed, 8 Feb 2017 14:30:56 -0800
Subject: cpumask: use nr_cpumask_bits for parsing functions
From: Tejun Heo <[email protected]>
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.
--- include/linux/cpumask.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
include/linux/cpumask.h +4 -4
@@ -556,7 +556,7 @@ static inline void cpumask_copy(struct cstatic inline int cpumask_parse_user (const char __user *buf,int len,struct cpumask *dstp) { -return bitmap_parse_user (buf, len,cpumask_bits (dstp), nr_cpu_ids); +return bitmap_parse_user (buf, len,cpumask_bits (dstp), nr_cpumask_bits); }/**
@@ -571,7 +571,7 @@ static inline int cpumask_parselist_user struct cpumask *dstp) {return bitmap_parselist_user (buf, len,cpumask_bits (dstp), - nr_cpu_ids); + nr_cpumask_bits); }/**
@@ -586,7 +586,7 @@ static inline int cpumask_parse(const chchar *nl =strchr (buf,'\n' );unsigned int len = nl ? (unsigned int )(nl - buf) :strlen (buf); -return bitmap_parse (buf, len,cpumask_bits (dstp), nr_cpu_ids); +return bitmap_parse (buf, len,cpumask_bits (dstp), nr_cpumask_bits); }/**
@@ -598,7 +598,7 @@ static inline int cpumask_parse(const ch*/ static inline int cpulist_parse (const char *buf,struct cpumask *dstp) { -return bitmap_parselist (buf,cpumask_bits (dstp), nr_cpu_ids); +return bitmap_parselist (buf,cpumask_bits (dstp), nr_cpumask_bits); }/**
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/cpumask-use-nr_cpumask_bits-for-parsing-functions.patch