10febaae0SAlexandru Elisei #ifndef LINUX__CPUMASK_H
20febaae0SAlexandru Elisei #define LINUX__CPUMASK_H
30febaae0SAlexandru Elisei
40febaae0SAlexandru Elisei #include <stdbool.h>
50febaae0SAlexandru Elisei
60febaae0SAlexandru Elisei #include "linux/bitmap.h"
70febaae0SAlexandru Elisei #include "linux/find.h"
80febaae0SAlexandru Elisei #include "linux/kernel.h"
90febaae0SAlexandru Elisei
100febaae0SAlexandru Elisei typedef struct cpumask { DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t;
110febaae0SAlexandru Elisei
120febaae0SAlexandru Elisei #define cpumask_bits(maskp) ((maskp)->bits)
130febaae0SAlexandru Elisei
cpumask_size(void)14*4639b72fSAlexandru Elisei static inline unsigned int cpumask_size(void)
15*4639b72fSAlexandru Elisei {
16*4639b72fSAlexandru Elisei return BITS_TO_LONGS(NR_CPUS) * sizeof(long);
17*4639b72fSAlexandru Elisei }
18*4639b72fSAlexandru Elisei
cpumask_set_cpu(int cpu,cpumask_t * dstp)190febaae0SAlexandru Elisei static inline void cpumask_set_cpu(int cpu, cpumask_t *dstp)
200febaae0SAlexandru Elisei {
210febaae0SAlexandru Elisei set_bit(cpu, cpumask_bits(dstp));
220febaae0SAlexandru Elisei }
230febaae0SAlexandru Elisei
cpumask_clear_cpu(int cpu,cpumask_t * dstp)240febaae0SAlexandru Elisei static inline void cpumask_clear_cpu(int cpu, cpumask_t *dstp)
250febaae0SAlexandru Elisei {
260febaae0SAlexandru Elisei clear_bit(cpu, cpumask_bits(dstp));
270febaae0SAlexandru Elisei }
280febaae0SAlexandru Elisei
cpumask_test_cpu(int cpu,const cpumask_t * cpumask)290febaae0SAlexandru Elisei static inline bool cpumask_test_cpu(int cpu, const cpumask_t *cpumask)
300febaae0SAlexandru Elisei {
310febaae0SAlexandru Elisei return test_bit(cpu, cpumask_bits((cpumask)));
320febaae0SAlexandru Elisei }
330febaae0SAlexandru Elisei
cpumask_clear(cpumask_t * dstp)340febaae0SAlexandru Elisei static inline void cpumask_clear(cpumask_t *dstp)
350febaae0SAlexandru Elisei {
360febaae0SAlexandru Elisei bitmap_zero(cpumask_bits(dstp), NR_CPUS);
370febaae0SAlexandru Elisei }
380febaae0SAlexandru Elisei
cpumask_and(cpumask_t * dstp,cpumask_t * src1p,cpumask_t * src2p)390febaae0SAlexandru Elisei static inline bool cpumask_and(cpumask_t *dstp, cpumask_t *src1p,
400febaae0SAlexandru Elisei cpumask_t *src2p)
410febaae0SAlexandru Elisei {
420febaae0SAlexandru Elisei return bitmap_and(cpumask_bits(dstp), cpumask_bits(src1p),
430febaae0SAlexandru Elisei cpumask_bits(src2p), NR_CPUS);
440febaae0SAlexandru Elisei }
450febaae0SAlexandru Elisei
cpumask_next(int n,const struct cpumask * srcp)460febaae0SAlexandru Elisei static inline unsigned int cpumask_next(int n, const struct cpumask *srcp)
470febaae0SAlexandru Elisei {
480febaae0SAlexandru Elisei return find_next_bit(cpumask_bits(srcp), NR_CPUS, n + 1);
490febaae0SAlexandru Elisei }
500febaae0SAlexandru Elisei
510febaae0SAlexandru Elisei #define for_each_cpu(cpu, maskp) \
520febaae0SAlexandru Elisei for ((cpu) = -1; \
530febaae0SAlexandru Elisei (cpu) = cpumask_next((cpu), (maskp)), \
540febaae0SAlexandru Elisei (cpu) < NR_CPUS;)
550febaae0SAlexandru Elisei
cpulist_parse(const char * buf,cpumask_t * dstp)560febaae0SAlexandru Elisei static inline int cpulist_parse(const char *buf, cpumask_t *dstp)
570febaae0SAlexandru Elisei {
580febaae0SAlexandru Elisei return bitmap_parselist(buf, cpumask_bits(dstp), NR_CPUS);
590febaae0SAlexandru Elisei }
600febaae0SAlexandru Elisei
cpumask_subset(const cpumask_t * src1p,const cpumask_t * src2p)610febaae0SAlexandru Elisei static inline bool cpumask_subset(const cpumask_t *src1p,
620febaae0SAlexandru Elisei const cpumask_t *src2p)
630febaae0SAlexandru Elisei {
640febaae0SAlexandru Elisei return bitmap_subset(cpumask_bits(src1p), cpumask_bits(src2p), NR_CPUS);
650febaae0SAlexandru Elisei }
660febaae0SAlexandru Elisei
670febaae0SAlexandru Elisei #endif /* LINUX__CPUMASK_H */
68