1#include <linux/slab.h>
2#include <linux/kernel.h>
3#include <linux/bitops.h>
4#include <linux/cpumask.h>
5#include <linux/export.h>
6#include <linux/bootmem.h>
7
8int __first_cpu(const cpumask_t *srcp)
9{
10 return min_t(int, NR_CPUS, find_first_bit(srcp->bits, NR_CPUS));
11}
12EXPORT_SYMBOL(__first_cpu);
13
14int __next_cpu(int n, const cpumask_t *srcp)
15{
16 return min_t(int, NR_CPUS, find_next_bit(srcp->bits, NR_CPUS, n+1));
17}
18EXPORT_SYMBOL(__next_cpu);
19
20#if NR_CPUS > 64
21int __next_cpu_nr(int n, const cpumask_t *srcp)
22{
23 return min_t(int, nr_cpu_ids,
24 find_next_bit(srcp->bits, nr_cpu_ids, n+1));
25}
26EXPORT_SYMBOL(__next_cpu_nr);
27#endif
28
29
30
31
32
33
34
35
36
37int cpumask_next_and(int n, const struct cpumask *src1p,
38 const struct cpumask *src2p)
39{
40 while ((n = cpumask_next(n, src1p)) < nr_cpu_ids)
41 if (cpumask_test_cpu(n, src2p))
42 break;
43 return n;
44}
45EXPORT_SYMBOL(cpumask_next_and);
46
47
48
49
50
51
52
53
54
55int cpumask_any_but(const struct cpumask *mask, unsigned int cpu)
56{
57 unsigned int i;
58
59 cpumask_check(cpu);
60 for_each_cpu(i, mask)
61 if (i != cpu)
62 break;
63 return i;
64}
65
66
67#ifdef CONFIG_CPUMASK_OFFSTACK
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82bool alloc_cpumask_var_node(cpumask_var_t *mask, gfp_t flags, int node)
83{
84 *mask = kmalloc_node(cpumask_size(), flags, node);
85
86#ifdef CONFIG_DEBUG_PER_CPU_MAPS
87 if (!*mask) {
88 printk(KERN_ERR "=> alloc_cpumask_var: failed!\n");
89 dump_stack();
90 }
91#endif
92
93 if (*mask) {
94 unsigned char *ptr = (unsigned char *)cpumask_bits(*mask);
95 unsigned int tail;
96 tail = BITS_TO_LONGS(NR_CPUS - nr_cpumask_bits) * sizeof(long);
97 memset(ptr + cpumask_size() - tail, 0, tail);
98 }
99
100 return *mask != NULL;
101}
102EXPORT_SYMBOL(alloc_cpumask_var_node);
103
104bool zalloc_cpumask_var_node(cpumask_var_t *mask, gfp_t flags, int node)
105{
106 return alloc_cpumask_var_node(mask, flags | __GFP_ZERO, node);
107}
108EXPORT_SYMBOL(zalloc_cpumask_var_node);
109
110
111
112
113
114
115
116
117
118
119
120bool alloc_cpumask_var(cpumask_var_t *mask, gfp_t flags)
121{
122 return alloc_cpumask_var_node(mask, flags, NUMA_NO_NODE);
123}
124EXPORT_SYMBOL(alloc_cpumask_var);
125
126bool zalloc_cpumask_var(cpumask_var_t *mask, gfp_t flags)
127{
128 return alloc_cpumask_var(mask, flags | __GFP_ZERO);
129}
130EXPORT_SYMBOL(zalloc_cpumask_var);
131
132
133
134
135
136
137
138
139
140
141void __init alloc_bootmem_cpumask_var(cpumask_var_t *mask)
142{
143 *mask = alloc_bootmem(cpumask_size());
144}
145
146
147
148
149
150
151
152void free_cpumask_var(cpumask_var_t mask)
153{
154 kfree(mask);
155}
156EXPORT_SYMBOL(free_cpumask_var);
157
158
159
160
161
162void __init free_bootmem_cpumask_var(cpumask_var_t mask)
163{
164 free_bootmem(__pa(mask), cpumask_size());
165}
166#endif
167