lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Tue, 5 Jan 2021 16:49:52 -0800 From: paulmck@...nel.org To: linux-kernel@...r.kernel.org Cc: peterz@...radead.org, yury.norov@...il.com, kernel-team@...com, Paul Gortmaker <paul.gortmaker@...driver.com>, "Paul E . McKenney" <paulmck@...nel.org> Subject: [PATCH RFC cpumask 1/5] cpumask: Un-inline cpulist_parse for SMP; prepare for ascii helpers From: Paul Gortmaker <paul.gortmaker@...driver.com> In order to support convenience tokens like "all", and "none" and "last" in CPU lists, we'll have to use string operations and expand on what is currently a simple wrapper around the underlying bitmap function call. Rather than add header dependencies to cpumask.h and code more complex operations not really appropriate for a header file, we prepare by simply un-inlining it here and move it to the lib dir alongside the other more complex cpumask functions. Since lib/cpumask.c is built conditionally on CONFIG_SMP, and there are non-SMP callers, we leave the one-line stub behind for that case. If they want to check "0-0" is a valid range, they can still do it. In the meantime, we can add the ascii helpers for CONFIG_SMP users. The use of NR_CPUS vs. CONFIG_SMP is consistent with the existing file. Aside from an additional exported symbol in the SMP case, no functional changes are anticipated with this move. Signed-off-by: Paul Gortmaker <paul.gortmaker@...driver.com> Signed-off-by: Paul E. McKenney <paulmck@...nel.org> --- include/linux/cpumask.h | 8 ++++++++ lib/cpumask.c | 13 +++++++++++++ 2 files changed, 21 insertions(+) diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h index 383684e..1f506e2 100644 --- a/include/linux/cpumask.h +++ b/include/linux/cpumask.h @@ -685,11 +685,19 @@ static inline int cpumask_parse(const char *buf, struct cpumask *dstp) * @dstp: the cpumask to set. * * Returns -errno, or 0 for success. + * + * There are instances of non-SMP callers of this, and the easiest way + * to remain 100% runtime compatible is to let them continue to have the + * one-line stub, while the SMP version in lib/cpumask.c gets improved. */ +#if NR_CPUS == 1 static inline int cpulist_parse(const char *buf, struct cpumask *dstp) { return bitmap_parselist(buf, cpumask_bits(dstp), nr_cpumask_bits); } +#else +int cpulist_parse(const char *buf, struct cpumask *dstp); +#endif /** * cpumask_size - size to allocate for a 'struct cpumask' in bytes diff --git a/lib/cpumask.c b/lib/cpumask.c index 3592402..6e6e835 100644 --- a/lib/cpumask.c +++ b/lib/cpumask.c @@ -95,6 +95,19 @@ int cpumask_next_wrap(int n, const struct cpumask *mask, int start, bool wrap) } EXPORT_SYMBOL(cpumask_next_wrap); +/** + * cpulist_parse - extract a cpumask from a user string of ranges + * @buf: the buffer to extract from + * @dstp: the cpumask to set. + * + * Returns -errno, or 0 for success. + */ +int cpulist_parse(const char *buf, struct cpumask *dstp) +{ + return bitmap_parselist(buf, cpumask_bits(dstp), nr_cpumask_bits); +} +EXPORT_SYMBOL(cpulist_parse); + /* These are not inline because of header tangles. */ #ifdef CONFIG_CPUMASK_OFFSTACK /** -- 2.9.5
Powered by blists - more mailing lists