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