mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 04:18:39 +08:00
cpumask: split out include/linux/cpumask_types.h
Many core headers, like sched.h, include cpumask.h mostly for struct cpumask and cpumask_var_t. Those are frequently used headers and shouldn't pull more than the bare minimum. Link: https://lkml.kernel.org/r/20240528005648.182376-4-yury.norov@gmail.com Signed-off-by: Yury Norov <yury.norov@gmail.com> Cc: Amit Daniel Kachhap <amit.kachhap@gmail.com> Cc: Anna-Maria Behnsen <anna-maria@linutronix.de> Cc: Christoph Lameter <cl@linux.com> Cc: Daniel Lezcano <daniel.lezcano@linaro.org> Cc: Dennis Zhou <dennis@kernel.org> Cc: Frederic Weisbecker <frederic@kernel.org> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Juri Lelli <juri.lelli@redhat.com> Cc: Kees Cook <keescook@chromium.org> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Cc: Paul E. McKenney <paulmck@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Rafael J. Wysocki <rafael@kernel.org> Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk> Cc: Tejun Heo <tj@kernel.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ulf Hansson <ulf.hansson@linaro.org> Cc: Vincent Guittot <vincent.guittot@linaro.org> Cc: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
7c45d82826
commit
eb4faa36d6
@ -3730,6 +3730,7 @@ F: include/linux/bitmap-str.h
|
||||
F: include/linux/bitmap.h
|
||||
F: include/linux/bits.h
|
||||
F: include/linux/cpumask.h
|
||||
F: include/linux/cpumask_types.h
|
||||
F: include/linux/find.h
|
||||
F: include/linux/nodemask.h
|
||||
F: include/linux/nodemask_types.h
|
||||
|
@ -9,25 +9,13 @@
|
||||
*/
|
||||
#include <linux/cleanup.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/threads.h>
|
||||
#include <linux/bitmap.h>
|
||||
#include <linux/cpumask_types.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/gfp_types.h>
|
||||
#include <linux/numa.h>
|
||||
|
||||
/* Don't assign or return these: may not be this big! */
|
||||
typedef struct cpumask { DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t;
|
||||
|
||||
/**
|
||||
* cpumask_bits - get the bits in a cpumask
|
||||
* @maskp: the struct cpumask *
|
||||
*
|
||||
* You should only assume nr_cpu_ids bits of this mask are valid. This is
|
||||
* a macro so it's const-correct.
|
||||
*/
|
||||
#define cpumask_bits(maskp) ((maskp)->bits)
|
||||
|
||||
/**
|
||||
* cpumask_pr_args - printf args to output a cpumask
|
||||
* @maskp: cpumask to be printed
|
||||
@ -922,48 +910,7 @@ static inline unsigned int cpumask_size(void)
|
||||
return bitmap_size(large_cpumask_bits);
|
||||
}
|
||||
|
||||
/*
|
||||
* cpumask_var_t: struct cpumask for stack usage.
|
||||
*
|
||||
* Oh, the wicked games we play! In order to make kernel coding a
|
||||
* little more difficult, we typedef cpumask_var_t to an array or a
|
||||
* pointer: doing &mask on an array is a noop, so it still works.
|
||||
*
|
||||
* i.e.
|
||||
* cpumask_var_t tmpmask;
|
||||
* if (!alloc_cpumask_var(&tmpmask, GFP_KERNEL))
|
||||
* return -ENOMEM;
|
||||
*
|
||||
* ... use 'tmpmask' like a normal struct cpumask * ...
|
||||
*
|
||||
* free_cpumask_var(tmpmask);
|
||||
*
|
||||
*
|
||||
* However, one notable exception is there. alloc_cpumask_var() allocates
|
||||
* only nr_cpumask_bits bits (in the other hand, real cpumask_t always has
|
||||
* NR_CPUS bits). Therefore you don't have to dereference cpumask_var_t.
|
||||
*
|
||||
* cpumask_var_t tmpmask;
|
||||
* if (!alloc_cpumask_var(&tmpmask, GFP_KERNEL))
|
||||
* return -ENOMEM;
|
||||
*
|
||||
* var = *tmpmask;
|
||||
*
|
||||
* This code makes NR_CPUS length memcopy and brings to a memory corruption.
|
||||
* cpumask_copy() provide safe copy functionality.
|
||||
*
|
||||
* Note that there is another evil here: If you define a cpumask_var_t
|
||||
* as a percpu variable then the way to obtain the address of the cpumask
|
||||
* structure differently influences what this_cpu_* operation needs to be
|
||||
* used. Please use this_cpu_cpumask_var_t in those cases. The direct use
|
||||
* of this_cpu_ptr() or this_cpu_read() will lead to failures when the
|
||||
* other type of cpumask_var_t implementation is configured.
|
||||
*
|
||||
* Please also note that __cpumask_var_read_mostly can be used to declare
|
||||
* a cpumask_var_t variable itself (not its content) as read mostly.
|
||||
*/
|
||||
#ifdef CONFIG_CPUMASK_OFFSTACK
|
||||
typedef struct cpumask *cpumask_var_t;
|
||||
|
||||
#define this_cpu_cpumask_var_ptr(x) this_cpu_read(x)
|
||||
#define __cpumask_var_read_mostly __read_mostly
|
||||
@ -1010,7 +957,6 @@ static inline bool cpumask_available(cpumask_var_t mask)
|
||||
}
|
||||
|
||||
#else
|
||||
typedef struct cpumask cpumask_var_t[1];
|
||||
|
||||
#define this_cpu_cpumask_var_ptr(x) this_cpu_ptr(x)
|
||||
#define __cpumask_var_read_mostly
|
||||
|
66
include/linux/cpumask_types.h
Normal file
66
include/linux/cpumask_types.h
Normal file
@ -0,0 +1,66 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef __LINUX_CPUMASK_TYPES_H
|
||||
#define __LINUX_CPUMASK_TYPES_H
|
||||
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/threads.h>
|
||||
|
||||
/* Don't assign or return these: may not be this big! */
|
||||
typedef struct cpumask { DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t;
|
||||
|
||||
/**
|
||||
* cpumask_bits - get the bits in a cpumask
|
||||
* @maskp: the struct cpumask *
|
||||
*
|
||||
* You should only assume nr_cpu_ids bits of this mask are valid. This is
|
||||
* a macro so it's const-correct.
|
||||
*/
|
||||
#define cpumask_bits(maskp) ((maskp)->bits)
|
||||
|
||||
/*
|
||||
* cpumask_var_t: struct cpumask for stack usage.
|
||||
*
|
||||
* Oh, the wicked games we play! In order to make kernel coding a
|
||||
* little more difficult, we typedef cpumask_var_t to an array or a
|
||||
* pointer: doing &mask on an array is a noop, so it still works.
|
||||
*
|
||||
* i.e.
|
||||
* cpumask_var_t tmpmask;
|
||||
* if (!alloc_cpumask_var(&tmpmask, GFP_KERNEL))
|
||||
* return -ENOMEM;
|
||||
*
|
||||
* ... use 'tmpmask' like a normal struct cpumask * ...
|
||||
*
|
||||
* free_cpumask_var(tmpmask);
|
||||
*
|
||||
*
|
||||
* However, one notable exception is there. alloc_cpumask_var() allocates
|
||||
* only nr_cpumask_bits bits (in the other hand, real cpumask_t always has
|
||||
* NR_CPUS bits). Therefore you don't have to dereference cpumask_var_t.
|
||||
*
|
||||
* cpumask_var_t tmpmask;
|
||||
* if (!alloc_cpumask_var(&tmpmask, GFP_KERNEL))
|
||||
* return -ENOMEM;
|
||||
*
|
||||
* var = *tmpmask;
|
||||
*
|
||||
* This code makes NR_CPUS length memcopy and brings to a memory corruption.
|
||||
* cpumask_copy() provide safe copy functionality.
|
||||
*
|
||||
* Note that there is another evil here: If you define a cpumask_var_t
|
||||
* as a percpu variable then the way to obtain the address of the cpumask
|
||||
* structure differently influences what this_cpu_* operation needs to be
|
||||
* used. Please use this_cpu_cpumask_var_t in those cases. The direct use
|
||||
* of this_cpu_ptr() or this_cpu_read() will lead to failures when the
|
||||
* other type of cpumask_var_t implementation is configured.
|
||||
*
|
||||
* Please also note that __cpumask_var_read_mostly can be used to declare
|
||||
* a cpumask_var_t variable itself (not its content) as read mostly.
|
||||
*/
|
||||
#ifdef CONFIG_CPUMASK_OFFSTACK
|
||||
typedef struct cpumask *cpumask_var_t;
|
||||
#else
|
||||
typedef struct cpumask cpumask_var_t[1];
|
||||
#endif /* CONFIG_CPUMASK_OFFSTACK */
|
||||
|
||||
#endif /* __LINUX_CPUMASK_TYPES_H */
|
Loading…
Reference in New Issue
Block a user