xref: /kvmtool/include/linux/cpumask.h (revision 0febaae00bb6f8c5e694f87d6354fbcbe81e6653)
1*0febaae0SAlexandru Elisei #ifndef LINUX__CPUMASK_H
2*0febaae0SAlexandru Elisei #define LINUX__CPUMASK_H
3*0febaae0SAlexandru Elisei 
4*0febaae0SAlexandru Elisei #include <stdbool.h>
5*0febaae0SAlexandru Elisei 
6*0febaae0SAlexandru Elisei #include "linux/bitmap.h"
7*0febaae0SAlexandru Elisei #include "linux/find.h"
8*0febaae0SAlexandru Elisei #include "linux/kernel.h"
9*0febaae0SAlexandru Elisei 
10*0febaae0SAlexandru Elisei typedef struct cpumask { DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t;
11*0febaae0SAlexandru Elisei 
12*0febaae0SAlexandru Elisei #define cpumask_bits(maskp)	((maskp)->bits)
13*0febaae0SAlexandru Elisei 
14*0febaae0SAlexandru Elisei static inline void cpumask_set_cpu(int cpu, cpumask_t *dstp)
15*0febaae0SAlexandru Elisei {
16*0febaae0SAlexandru Elisei 	set_bit(cpu, cpumask_bits(dstp));
17*0febaae0SAlexandru Elisei }
18*0febaae0SAlexandru Elisei 
19*0febaae0SAlexandru Elisei static inline void cpumask_clear_cpu(int cpu, cpumask_t *dstp)
20*0febaae0SAlexandru Elisei {
21*0febaae0SAlexandru Elisei 	clear_bit(cpu, cpumask_bits(dstp));
22*0febaae0SAlexandru Elisei }
23*0febaae0SAlexandru Elisei 
24*0febaae0SAlexandru Elisei static inline bool cpumask_test_cpu(int cpu, const cpumask_t *cpumask)
25*0febaae0SAlexandru Elisei {
26*0febaae0SAlexandru Elisei 	return test_bit(cpu, cpumask_bits((cpumask)));
27*0febaae0SAlexandru Elisei }
28*0febaae0SAlexandru Elisei 
29*0febaae0SAlexandru Elisei static inline void cpumask_clear(cpumask_t *dstp)
30*0febaae0SAlexandru Elisei {
31*0febaae0SAlexandru Elisei 	bitmap_zero(cpumask_bits(dstp), NR_CPUS);
32*0febaae0SAlexandru Elisei }
33*0febaae0SAlexandru Elisei 
34*0febaae0SAlexandru Elisei static inline bool cpumask_and(cpumask_t *dstp, cpumask_t *src1p,
35*0febaae0SAlexandru Elisei 			       cpumask_t *src2p)
36*0febaae0SAlexandru Elisei {
37*0febaae0SAlexandru Elisei 	return bitmap_and(cpumask_bits(dstp), cpumask_bits(src1p),
38*0febaae0SAlexandru Elisei 			  cpumask_bits(src2p), NR_CPUS);
39*0febaae0SAlexandru Elisei }
40*0febaae0SAlexandru Elisei 
41*0febaae0SAlexandru Elisei static inline unsigned int cpumask_next(int n, const struct cpumask *srcp)
42*0febaae0SAlexandru Elisei {
43*0febaae0SAlexandru Elisei 	return find_next_bit(cpumask_bits(srcp), NR_CPUS, n + 1);
44*0febaae0SAlexandru Elisei }
45*0febaae0SAlexandru Elisei 
46*0febaae0SAlexandru Elisei #define for_each_cpu(cpu, maskp)			\
47*0febaae0SAlexandru Elisei 	for ((cpu) = -1;				\
48*0febaae0SAlexandru Elisei 	     (cpu) = cpumask_next((cpu), (maskp)),	\
49*0febaae0SAlexandru Elisei 	     (cpu) < NR_CPUS;)
50*0febaae0SAlexandru Elisei 
51*0febaae0SAlexandru Elisei static inline int cpulist_parse(const char *buf, cpumask_t *dstp)
52*0febaae0SAlexandru Elisei {
53*0febaae0SAlexandru Elisei 	return bitmap_parselist(buf, cpumask_bits(dstp), NR_CPUS);
54*0febaae0SAlexandru Elisei }
55*0febaae0SAlexandru Elisei 
56*0febaae0SAlexandru Elisei static inline bool cpumask_subset(const  cpumask_t *src1p,
57*0febaae0SAlexandru Elisei 				  const  cpumask_t *src2p)
58*0febaae0SAlexandru Elisei {
59*0febaae0SAlexandru Elisei 	return bitmap_subset(cpumask_bits(src1p), cpumask_bits(src2p), NR_CPUS);
60*0febaae0SAlexandru Elisei }
61*0febaae0SAlexandru Elisei 
62*0febaae0SAlexandru Elisei #endif /* LINUX__CPUMASK_H */
63