Commit 9a86e2bad0b9fbf3290ae496da6dab9536dd6bf7
Committed by
Linus Torvalds
1 parent
a069c266ae
Exists in
master
and in
7 other branches
lib: fix first line of kernel-doc for a few functions
The function name must be followed by a space, hypen, space, and a short description. Signed-off-by: Ben Hutchings <ben@decadent.org.uk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 2 changed files with 6 additions and 6 deletions Inline Diff
include/linux/list.h
1 | #ifndef _LINUX_LIST_H | 1 | #ifndef _LINUX_LIST_H |
2 | #define _LINUX_LIST_H | 2 | #define _LINUX_LIST_H |
3 | 3 | ||
4 | #include <linux/stddef.h> | 4 | #include <linux/stddef.h> |
5 | #include <linux/poison.h> | 5 | #include <linux/poison.h> |
6 | #include <linux/prefetch.h> | 6 | #include <linux/prefetch.h> |
7 | #include <asm/system.h> | 7 | #include <asm/system.h> |
8 | 8 | ||
9 | /* | 9 | /* |
10 | * Simple doubly linked list implementation. | 10 | * Simple doubly linked list implementation. |
11 | * | 11 | * |
12 | * Some of the internal functions ("__xxx") are useful when | 12 | * Some of the internal functions ("__xxx") are useful when |
13 | * manipulating whole lists rather than single entries, as | 13 | * manipulating whole lists rather than single entries, as |
14 | * sometimes we already know the next/prev entries and we can | 14 | * sometimes we already know the next/prev entries and we can |
15 | * generate better code by using them directly rather than | 15 | * generate better code by using them directly rather than |
16 | * using the generic single-entry routines. | 16 | * using the generic single-entry routines. |
17 | */ | 17 | */ |
18 | 18 | ||
19 | struct list_head { | 19 | struct list_head { |
20 | struct list_head *next, *prev; | 20 | struct list_head *next, *prev; |
21 | }; | 21 | }; |
22 | 22 | ||
23 | #define LIST_HEAD_INIT(name) { &(name), &(name) } | 23 | #define LIST_HEAD_INIT(name) { &(name), &(name) } |
24 | 24 | ||
25 | #define LIST_HEAD(name) \ | 25 | #define LIST_HEAD(name) \ |
26 | struct list_head name = LIST_HEAD_INIT(name) | 26 | struct list_head name = LIST_HEAD_INIT(name) |
27 | 27 | ||
28 | static inline void INIT_LIST_HEAD(struct list_head *list) | 28 | static inline void INIT_LIST_HEAD(struct list_head *list) |
29 | { | 29 | { |
30 | list->next = list; | 30 | list->next = list; |
31 | list->prev = list; | 31 | list->prev = list; |
32 | } | 32 | } |
33 | 33 | ||
34 | /* | 34 | /* |
35 | * Insert a new entry between two known consecutive entries. | 35 | * Insert a new entry between two known consecutive entries. |
36 | * | 36 | * |
37 | * This is only for internal list manipulation where we know | 37 | * This is only for internal list manipulation where we know |
38 | * the prev/next entries already! | 38 | * the prev/next entries already! |
39 | */ | 39 | */ |
40 | #ifndef CONFIG_DEBUG_LIST | 40 | #ifndef CONFIG_DEBUG_LIST |
41 | static inline void __list_add(struct list_head *new, | 41 | static inline void __list_add(struct list_head *new, |
42 | struct list_head *prev, | 42 | struct list_head *prev, |
43 | struct list_head *next) | 43 | struct list_head *next) |
44 | { | 44 | { |
45 | next->prev = new; | 45 | next->prev = new; |
46 | new->next = next; | 46 | new->next = next; |
47 | new->prev = prev; | 47 | new->prev = prev; |
48 | prev->next = new; | 48 | prev->next = new; |
49 | } | 49 | } |
50 | #else | 50 | #else |
51 | extern void __list_add(struct list_head *new, | 51 | extern void __list_add(struct list_head *new, |
52 | struct list_head *prev, | 52 | struct list_head *prev, |
53 | struct list_head *next); | 53 | struct list_head *next); |
54 | #endif | 54 | #endif |
55 | 55 | ||
56 | /** | 56 | /** |
57 | * list_add - add a new entry | 57 | * list_add - add a new entry |
58 | * @new: new entry to be added | 58 | * @new: new entry to be added |
59 | * @head: list head to add it after | 59 | * @head: list head to add it after |
60 | * | 60 | * |
61 | * Insert a new entry after the specified head. | 61 | * Insert a new entry after the specified head. |
62 | * This is good for implementing stacks. | 62 | * This is good for implementing stacks. |
63 | */ | 63 | */ |
64 | static inline void list_add(struct list_head *new, struct list_head *head) | 64 | static inline void list_add(struct list_head *new, struct list_head *head) |
65 | { | 65 | { |
66 | __list_add(new, head, head->next); | 66 | __list_add(new, head, head->next); |
67 | } | 67 | } |
68 | 68 | ||
69 | 69 | ||
70 | /** | 70 | /** |
71 | * list_add_tail - add a new entry | 71 | * list_add_tail - add a new entry |
72 | * @new: new entry to be added | 72 | * @new: new entry to be added |
73 | * @head: list head to add it before | 73 | * @head: list head to add it before |
74 | * | 74 | * |
75 | * Insert a new entry before the specified head. | 75 | * Insert a new entry before the specified head. |
76 | * This is useful for implementing queues. | 76 | * This is useful for implementing queues. |
77 | */ | 77 | */ |
78 | static inline void list_add_tail(struct list_head *new, struct list_head *head) | 78 | static inline void list_add_tail(struct list_head *new, struct list_head *head) |
79 | { | 79 | { |
80 | __list_add(new, head->prev, head); | 80 | __list_add(new, head->prev, head); |
81 | } | 81 | } |
82 | 82 | ||
83 | /* | 83 | /* |
84 | * Delete a list entry by making the prev/next entries | 84 | * Delete a list entry by making the prev/next entries |
85 | * point to each other. | 85 | * point to each other. |
86 | * | 86 | * |
87 | * This is only for internal list manipulation where we know | 87 | * This is only for internal list manipulation where we know |
88 | * the prev/next entries already! | 88 | * the prev/next entries already! |
89 | */ | 89 | */ |
90 | static inline void __list_del(struct list_head * prev, struct list_head * next) | 90 | static inline void __list_del(struct list_head * prev, struct list_head * next) |
91 | { | 91 | { |
92 | next->prev = prev; | 92 | next->prev = prev; |
93 | prev->next = next; | 93 | prev->next = next; |
94 | } | 94 | } |
95 | 95 | ||
96 | /** | 96 | /** |
97 | * list_del - deletes entry from list. | 97 | * list_del - deletes entry from list. |
98 | * @entry: the element to delete from the list. | 98 | * @entry: the element to delete from the list. |
99 | * Note: list_empty() on entry does not return true after this, the entry is | 99 | * Note: list_empty() on entry does not return true after this, the entry is |
100 | * in an undefined state. | 100 | * in an undefined state. |
101 | */ | 101 | */ |
102 | #ifndef CONFIG_DEBUG_LIST | 102 | #ifndef CONFIG_DEBUG_LIST |
103 | static inline void list_del(struct list_head *entry) | 103 | static inline void list_del(struct list_head *entry) |
104 | { | 104 | { |
105 | __list_del(entry->prev, entry->next); | 105 | __list_del(entry->prev, entry->next); |
106 | entry->next = LIST_POISON1; | 106 | entry->next = LIST_POISON1; |
107 | entry->prev = LIST_POISON2; | 107 | entry->prev = LIST_POISON2; |
108 | } | 108 | } |
109 | #else | 109 | #else |
110 | extern void list_del(struct list_head *entry); | 110 | extern void list_del(struct list_head *entry); |
111 | #endif | 111 | #endif |
112 | 112 | ||
113 | /** | 113 | /** |
114 | * list_replace - replace old entry by new one | 114 | * list_replace - replace old entry by new one |
115 | * @old : the element to be replaced | 115 | * @old : the element to be replaced |
116 | * @new : the new element to insert | 116 | * @new : the new element to insert |
117 | * | 117 | * |
118 | * If @old was empty, it will be overwritten. | 118 | * If @old was empty, it will be overwritten. |
119 | */ | 119 | */ |
120 | static inline void list_replace(struct list_head *old, | 120 | static inline void list_replace(struct list_head *old, |
121 | struct list_head *new) | 121 | struct list_head *new) |
122 | { | 122 | { |
123 | new->next = old->next; | 123 | new->next = old->next; |
124 | new->next->prev = new; | 124 | new->next->prev = new; |
125 | new->prev = old->prev; | 125 | new->prev = old->prev; |
126 | new->prev->next = new; | 126 | new->prev->next = new; |
127 | } | 127 | } |
128 | 128 | ||
129 | static inline void list_replace_init(struct list_head *old, | 129 | static inline void list_replace_init(struct list_head *old, |
130 | struct list_head *new) | 130 | struct list_head *new) |
131 | { | 131 | { |
132 | list_replace(old, new); | 132 | list_replace(old, new); |
133 | INIT_LIST_HEAD(old); | 133 | INIT_LIST_HEAD(old); |
134 | } | 134 | } |
135 | 135 | ||
136 | /** | 136 | /** |
137 | * list_del_init - deletes entry from list and reinitialize it. | 137 | * list_del_init - deletes entry from list and reinitialize it. |
138 | * @entry: the element to delete from the list. | 138 | * @entry: the element to delete from the list. |
139 | */ | 139 | */ |
140 | static inline void list_del_init(struct list_head *entry) | 140 | static inline void list_del_init(struct list_head *entry) |
141 | { | 141 | { |
142 | __list_del(entry->prev, entry->next); | 142 | __list_del(entry->prev, entry->next); |
143 | INIT_LIST_HEAD(entry); | 143 | INIT_LIST_HEAD(entry); |
144 | } | 144 | } |
145 | 145 | ||
146 | /** | 146 | /** |
147 | * list_move - delete from one list and add as another's head | 147 | * list_move - delete from one list and add as another's head |
148 | * @list: the entry to move | 148 | * @list: the entry to move |
149 | * @head: the head that will precede our entry | 149 | * @head: the head that will precede our entry |
150 | */ | 150 | */ |
151 | static inline void list_move(struct list_head *list, struct list_head *head) | 151 | static inline void list_move(struct list_head *list, struct list_head *head) |
152 | { | 152 | { |
153 | __list_del(list->prev, list->next); | 153 | __list_del(list->prev, list->next); |
154 | list_add(list, head); | 154 | list_add(list, head); |
155 | } | 155 | } |
156 | 156 | ||
157 | /** | 157 | /** |
158 | * list_move_tail - delete from one list and add as another's tail | 158 | * list_move_tail - delete from one list and add as another's tail |
159 | * @list: the entry to move | 159 | * @list: the entry to move |
160 | * @head: the head that will follow our entry | 160 | * @head: the head that will follow our entry |
161 | */ | 161 | */ |
162 | static inline void list_move_tail(struct list_head *list, | 162 | static inline void list_move_tail(struct list_head *list, |
163 | struct list_head *head) | 163 | struct list_head *head) |
164 | { | 164 | { |
165 | __list_del(list->prev, list->next); | 165 | __list_del(list->prev, list->next); |
166 | list_add_tail(list, head); | 166 | list_add_tail(list, head); |
167 | } | 167 | } |
168 | 168 | ||
169 | /** | 169 | /** |
170 | * list_is_last - tests whether @list is the last entry in list @head | 170 | * list_is_last - tests whether @list is the last entry in list @head |
171 | * @list: the entry to test | 171 | * @list: the entry to test |
172 | * @head: the head of the list | 172 | * @head: the head of the list |
173 | */ | 173 | */ |
174 | static inline int list_is_last(const struct list_head *list, | 174 | static inline int list_is_last(const struct list_head *list, |
175 | const struct list_head *head) | 175 | const struct list_head *head) |
176 | { | 176 | { |
177 | return list->next == head; | 177 | return list->next == head; |
178 | } | 178 | } |
179 | 179 | ||
180 | /** | 180 | /** |
181 | * list_empty - tests whether a list is empty | 181 | * list_empty - tests whether a list is empty |
182 | * @head: the list to test. | 182 | * @head: the list to test. |
183 | */ | 183 | */ |
184 | static inline int list_empty(const struct list_head *head) | 184 | static inline int list_empty(const struct list_head *head) |
185 | { | 185 | { |
186 | return head->next == head; | 186 | return head->next == head; |
187 | } | 187 | } |
188 | 188 | ||
189 | /** | 189 | /** |
190 | * list_empty_careful - tests whether a list is empty and not being modified | 190 | * list_empty_careful - tests whether a list is empty and not being modified |
191 | * @head: the list to test | 191 | * @head: the list to test |
192 | * | 192 | * |
193 | * Description: | 193 | * Description: |
194 | * tests whether a list is empty _and_ checks that no other CPU might be | 194 | * tests whether a list is empty _and_ checks that no other CPU might be |
195 | * in the process of modifying either member (next or prev) | 195 | * in the process of modifying either member (next or prev) |
196 | * | 196 | * |
197 | * NOTE: using list_empty_careful() without synchronization | 197 | * NOTE: using list_empty_careful() without synchronization |
198 | * can only be safe if the only activity that can happen | 198 | * can only be safe if the only activity that can happen |
199 | * to the list entry is list_del_init(). Eg. it cannot be used | 199 | * to the list entry is list_del_init(). Eg. it cannot be used |
200 | * if another CPU could re-list_add() it. | 200 | * if another CPU could re-list_add() it. |
201 | */ | 201 | */ |
202 | static inline int list_empty_careful(const struct list_head *head) | 202 | static inline int list_empty_careful(const struct list_head *head) |
203 | { | 203 | { |
204 | struct list_head *next = head->next; | 204 | struct list_head *next = head->next; |
205 | return (next == head) && (next == head->prev); | 205 | return (next == head) && (next == head->prev); |
206 | } | 206 | } |
207 | 207 | ||
208 | /** | 208 | /** |
209 | * list_rotate_left - rotate the list to the left | 209 | * list_rotate_left - rotate the list to the left |
210 | * @head: the head of the list | 210 | * @head: the head of the list |
211 | */ | 211 | */ |
212 | static inline void list_rotate_left(struct list_head *head) | 212 | static inline void list_rotate_left(struct list_head *head) |
213 | { | 213 | { |
214 | struct list_head *first; | 214 | struct list_head *first; |
215 | 215 | ||
216 | if (!list_empty(head)) { | 216 | if (!list_empty(head)) { |
217 | first = head->next; | 217 | first = head->next; |
218 | list_move_tail(first, head); | 218 | list_move_tail(first, head); |
219 | } | 219 | } |
220 | } | 220 | } |
221 | 221 | ||
222 | /** | 222 | /** |
223 | * list_is_singular - tests whether a list has just one entry. | 223 | * list_is_singular - tests whether a list has just one entry. |
224 | * @head: the list to test. | 224 | * @head: the list to test. |
225 | */ | 225 | */ |
226 | static inline int list_is_singular(const struct list_head *head) | 226 | static inline int list_is_singular(const struct list_head *head) |
227 | { | 227 | { |
228 | return !list_empty(head) && (head->next == head->prev); | 228 | return !list_empty(head) && (head->next == head->prev); |
229 | } | 229 | } |
230 | 230 | ||
231 | static inline void __list_cut_position(struct list_head *list, | 231 | static inline void __list_cut_position(struct list_head *list, |
232 | struct list_head *head, struct list_head *entry) | 232 | struct list_head *head, struct list_head *entry) |
233 | { | 233 | { |
234 | struct list_head *new_first = entry->next; | 234 | struct list_head *new_first = entry->next; |
235 | list->next = head->next; | 235 | list->next = head->next; |
236 | list->next->prev = list; | 236 | list->next->prev = list; |
237 | list->prev = entry; | 237 | list->prev = entry; |
238 | entry->next = list; | 238 | entry->next = list; |
239 | head->next = new_first; | 239 | head->next = new_first; |
240 | new_first->prev = head; | 240 | new_first->prev = head; |
241 | } | 241 | } |
242 | 242 | ||
243 | /** | 243 | /** |
244 | * list_cut_position - cut a list into two | 244 | * list_cut_position - cut a list into two |
245 | * @list: a new list to add all removed entries | 245 | * @list: a new list to add all removed entries |
246 | * @head: a list with entries | 246 | * @head: a list with entries |
247 | * @entry: an entry within head, could be the head itself | 247 | * @entry: an entry within head, could be the head itself |
248 | * and if so we won't cut the list | 248 | * and if so we won't cut the list |
249 | * | 249 | * |
250 | * This helper moves the initial part of @head, up to and | 250 | * This helper moves the initial part of @head, up to and |
251 | * including @entry, from @head to @list. You should | 251 | * including @entry, from @head to @list. You should |
252 | * pass on @entry an element you know is on @head. @list | 252 | * pass on @entry an element you know is on @head. @list |
253 | * should be an empty list or a list you do not care about | 253 | * should be an empty list or a list you do not care about |
254 | * losing its data. | 254 | * losing its data. |
255 | * | 255 | * |
256 | */ | 256 | */ |
257 | static inline void list_cut_position(struct list_head *list, | 257 | static inline void list_cut_position(struct list_head *list, |
258 | struct list_head *head, struct list_head *entry) | 258 | struct list_head *head, struct list_head *entry) |
259 | { | 259 | { |
260 | if (list_empty(head)) | 260 | if (list_empty(head)) |
261 | return; | 261 | return; |
262 | if (list_is_singular(head) && | 262 | if (list_is_singular(head) && |
263 | (head->next != entry && head != entry)) | 263 | (head->next != entry && head != entry)) |
264 | return; | 264 | return; |
265 | if (entry == head) | 265 | if (entry == head) |
266 | INIT_LIST_HEAD(list); | 266 | INIT_LIST_HEAD(list); |
267 | else | 267 | else |
268 | __list_cut_position(list, head, entry); | 268 | __list_cut_position(list, head, entry); |
269 | } | 269 | } |
270 | 270 | ||
271 | static inline void __list_splice(const struct list_head *list, | 271 | static inline void __list_splice(const struct list_head *list, |
272 | struct list_head *prev, | 272 | struct list_head *prev, |
273 | struct list_head *next) | 273 | struct list_head *next) |
274 | { | 274 | { |
275 | struct list_head *first = list->next; | 275 | struct list_head *first = list->next; |
276 | struct list_head *last = list->prev; | 276 | struct list_head *last = list->prev; |
277 | 277 | ||
278 | first->prev = prev; | 278 | first->prev = prev; |
279 | prev->next = first; | 279 | prev->next = first; |
280 | 280 | ||
281 | last->next = next; | 281 | last->next = next; |
282 | next->prev = last; | 282 | next->prev = last; |
283 | } | 283 | } |
284 | 284 | ||
285 | /** | 285 | /** |
286 | * list_splice - join two lists, this is designed for stacks | 286 | * list_splice - join two lists, this is designed for stacks |
287 | * @list: the new list to add. | 287 | * @list: the new list to add. |
288 | * @head: the place to add it in the first list. | 288 | * @head: the place to add it in the first list. |
289 | */ | 289 | */ |
290 | static inline void list_splice(const struct list_head *list, | 290 | static inline void list_splice(const struct list_head *list, |
291 | struct list_head *head) | 291 | struct list_head *head) |
292 | { | 292 | { |
293 | if (!list_empty(list)) | 293 | if (!list_empty(list)) |
294 | __list_splice(list, head, head->next); | 294 | __list_splice(list, head, head->next); |
295 | } | 295 | } |
296 | 296 | ||
297 | /** | 297 | /** |
298 | * list_splice_tail - join two lists, each list being a queue | 298 | * list_splice_tail - join two lists, each list being a queue |
299 | * @list: the new list to add. | 299 | * @list: the new list to add. |
300 | * @head: the place to add it in the first list. | 300 | * @head: the place to add it in the first list. |
301 | */ | 301 | */ |
302 | static inline void list_splice_tail(struct list_head *list, | 302 | static inline void list_splice_tail(struct list_head *list, |
303 | struct list_head *head) | 303 | struct list_head *head) |
304 | { | 304 | { |
305 | if (!list_empty(list)) | 305 | if (!list_empty(list)) |
306 | __list_splice(list, head->prev, head); | 306 | __list_splice(list, head->prev, head); |
307 | } | 307 | } |
308 | 308 | ||
309 | /** | 309 | /** |
310 | * list_splice_init - join two lists and reinitialise the emptied list. | 310 | * list_splice_init - join two lists and reinitialise the emptied list. |
311 | * @list: the new list to add. | 311 | * @list: the new list to add. |
312 | * @head: the place to add it in the first list. | 312 | * @head: the place to add it in the first list. |
313 | * | 313 | * |
314 | * The list at @list is reinitialised | 314 | * The list at @list is reinitialised |
315 | */ | 315 | */ |
316 | static inline void list_splice_init(struct list_head *list, | 316 | static inline void list_splice_init(struct list_head *list, |
317 | struct list_head *head) | 317 | struct list_head *head) |
318 | { | 318 | { |
319 | if (!list_empty(list)) { | 319 | if (!list_empty(list)) { |
320 | __list_splice(list, head, head->next); | 320 | __list_splice(list, head, head->next); |
321 | INIT_LIST_HEAD(list); | 321 | INIT_LIST_HEAD(list); |
322 | } | 322 | } |
323 | } | 323 | } |
324 | 324 | ||
325 | /** | 325 | /** |
326 | * list_splice_tail_init - join two lists and reinitialise the emptied list | 326 | * list_splice_tail_init - join two lists and reinitialise the emptied list |
327 | * @list: the new list to add. | 327 | * @list: the new list to add. |
328 | * @head: the place to add it in the first list. | 328 | * @head: the place to add it in the first list. |
329 | * | 329 | * |
330 | * Each of the lists is a queue. | 330 | * Each of the lists is a queue. |
331 | * The list at @list is reinitialised | 331 | * The list at @list is reinitialised |
332 | */ | 332 | */ |
333 | static inline void list_splice_tail_init(struct list_head *list, | 333 | static inline void list_splice_tail_init(struct list_head *list, |
334 | struct list_head *head) | 334 | struct list_head *head) |
335 | { | 335 | { |
336 | if (!list_empty(list)) { | 336 | if (!list_empty(list)) { |
337 | __list_splice(list, head->prev, head); | 337 | __list_splice(list, head->prev, head); |
338 | INIT_LIST_HEAD(list); | 338 | INIT_LIST_HEAD(list); |
339 | } | 339 | } |
340 | } | 340 | } |
341 | 341 | ||
342 | /** | 342 | /** |
343 | * list_entry - get the struct for this entry | 343 | * list_entry - get the struct for this entry |
344 | * @ptr: the &struct list_head pointer. | 344 | * @ptr: the &struct list_head pointer. |
345 | * @type: the type of the struct this is embedded in. | 345 | * @type: the type of the struct this is embedded in. |
346 | * @member: the name of the list_struct within the struct. | 346 | * @member: the name of the list_struct within the struct. |
347 | */ | 347 | */ |
348 | #define list_entry(ptr, type, member) \ | 348 | #define list_entry(ptr, type, member) \ |
349 | container_of(ptr, type, member) | 349 | container_of(ptr, type, member) |
350 | 350 | ||
351 | /** | 351 | /** |
352 | * list_first_entry - get the first element from a list | 352 | * list_first_entry - get the first element from a list |
353 | * @ptr: the list head to take the element from. | 353 | * @ptr: the list head to take the element from. |
354 | * @type: the type of the struct this is embedded in. | 354 | * @type: the type of the struct this is embedded in. |
355 | * @member: the name of the list_struct within the struct. | 355 | * @member: the name of the list_struct within the struct. |
356 | * | 356 | * |
357 | * Note, that list is expected to be not empty. | 357 | * Note, that list is expected to be not empty. |
358 | */ | 358 | */ |
359 | #define list_first_entry(ptr, type, member) \ | 359 | #define list_first_entry(ptr, type, member) \ |
360 | list_entry((ptr)->next, type, member) | 360 | list_entry((ptr)->next, type, member) |
361 | 361 | ||
362 | /** | 362 | /** |
363 | * list_for_each - iterate over a list | 363 | * list_for_each - iterate over a list |
364 | * @pos: the &struct list_head to use as a loop cursor. | 364 | * @pos: the &struct list_head to use as a loop cursor. |
365 | * @head: the head for your list. | 365 | * @head: the head for your list. |
366 | */ | 366 | */ |
367 | #define list_for_each(pos, head) \ | 367 | #define list_for_each(pos, head) \ |
368 | for (pos = (head)->next; prefetch(pos->next), pos != (head); \ | 368 | for (pos = (head)->next; prefetch(pos->next), pos != (head); \ |
369 | pos = pos->next) | 369 | pos = pos->next) |
370 | 370 | ||
371 | /** | 371 | /** |
372 | * __list_for_each - iterate over a list | 372 | * __list_for_each - iterate over a list |
373 | * @pos: the &struct list_head to use as a loop cursor. | 373 | * @pos: the &struct list_head to use as a loop cursor. |
374 | * @head: the head for your list. | 374 | * @head: the head for your list. |
375 | * | 375 | * |
376 | * This variant differs from list_for_each() in that it's the | 376 | * This variant differs from list_for_each() in that it's the |
377 | * simplest possible list iteration code, no prefetching is done. | 377 | * simplest possible list iteration code, no prefetching is done. |
378 | * Use this for code that knows the list to be very short (empty | 378 | * Use this for code that knows the list to be very short (empty |
379 | * or 1 entry) most of the time. | 379 | * or 1 entry) most of the time. |
380 | */ | 380 | */ |
381 | #define __list_for_each(pos, head) \ | 381 | #define __list_for_each(pos, head) \ |
382 | for (pos = (head)->next; pos != (head); pos = pos->next) | 382 | for (pos = (head)->next; pos != (head); pos = pos->next) |
383 | 383 | ||
384 | /** | 384 | /** |
385 | * list_for_each_prev - iterate over a list backwards | 385 | * list_for_each_prev - iterate over a list backwards |
386 | * @pos: the &struct list_head to use as a loop cursor. | 386 | * @pos: the &struct list_head to use as a loop cursor. |
387 | * @head: the head for your list. | 387 | * @head: the head for your list. |
388 | */ | 388 | */ |
389 | #define list_for_each_prev(pos, head) \ | 389 | #define list_for_each_prev(pos, head) \ |
390 | for (pos = (head)->prev; prefetch(pos->prev), pos != (head); \ | 390 | for (pos = (head)->prev; prefetch(pos->prev), pos != (head); \ |
391 | pos = pos->prev) | 391 | pos = pos->prev) |
392 | 392 | ||
393 | /** | 393 | /** |
394 | * list_for_each_safe - iterate over a list safe against removal of list entry | 394 | * list_for_each_safe - iterate over a list safe against removal of list entry |
395 | * @pos: the &struct list_head to use as a loop cursor. | 395 | * @pos: the &struct list_head to use as a loop cursor. |
396 | * @n: another &struct list_head to use as temporary storage | 396 | * @n: another &struct list_head to use as temporary storage |
397 | * @head: the head for your list. | 397 | * @head: the head for your list. |
398 | */ | 398 | */ |
399 | #define list_for_each_safe(pos, n, head) \ | 399 | #define list_for_each_safe(pos, n, head) \ |
400 | for (pos = (head)->next, n = pos->next; pos != (head); \ | 400 | for (pos = (head)->next, n = pos->next; pos != (head); \ |
401 | pos = n, n = pos->next) | 401 | pos = n, n = pos->next) |
402 | 402 | ||
403 | /** | 403 | /** |
404 | * list_for_each_prev_safe - iterate over a list backwards safe against removal of list entry | 404 | * list_for_each_prev_safe - iterate over a list backwards safe against removal of list entry |
405 | * @pos: the &struct list_head to use as a loop cursor. | 405 | * @pos: the &struct list_head to use as a loop cursor. |
406 | * @n: another &struct list_head to use as temporary storage | 406 | * @n: another &struct list_head to use as temporary storage |
407 | * @head: the head for your list. | 407 | * @head: the head for your list. |
408 | */ | 408 | */ |
409 | #define list_for_each_prev_safe(pos, n, head) \ | 409 | #define list_for_each_prev_safe(pos, n, head) \ |
410 | for (pos = (head)->prev, n = pos->prev; \ | 410 | for (pos = (head)->prev, n = pos->prev; \ |
411 | prefetch(pos->prev), pos != (head); \ | 411 | prefetch(pos->prev), pos != (head); \ |
412 | pos = n, n = pos->prev) | 412 | pos = n, n = pos->prev) |
413 | 413 | ||
414 | /** | 414 | /** |
415 | * list_for_each_entry - iterate over list of given type | 415 | * list_for_each_entry - iterate over list of given type |
416 | * @pos: the type * to use as a loop cursor. | 416 | * @pos: the type * to use as a loop cursor. |
417 | * @head: the head for your list. | 417 | * @head: the head for your list. |
418 | * @member: the name of the list_struct within the struct. | 418 | * @member: the name of the list_struct within the struct. |
419 | */ | 419 | */ |
420 | #define list_for_each_entry(pos, head, member) \ | 420 | #define list_for_each_entry(pos, head, member) \ |
421 | for (pos = list_entry((head)->next, typeof(*pos), member); \ | 421 | for (pos = list_entry((head)->next, typeof(*pos), member); \ |
422 | prefetch(pos->member.next), &pos->member != (head); \ | 422 | prefetch(pos->member.next), &pos->member != (head); \ |
423 | pos = list_entry(pos->member.next, typeof(*pos), member)) | 423 | pos = list_entry(pos->member.next, typeof(*pos), member)) |
424 | 424 | ||
425 | /** | 425 | /** |
426 | * list_for_each_entry_reverse - iterate backwards over list of given type. | 426 | * list_for_each_entry_reverse - iterate backwards over list of given type. |
427 | * @pos: the type * to use as a loop cursor. | 427 | * @pos: the type * to use as a loop cursor. |
428 | * @head: the head for your list. | 428 | * @head: the head for your list. |
429 | * @member: the name of the list_struct within the struct. | 429 | * @member: the name of the list_struct within the struct. |
430 | */ | 430 | */ |
431 | #define list_for_each_entry_reverse(pos, head, member) \ | 431 | #define list_for_each_entry_reverse(pos, head, member) \ |
432 | for (pos = list_entry((head)->prev, typeof(*pos), member); \ | 432 | for (pos = list_entry((head)->prev, typeof(*pos), member); \ |
433 | prefetch(pos->member.prev), &pos->member != (head); \ | 433 | prefetch(pos->member.prev), &pos->member != (head); \ |
434 | pos = list_entry(pos->member.prev, typeof(*pos), member)) | 434 | pos = list_entry(pos->member.prev, typeof(*pos), member)) |
435 | 435 | ||
436 | /** | 436 | /** |
437 | * list_prepare_entry - prepare a pos entry for use in list_for_each_entry_continue() | 437 | * list_prepare_entry - prepare a pos entry for use in list_for_each_entry_continue() |
438 | * @pos: the type * to use as a start point | 438 | * @pos: the type * to use as a start point |
439 | * @head: the head of the list | 439 | * @head: the head of the list |
440 | * @member: the name of the list_struct within the struct. | 440 | * @member: the name of the list_struct within the struct. |
441 | * | 441 | * |
442 | * Prepares a pos entry for use as a start point in list_for_each_entry_continue(). | 442 | * Prepares a pos entry for use as a start point in list_for_each_entry_continue(). |
443 | */ | 443 | */ |
444 | #define list_prepare_entry(pos, head, member) \ | 444 | #define list_prepare_entry(pos, head, member) \ |
445 | ((pos) ? : list_entry(head, typeof(*pos), member)) | 445 | ((pos) ? : list_entry(head, typeof(*pos), member)) |
446 | 446 | ||
447 | /** | 447 | /** |
448 | * list_for_each_entry_continue - continue iteration over list of given type | 448 | * list_for_each_entry_continue - continue iteration over list of given type |
449 | * @pos: the type * to use as a loop cursor. | 449 | * @pos: the type * to use as a loop cursor. |
450 | * @head: the head for your list. | 450 | * @head: the head for your list. |
451 | * @member: the name of the list_struct within the struct. | 451 | * @member: the name of the list_struct within the struct. |
452 | * | 452 | * |
453 | * Continue to iterate over list of given type, continuing after | 453 | * Continue to iterate over list of given type, continuing after |
454 | * the current position. | 454 | * the current position. |
455 | */ | 455 | */ |
456 | #define list_for_each_entry_continue(pos, head, member) \ | 456 | #define list_for_each_entry_continue(pos, head, member) \ |
457 | for (pos = list_entry(pos->member.next, typeof(*pos), member); \ | 457 | for (pos = list_entry(pos->member.next, typeof(*pos), member); \ |
458 | prefetch(pos->member.next), &pos->member != (head); \ | 458 | prefetch(pos->member.next), &pos->member != (head); \ |
459 | pos = list_entry(pos->member.next, typeof(*pos), member)) | 459 | pos = list_entry(pos->member.next, typeof(*pos), member)) |
460 | 460 | ||
461 | /** | 461 | /** |
462 | * list_for_each_entry_continue_reverse - iterate backwards from the given point | 462 | * list_for_each_entry_continue_reverse - iterate backwards from the given point |
463 | * @pos: the type * to use as a loop cursor. | 463 | * @pos: the type * to use as a loop cursor. |
464 | * @head: the head for your list. | 464 | * @head: the head for your list. |
465 | * @member: the name of the list_struct within the struct. | 465 | * @member: the name of the list_struct within the struct. |
466 | * | 466 | * |
467 | * Start to iterate over list of given type backwards, continuing after | 467 | * Start to iterate over list of given type backwards, continuing after |
468 | * the current position. | 468 | * the current position. |
469 | */ | 469 | */ |
470 | #define list_for_each_entry_continue_reverse(pos, head, member) \ | 470 | #define list_for_each_entry_continue_reverse(pos, head, member) \ |
471 | for (pos = list_entry(pos->member.prev, typeof(*pos), member); \ | 471 | for (pos = list_entry(pos->member.prev, typeof(*pos), member); \ |
472 | prefetch(pos->member.prev), &pos->member != (head); \ | 472 | prefetch(pos->member.prev), &pos->member != (head); \ |
473 | pos = list_entry(pos->member.prev, typeof(*pos), member)) | 473 | pos = list_entry(pos->member.prev, typeof(*pos), member)) |
474 | 474 | ||
475 | /** | 475 | /** |
476 | * list_for_each_entry_from - iterate over list of given type from the current point | 476 | * list_for_each_entry_from - iterate over list of given type from the current point |
477 | * @pos: the type * to use as a loop cursor. | 477 | * @pos: the type * to use as a loop cursor. |
478 | * @head: the head for your list. | 478 | * @head: the head for your list. |
479 | * @member: the name of the list_struct within the struct. | 479 | * @member: the name of the list_struct within the struct. |
480 | * | 480 | * |
481 | * Iterate over list of given type, continuing from current position. | 481 | * Iterate over list of given type, continuing from current position. |
482 | */ | 482 | */ |
483 | #define list_for_each_entry_from(pos, head, member) \ | 483 | #define list_for_each_entry_from(pos, head, member) \ |
484 | for (; prefetch(pos->member.next), &pos->member != (head); \ | 484 | for (; prefetch(pos->member.next), &pos->member != (head); \ |
485 | pos = list_entry(pos->member.next, typeof(*pos), member)) | 485 | pos = list_entry(pos->member.next, typeof(*pos), member)) |
486 | 486 | ||
487 | /** | 487 | /** |
488 | * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry | 488 | * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry |
489 | * @pos: the type * to use as a loop cursor. | 489 | * @pos: the type * to use as a loop cursor. |
490 | * @n: another type * to use as temporary storage | 490 | * @n: another type * to use as temporary storage |
491 | * @head: the head for your list. | 491 | * @head: the head for your list. |
492 | * @member: the name of the list_struct within the struct. | 492 | * @member: the name of the list_struct within the struct. |
493 | */ | 493 | */ |
494 | #define list_for_each_entry_safe(pos, n, head, member) \ | 494 | #define list_for_each_entry_safe(pos, n, head, member) \ |
495 | for (pos = list_entry((head)->next, typeof(*pos), member), \ | 495 | for (pos = list_entry((head)->next, typeof(*pos), member), \ |
496 | n = list_entry(pos->member.next, typeof(*pos), member); \ | 496 | n = list_entry(pos->member.next, typeof(*pos), member); \ |
497 | &pos->member != (head); \ | 497 | &pos->member != (head); \ |
498 | pos = n, n = list_entry(n->member.next, typeof(*n), member)) | 498 | pos = n, n = list_entry(n->member.next, typeof(*n), member)) |
499 | 499 | ||
500 | /** | 500 | /** |
501 | * list_for_each_entry_safe_continue | 501 | * list_for_each_entry_safe_continue - continue list iteration safe against removal |
502 | * @pos: the type * to use as a loop cursor. | 502 | * @pos: the type * to use as a loop cursor. |
503 | * @n: another type * to use as temporary storage | 503 | * @n: another type * to use as temporary storage |
504 | * @head: the head for your list. | 504 | * @head: the head for your list. |
505 | * @member: the name of the list_struct within the struct. | 505 | * @member: the name of the list_struct within the struct. |
506 | * | 506 | * |
507 | * Iterate over list of given type, continuing after current point, | 507 | * Iterate over list of given type, continuing after current point, |
508 | * safe against removal of list entry. | 508 | * safe against removal of list entry. |
509 | */ | 509 | */ |
510 | #define list_for_each_entry_safe_continue(pos, n, head, member) \ | 510 | #define list_for_each_entry_safe_continue(pos, n, head, member) \ |
511 | for (pos = list_entry(pos->member.next, typeof(*pos), member), \ | 511 | for (pos = list_entry(pos->member.next, typeof(*pos), member), \ |
512 | n = list_entry(pos->member.next, typeof(*pos), member); \ | 512 | n = list_entry(pos->member.next, typeof(*pos), member); \ |
513 | &pos->member != (head); \ | 513 | &pos->member != (head); \ |
514 | pos = n, n = list_entry(n->member.next, typeof(*n), member)) | 514 | pos = n, n = list_entry(n->member.next, typeof(*n), member)) |
515 | 515 | ||
516 | /** | 516 | /** |
517 | * list_for_each_entry_safe_from | 517 | * list_for_each_entry_safe_from - iterate over list from current point safe against removal |
518 | * @pos: the type * to use as a loop cursor. | 518 | * @pos: the type * to use as a loop cursor. |
519 | * @n: another type * to use as temporary storage | 519 | * @n: another type * to use as temporary storage |
520 | * @head: the head for your list. | 520 | * @head: the head for your list. |
521 | * @member: the name of the list_struct within the struct. | 521 | * @member: the name of the list_struct within the struct. |
522 | * | 522 | * |
523 | * Iterate over list of given type from current point, safe against | 523 | * Iterate over list of given type from current point, safe against |
524 | * removal of list entry. | 524 | * removal of list entry. |
525 | */ | 525 | */ |
526 | #define list_for_each_entry_safe_from(pos, n, head, member) \ | 526 | #define list_for_each_entry_safe_from(pos, n, head, member) \ |
527 | for (n = list_entry(pos->member.next, typeof(*pos), member); \ | 527 | for (n = list_entry(pos->member.next, typeof(*pos), member); \ |
528 | &pos->member != (head); \ | 528 | &pos->member != (head); \ |
529 | pos = n, n = list_entry(n->member.next, typeof(*n), member)) | 529 | pos = n, n = list_entry(n->member.next, typeof(*n), member)) |
530 | 530 | ||
531 | /** | 531 | /** |
532 | * list_for_each_entry_safe_reverse | 532 | * list_for_each_entry_safe_reverse - iterate backwards over list safe against removal |
533 | * @pos: the type * to use as a loop cursor. | 533 | * @pos: the type * to use as a loop cursor. |
534 | * @n: another type * to use as temporary storage | 534 | * @n: another type * to use as temporary storage |
535 | * @head: the head for your list. | 535 | * @head: the head for your list. |
536 | * @member: the name of the list_struct within the struct. | 536 | * @member: the name of the list_struct within the struct. |
537 | * | 537 | * |
538 | * Iterate backwards over list of given type, safe against removal | 538 | * Iterate backwards over list of given type, safe against removal |
539 | * of list entry. | 539 | * of list entry. |
540 | */ | 540 | */ |
541 | #define list_for_each_entry_safe_reverse(pos, n, head, member) \ | 541 | #define list_for_each_entry_safe_reverse(pos, n, head, member) \ |
542 | for (pos = list_entry((head)->prev, typeof(*pos), member), \ | 542 | for (pos = list_entry((head)->prev, typeof(*pos), member), \ |
543 | n = list_entry(pos->member.prev, typeof(*pos), member); \ | 543 | n = list_entry(pos->member.prev, typeof(*pos), member); \ |
544 | &pos->member != (head); \ | 544 | &pos->member != (head); \ |
545 | pos = n, n = list_entry(n->member.prev, typeof(*n), member)) | 545 | pos = n, n = list_entry(n->member.prev, typeof(*n), member)) |
546 | 546 | ||
547 | /* | 547 | /* |
548 | * Double linked lists with a single pointer list head. | 548 | * Double linked lists with a single pointer list head. |
549 | * Mostly useful for hash tables where the two pointer list head is | 549 | * Mostly useful for hash tables where the two pointer list head is |
550 | * too wasteful. | 550 | * too wasteful. |
551 | * You lose the ability to access the tail in O(1). | 551 | * You lose the ability to access the tail in O(1). |
552 | */ | 552 | */ |
553 | 553 | ||
554 | struct hlist_head { | 554 | struct hlist_head { |
555 | struct hlist_node *first; | 555 | struct hlist_node *first; |
556 | }; | 556 | }; |
557 | 557 | ||
558 | struct hlist_node { | 558 | struct hlist_node { |
559 | struct hlist_node *next, **pprev; | 559 | struct hlist_node *next, **pprev; |
560 | }; | 560 | }; |
561 | 561 | ||
562 | #define HLIST_HEAD_INIT { .first = NULL } | 562 | #define HLIST_HEAD_INIT { .first = NULL } |
563 | #define HLIST_HEAD(name) struct hlist_head name = { .first = NULL } | 563 | #define HLIST_HEAD(name) struct hlist_head name = { .first = NULL } |
564 | #define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL) | 564 | #define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL) |
565 | static inline void INIT_HLIST_NODE(struct hlist_node *h) | 565 | static inline void INIT_HLIST_NODE(struct hlist_node *h) |
566 | { | 566 | { |
567 | h->next = NULL; | 567 | h->next = NULL; |
568 | h->pprev = NULL; | 568 | h->pprev = NULL; |
569 | } | 569 | } |
570 | 570 | ||
571 | static inline int hlist_unhashed(const struct hlist_node *h) | 571 | static inline int hlist_unhashed(const struct hlist_node *h) |
572 | { | 572 | { |
573 | return !h->pprev; | 573 | return !h->pprev; |
574 | } | 574 | } |
575 | 575 | ||
576 | static inline int hlist_empty(const struct hlist_head *h) | 576 | static inline int hlist_empty(const struct hlist_head *h) |
577 | { | 577 | { |
578 | return !h->first; | 578 | return !h->first; |
579 | } | 579 | } |
580 | 580 | ||
581 | static inline void __hlist_del(struct hlist_node *n) | 581 | static inline void __hlist_del(struct hlist_node *n) |
582 | { | 582 | { |
583 | struct hlist_node *next = n->next; | 583 | struct hlist_node *next = n->next; |
584 | struct hlist_node **pprev = n->pprev; | 584 | struct hlist_node **pprev = n->pprev; |
585 | *pprev = next; | 585 | *pprev = next; |
586 | if (next) | 586 | if (next) |
587 | next->pprev = pprev; | 587 | next->pprev = pprev; |
588 | } | 588 | } |
589 | 589 | ||
590 | static inline void hlist_del(struct hlist_node *n) | 590 | static inline void hlist_del(struct hlist_node *n) |
591 | { | 591 | { |
592 | __hlist_del(n); | 592 | __hlist_del(n); |
593 | n->next = LIST_POISON1; | 593 | n->next = LIST_POISON1; |
594 | n->pprev = LIST_POISON2; | 594 | n->pprev = LIST_POISON2; |
595 | } | 595 | } |
596 | 596 | ||
597 | static inline void hlist_del_init(struct hlist_node *n) | 597 | static inline void hlist_del_init(struct hlist_node *n) |
598 | { | 598 | { |
599 | if (!hlist_unhashed(n)) { | 599 | if (!hlist_unhashed(n)) { |
600 | __hlist_del(n); | 600 | __hlist_del(n); |
601 | INIT_HLIST_NODE(n); | 601 | INIT_HLIST_NODE(n); |
602 | } | 602 | } |
603 | } | 603 | } |
604 | 604 | ||
605 | static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h) | 605 | static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h) |
606 | { | 606 | { |
607 | struct hlist_node *first = h->first; | 607 | struct hlist_node *first = h->first; |
608 | n->next = first; | 608 | n->next = first; |
609 | if (first) | 609 | if (first) |
610 | first->pprev = &n->next; | 610 | first->pprev = &n->next; |
611 | h->first = n; | 611 | h->first = n; |
612 | n->pprev = &h->first; | 612 | n->pprev = &h->first; |
613 | } | 613 | } |
614 | 614 | ||
615 | /* next must be != NULL */ | 615 | /* next must be != NULL */ |
616 | static inline void hlist_add_before(struct hlist_node *n, | 616 | static inline void hlist_add_before(struct hlist_node *n, |
617 | struct hlist_node *next) | 617 | struct hlist_node *next) |
618 | { | 618 | { |
619 | n->pprev = next->pprev; | 619 | n->pprev = next->pprev; |
620 | n->next = next; | 620 | n->next = next; |
621 | next->pprev = &n->next; | 621 | next->pprev = &n->next; |
622 | *(n->pprev) = n; | 622 | *(n->pprev) = n; |
623 | } | 623 | } |
624 | 624 | ||
625 | static inline void hlist_add_after(struct hlist_node *n, | 625 | static inline void hlist_add_after(struct hlist_node *n, |
626 | struct hlist_node *next) | 626 | struct hlist_node *next) |
627 | { | 627 | { |
628 | next->next = n->next; | 628 | next->next = n->next; |
629 | n->next = next; | 629 | n->next = next; |
630 | next->pprev = &n->next; | 630 | next->pprev = &n->next; |
631 | 631 | ||
632 | if(next->next) | 632 | if(next->next) |
633 | next->next->pprev = &next->next; | 633 | next->next->pprev = &next->next; |
634 | } | 634 | } |
635 | 635 | ||
636 | /* | 636 | /* |
637 | * Move a list from one list head to another. Fixup the pprev | 637 | * Move a list from one list head to another. Fixup the pprev |
638 | * reference of the first entry if it exists. | 638 | * reference of the first entry if it exists. |
639 | */ | 639 | */ |
640 | static inline void hlist_move_list(struct hlist_head *old, | 640 | static inline void hlist_move_list(struct hlist_head *old, |
641 | struct hlist_head *new) | 641 | struct hlist_head *new) |
642 | { | 642 | { |
643 | new->first = old->first; | 643 | new->first = old->first; |
644 | if (new->first) | 644 | if (new->first) |
645 | new->first->pprev = &new->first; | 645 | new->first->pprev = &new->first; |
646 | old->first = NULL; | 646 | old->first = NULL; |
647 | } | 647 | } |
648 | 648 | ||
649 | #define hlist_entry(ptr, type, member) container_of(ptr,type,member) | 649 | #define hlist_entry(ptr, type, member) container_of(ptr,type,member) |
650 | 650 | ||
651 | #define hlist_for_each(pos, head) \ | 651 | #define hlist_for_each(pos, head) \ |
652 | for (pos = (head)->first; pos && ({ prefetch(pos->next); 1; }); \ | 652 | for (pos = (head)->first; pos && ({ prefetch(pos->next); 1; }); \ |
653 | pos = pos->next) | 653 | pos = pos->next) |
654 | 654 | ||
655 | #define hlist_for_each_safe(pos, n, head) \ | 655 | #define hlist_for_each_safe(pos, n, head) \ |
656 | for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \ | 656 | for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \ |
657 | pos = n) | 657 | pos = n) |
658 | 658 | ||
659 | /** | 659 | /** |
660 | * hlist_for_each_entry - iterate over list of given type | 660 | * hlist_for_each_entry - iterate over list of given type |
661 | * @tpos: the type * to use as a loop cursor. | 661 | * @tpos: the type * to use as a loop cursor. |
662 | * @pos: the &struct hlist_node to use as a loop cursor. | 662 | * @pos: the &struct hlist_node to use as a loop cursor. |
663 | * @head: the head for your list. | 663 | * @head: the head for your list. |
664 | * @member: the name of the hlist_node within the struct. | 664 | * @member: the name of the hlist_node within the struct. |
665 | */ | 665 | */ |
666 | #define hlist_for_each_entry(tpos, pos, head, member) \ | 666 | #define hlist_for_each_entry(tpos, pos, head, member) \ |
667 | for (pos = (head)->first; \ | 667 | for (pos = (head)->first; \ |
668 | pos && ({ prefetch(pos->next); 1;}) && \ | 668 | pos && ({ prefetch(pos->next); 1;}) && \ |
669 | ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ | 669 | ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ |
670 | pos = pos->next) | 670 | pos = pos->next) |
671 | 671 | ||
672 | /** | 672 | /** |
673 | * hlist_for_each_entry_continue - iterate over a hlist continuing after current point | 673 | * hlist_for_each_entry_continue - iterate over a hlist continuing after current point |
674 | * @tpos: the type * to use as a loop cursor. | 674 | * @tpos: the type * to use as a loop cursor. |
675 | * @pos: the &struct hlist_node to use as a loop cursor. | 675 | * @pos: the &struct hlist_node to use as a loop cursor. |
676 | * @member: the name of the hlist_node within the struct. | 676 | * @member: the name of the hlist_node within the struct. |
677 | */ | 677 | */ |
678 | #define hlist_for_each_entry_continue(tpos, pos, member) \ | 678 | #define hlist_for_each_entry_continue(tpos, pos, member) \ |
679 | for (pos = (pos)->next; \ | 679 | for (pos = (pos)->next; \ |
680 | pos && ({ prefetch(pos->next); 1;}) && \ | 680 | pos && ({ prefetch(pos->next); 1;}) && \ |
681 | ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ | 681 | ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ |
682 | pos = pos->next) | 682 | pos = pos->next) |
683 | 683 | ||
684 | /** | 684 | /** |
685 | * hlist_for_each_entry_from - iterate over a hlist continuing from current point | 685 | * hlist_for_each_entry_from - iterate over a hlist continuing from current point |
686 | * @tpos: the type * to use as a loop cursor. | 686 | * @tpos: the type * to use as a loop cursor. |
687 | * @pos: the &struct hlist_node to use as a loop cursor. | 687 | * @pos: the &struct hlist_node to use as a loop cursor. |
688 | * @member: the name of the hlist_node within the struct. | 688 | * @member: the name of the hlist_node within the struct. |
689 | */ | 689 | */ |
690 | #define hlist_for_each_entry_from(tpos, pos, member) \ | 690 | #define hlist_for_each_entry_from(tpos, pos, member) \ |
691 | for (; pos && ({ prefetch(pos->next); 1;}) && \ | 691 | for (; pos && ({ prefetch(pos->next); 1;}) && \ |
692 | ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ | 692 | ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ |
693 | pos = pos->next) | 693 | pos = pos->next) |
694 | 694 | ||
695 | /** | 695 | /** |
696 | * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry | 696 | * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry |
697 | * @tpos: the type * to use as a loop cursor. | 697 | * @tpos: the type * to use as a loop cursor. |
698 | * @pos: the &struct hlist_node to use as a loop cursor. | 698 | * @pos: the &struct hlist_node to use as a loop cursor. |
699 | * @n: another &struct hlist_node to use as temporary storage | 699 | * @n: another &struct hlist_node to use as temporary storage |
700 | * @head: the head for your list. | 700 | * @head: the head for your list. |
701 | * @member: the name of the hlist_node within the struct. | 701 | * @member: the name of the hlist_node within the struct. |
702 | */ | 702 | */ |
703 | #define hlist_for_each_entry_safe(tpos, pos, n, head, member) \ | 703 | #define hlist_for_each_entry_safe(tpos, pos, n, head, member) \ |
704 | for (pos = (head)->first; \ | 704 | for (pos = (head)->first; \ |
705 | pos && ({ n = pos->next; 1; }) && \ | 705 | pos && ({ n = pos->next; 1; }) && \ |
706 | ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ | 706 | ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ |
707 | pos = n) | 707 | pos = n) |
708 | 708 | ||
709 | #endif | 709 | #endif |
710 | 710 |
lib/bitmap.c
1 | /* | 1 | /* |
2 | * lib/bitmap.c | 2 | * lib/bitmap.c |
3 | * Helper functions for bitmap.h. | 3 | * Helper functions for bitmap.h. |
4 | * | 4 | * |
5 | * This source code is licensed under the GNU General Public License, | 5 | * This source code is licensed under the GNU General Public License, |
6 | * Version 2. See the file COPYING for more details. | 6 | * Version 2. See the file COPYING for more details. |
7 | */ | 7 | */ |
8 | #include <linux/module.h> | 8 | #include <linux/module.h> |
9 | #include <linux/ctype.h> | 9 | #include <linux/ctype.h> |
10 | #include <linux/errno.h> | 10 | #include <linux/errno.h> |
11 | #include <linux/bitmap.h> | 11 | #include <linux/bitmap.h> |
12 | #include <linux/bitops.h> | 12 | #include <linux/bitops.h> |
13 | #include <asm/uaccess.h> | 13 | #include <asm/uaccess.h> |
14 | 14 | ||
15 | /* | 15 | /* |
16 | * bitmaps provide an array of bits, implemented using an an | 16 | * bitmaps provide an array of bits, implemented using an an |
17 | * array of unsigned longs. The number of valid bits in a | 17 | * array of unsigned longs. The number of valid bits in a |
18 | * given bitmap does _not_ need to be an exact multiple of | 18 | * given bitmap does _not_ need to be an exact multiple of |
19 | * BITS_PER_LONG. | 19 | * BITS_PER_LONG. |
20 | * | 20 | * |
21 | * The possible unused bits in the last, partially used word | 21 | * The possible unused bits in the last, partially used word |
22 | * of a bitmap are 'don't care'. The implementation makes | 22 | * of a bitmap are 'don't care'. The implementation makes |
23 | * no particular effort to keep them zero. It ensures that | 23 | * no particular effort to keep them zero. It ensures that |
24 | * their value will not affect the results of any operation. | 24 | * their value will not affect the results of any operation. |
25 | * The bitmap operations that return Boolean (bitmap_empty, | 25 | * The bitmap operations that return Boolean (bitmap_empty, |
26 | * for example) or scalar (bitmap_weight, for example) results | 26 | * for example) or scalar (bitmap_weight, for example) results |
27 | * carefully filter out these unused bits from impacting their | 27 | * carefully filter out these unused bits from impacting their |
28 | * results. | 28 | * results. |
29 | * | 29 | * |
30 | * These operations actually hold to a slightly stronger rule: | 30 | * These operations actually hold to a slightly stronger rule: |
31 | * if you don't input any bitmaps to these ops that have some | 31 | * if you don't input any bitmaps to these ops that have some |
32 | * unused bits set, then they won't output any set unused bits | 32 | * unused bits set, then they won't output any set unused bits |
33 | * in output bitmaps. | 33 | * in output bitmaps. |
34 | * | 34 | * |
35 | * The byte ordering of bitmaps is more natural on little | 35 | * The byte ordering of bitmaps is more natural on little |
36 | * endian architectures. See the big-endian headers | 36 | * endian architectures. See the big-endian headers |
37 | * include/asm-ppc64/bitops.h and include/asm-s390/bitops.h | 37 | * include/asm-ppc64/bitops.h and include/asm-s390/bitops.h |
38 | * for the best explanations of this ordering. | 38 | * for the best explanations of this ordering. |
39 | */ | 39 | */ |
40 | 40 | ||
41 | int __bitmap_empty(const unsigned long *bitmap, int bits) | 41 | int __bitmap_empty(const unsigned long *bitmap, int bits) |
42 | { | 42 | { |
43 | int k, lim = bits/BITS_PER_LONG; | 43 | int k, lim = bits/BITS_PER_LONG; |
44 | for (k = 0; k < lim; ++k) | 44 | for (k = 0; k < lim; ++k) |
45 | if (bitmap[k]) | 45 | if (bitmap[k]) |
46 | return 0; | 46 | return 0; |
47 | 47 | ||
48 | if (bits % BITS_PER_LONG) | 48 | if (bits % BITS_PER_LONG) |
49 | if (bitmap[k] & BITMAP_LAST_WORD_MASK(bits)) | 49 | if (bitmap[k] & BITMAP_LAST_WORD_MASK(bits)) |
50 | return 0; | 50 | return 0; |
51 | 51 | ||
52 | return 1; | 52 | return 1; |
53 | } | 53 | } |
54 | EXPORT_SYMBOL(__bitmap_empty); | 54 | EXPORT_SYMBOL(__bitmap_empty); |
55 | 55 | ||
56 | int __bitmap_full(const unsigned long *bitmap, int bits) | 56 | int __bitmap_full(const unsigned long *bitmap, int bits) |
57 | { | 57 | { |
58 | int k, lim = bits/BITS_PER_LONG; | 58 | int k, lim = bits/BITS_PER_LONG; |
59 | for (k = 0; k < lim; ++k) | 59 | for (k = 0; k < lim; ++k) |
60 | if (~bitmap[k]) | 60 | if (~bitmap[k]) |
61 | return 0; | 61 | return 0; |
62 | 62 | ||
63 | if (bits % BITS_PER_LONG) | 63 | if (bits % BITS_PER_LONG) |
64 | if (~bitmap[k] & BITMAP_LAST_WORD_MASK(bits)) | 64 | if (~bitmap[k] & BITMAP_LAST_WORD_MASK(bits)) |
65 | return 0; | 65 | return 0; |
66 | 66 | ||
67 | return 1; | 67 | return 1; |
68 | } | 68 | } |
69 | EXPORT_SYMBOL(__bitmap_full); | 69 | EXPORT_SYMBOL(__bitmap_full); |
70 | 70 | ||
71 | int __bitmap_equal(const unsigned long *bitmap1, | 71 | int __bitmap_equal(const unsigned long *bitmap1, |
72 | const unsigned long *bitmap2, int bits) | 72 | const unsigned long *bitmap2, int bits) |
73 | { | 73 | { |
74 | int k, lim = bits/BITS_PER_LONG; | 74 | int k, lim = bits/BITS_PER_LONG; |
75 | for (k = 0; k < lim; ++k) | 75 | for (k = 0; k < lim; ++k) |
76 | if (bitmap1[k] != bitmap2[k]) | 76 | if (bitmap1[k] != bitmap2[k]) |
77 | return 0; | 77 | return 0; |
78 | 78 | ||
79 | if (bits % BITS_PER_LONG) | 79 | if (bits % BITS_PER_LONG) |
80 | if ((bitmap1[k] ^ bitmap2[k]) & BITMAP_LAST_WORD_MASK(bits)) | 80 | if ((bitmap1[k] ^ bitmap2[k]) & BITMAP_LAST_WORD_MASK(bits)) |
81 | return 0; | 81 | return 0; |
82 | 82 | ||
83 | return 1; | 83 | return 1; |
84 | } | 84 | } |
85 | EXPORT_SYMBOL(__bitmap_equal); | 85 | EXPORT_SYMBOL(__bitmap_equal); |
86 | 86 | ||
87 | void __bitmap_complement(unsigned long *dst, const unsigned long *src, int bits) | 87 | void __bitmap_complement(unsigned long *dst, const unsigned long *src, int bits) |
88 | { | 88 | { |
89 | int k, lim = bits/BITS_PER_LONG; | 89 | int k, lim = bits/BITS_PER_LONG; |
90 | for (k = 0; k < lim; ++k) | 90 | for (k = 0; k < lim; ++k) |
91 | dst[k] = ~src[k]; | 91 | dst[k] = ~src[k]; |
92 | 92 | ||
93 | if (bits % BITS_PER_LONG) | 93 | if (bits % BITS_PER_LONG) |
94 | dst[k] = ~src[k] & BITMAP_LAST_WORD_MASK(bits); | 94 | dst[k] = ~src[k] & BITMAP_LAST_WORD_MASK(bits); |
95 | } | 95 | } |
96 | EXPORT_SYMBOL(__bitmap_complement); | 96 | EXPORT_SYMBOL(__bitmap_complement); |
97 | 97 | ||
98 | /** | 98 | /** |
99 | * __bitmap_shift_right - logical right shift of the bits in a bitmap | 99 | * __bitmap_shift_right - logical right shift of the bits in a bitmap |
100 | * @dst : destination bitmap | 100 | * @dst : destination bitmap |
101 | * @src : source bitmap | 101 | * @src : source bitmap |
102 | * @shift : shift by this many bits | 102 | * @shift : shift by this many bits |
103 | * @bits : bitmap size, in bits | 103 | * @bits : bitmap size, in bits |
104 | * | 104 | * |
105 | * Shifting right (dividing) means moving bits in the MS -> LS bit | 105 | * Shifting right (dividing) means moving bits in the MS -> LS bit |
106 | * direction. Zeros are fed into the vacated MS positions and the | 106 | * direction. Zeros are fed into the vacated MS positions and the |
107 | * LS bits shifted off the bottom are lost. | 107 | * LS bits shifted off the bottom are lost. |
108 | */ | 108 | */ |
109 | void __bitmap_shift_right(unsigned long *dst, | 109 | void __bitmap_shift_right(unsigned long *dst, |
110 | const unsigned long *src, int shift, int bits) | 110 | const unsigned long *src, int shift, int bits) |
111 | { | 111 | { |
112 | int k, lim = BITS_TO_LONGS(bits), left = bits % BITS_PER_LONG; | 112 | int k, lim = BITS_TO_LONGS(bits), left = bits % BITS_PER_LONG; |
113 | int off = shift/BITS_PER_LONG, rem = shift % BITS_PER_LONG; | 113 | int off = shift/BITS_PER_LONG, rem = shift % BITS_PER_LONG; |
114 | unsigned long mask = (1UL << left) - 1; | 114 | unsigned long mask = (1UL << left) - 1; |
115 | for (k = 0; off + k < lim; ++k) { | 115 | for (k = 0; off + k < lim; ++k) { |
116 | unsigned long upper, lower; | 116 | unsigned long upper, lower; |
117 | 117 | ||
118 | /* | 118 | /* |
119 | * If shift is not word aligned, take lower rem bits of | 119 | * If shift is not word aligned, take lower rem bits of |
120 | * word above and make them the top rem bits of result. | 120 | * word above and make them the top rem bits of result. |
121 | */ | 121 | */ |
122 | if (!rem || off + k + 1 >= lim) | 122 | if (!rem || off + k + 1 >= lim) |
123 | upper = 0; | 123 | upper = 0; |
124 | else { | 124 | else { |
125 | upper = src[off + k + 1]; | 125 | upper = src[off + k + 1]; |
126 | if (off + k + 1 == lim - 1 && left) | 126 | if (off + k + 1 == lim - 1 && left) |
127 | upper &= mask; | 127 | upper &= mask; |
128 | } | 128 | } |
129 | lower = src[off + k]; | 129 | lower = src[off + k]; |
130 | if (left && off + k == lim - 1) | 130 | if (left && off + k == lim - 1) |
131 | lower &= mask; | 131 | lower &= mask; |
132 | dst[k] = upper << (BITS_PER_LONG - rem) | lower >> rem; | 132 | dst[k] = upper << (BITS_PER_LONG - rem) | lower >> rem; |
133 | if (left && k == lim - 1) | 133 | if (left && k == lim - 1) |
134 | dst[k] &= mask; | 134 | dst[k] &= mask; |
135 | } | 135 | } |
136 | if (off) | 136 | if (off) |
137 | memset(&dst[lim - off], 0, off*sizeof(unsigned long)); | 137 | memset(&dst[lim - off], 0, off*sizeof(unsigned long)); |
138 | } | 138 | } |
139 | EXPORT_SYMBOL(__bitmap_shift_right); | 139 | EXPORT_SYMBOL(__bitmap_shift_right); |
140 | 140 | ||
141 | 141 | ||
142 | /** | 142 | /** |
143 | * __bitmap_shift_left - logical left shift of the bits in a bitmap | 143 | * __bitmap_shift_left - logical left shift of the bits in a bitmap |
144 | * @dst : destination bitmap | 144 | * @dst : destination bitmap |
145 | * @src : source bitmap | 145 | * @src : source bitmap |
146 | * @shift : shift by this many bits | 146 | * @shift : shift by this many bits |
147 | * @bits : bitmap size, in bits | 147 | * @bits : bitmap size, in bits |
148 | * | 148 | * |
149 | * Shifting left (multiplying) means moving bits in the LS -> MS | 149 | * Shifting left (multiplying) means moving bits in the LS -> MS |
150 | * direction. Zeros are fed into the vacated LS bit positions | 150 | * direction. Zeros are fed into the vacated LS bit positions |
151 | * and those MS bits shifted off the top are lost. | 151 | * and those MS bits shifted off the top are lost. |
152 | */ | 152 | */ |
153 | 153 | ||
154 | void __bitmap_shift_left(unsigned long *dst, | 154 | void __bitmap_shift_left(unsigned long *dst, |
155 | const unsigned long *src, int shift, int bits) | 155 | const unsigned long *src, int shift, int bits) |
156 | { | 156 | { |
157 | int k, lim = BITS_TO_LONGS(bits), left = bits % BITS_PER_LONG; | 157 | int k, lim = BITS_TO_LONGS(bits), left = bits % BITS_PER_LONG; |
158 | int off = shift/BITS_PER_LONG, rem = shift % BITS_PER_LONG; | 158 | int off = shift/BITS_PER_LONG, rem = shift % BITS_PER_LONG; |
159 | for (k = lim - off - 1; k >= 0; --k) { | 159 | for (k = lim - off - 1; k >= 0; --k) { |
160 | unsigned long upper, lower; | 160 | unsigned long upper, lower; |
161 | 161 | ||
162 | /* | 162 | /* |
163 | * If shift is not word aligned, take upper rem bits of | 163 | * If shift is not word aligned, take upper rem bits of |
164 | * word below and make them the bottom rem bits of result. | 164 | * word below and make them the bottom rem bits of result. |
165 | */ | 165 | */ |
166 | if (rem && k > 0) | 166 | if (rem && k > 0) |
167 | lower = src[k - 1]; | 167 | lower = src[k - 1]; |
168 | else | 168 | else |
169 | lower = 0; | 169 | lower = 0; |
170 | upper = src[k]; | 170 | upper = src[k]; |
171 | if (left && k == lim - 1) | 171 | if (left && k == lim - 1) |
172 | upper &= (1UL << left) - 1; | 172 | upper &= (1UL << left) - 1; |
173 | dst[k + off] = lower >> (BITS_PER_LONG - rem) | upper << rem; | 173 | dst[k + off] = lower >> (BITS_PER_LONG - rem) | upper << rem; |
174 | if (left && k + off == lim - 1) | 174 | if (left && k + off == lim - 1) |
175 | dst[k + off] &= (1UL << left) - 1; | 175 | dst[k + off] &= (1UL << left) - 1; |
176 | } | 176 | } |
177 | if (off) | 177 | if (off) |
178 | memset(dst, 0, off*sizeof(unsigned long)); | 178 | memset(dst, 0, off*sizeof(unsigned long)); |
179 | } | 179 | } |
180 | EXPORT_SYMBOL(__bitmap_shift_left); | 180 | EXPORT_SYMBOL(__bitmap_shift_left); |
181 | 181 | ||
182 | int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1, | 182 | int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1, |
183 | const unsigned long *bitmap2, int bits) | 183 | const unsigned long *bitmap2, int bits) |
184 | { | 184 | { |
185 | int k; | 185 | int k; |
186 | int nr = BITS_TO_LONGS(bits); | 186 | int nr = BITS_TO_LONGS(bits); |
187 | unsigned long result = 0; | 187 | unsigned long result = 0; |
188 | 188 | ||
189 | for (k = 0; k < nr; k++) | 189 | for (k = 0; k < nr; k++) |
190 | result |= (dst[k] = bitmap1[k] & bitmap2[k]); | 190 | result |= (dst[k] = bitmap1[k] & bitmap2[k]); |
191 | return result != 0; | 191 | return result != 0; |
192 | } | 192 | } |
193 | EXPORT_SYMBOL(__bitmap_and); | 193 | EXPORT_SYMBOL(__bitmap_and); |
194 | 194 | ||
195 | void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1, | 195 | void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1, |
196 | const unsigned long *bitmap2, int bits) | 196 | const unsigned long *bitmap2, int bits) |
197 | { | 197 | { |
198 | int k; | 198 | int k; |
199 | int nr = BITS_TO_LONGS(bits); | 199 | int nr = BITS_TO_LONGS(bits); |
200 | 200 | ||
201 | for (k = 0; k < nr; k++) | 201 | for (k = 0; k < nr; k++) |
202 | dst[k] = bitmap1[k] | bitmap2[k]; | 202 | dst[k] = bitmap1[k] | bitmap2[k]; |
203 | } | 203 | } |
204 | EXPORT_SYMBOL(__bitmap_or); | 204 | EXPORT_SYMBOL(__bitmap_or); |
205 | 205 | ||
206 | void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1, | 206 | void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1, |
207 | const unsigned long *bitmap2, int bits) | 207 | const unsigned long *bitmap2, int bits) |
208 | { | 208 | { |
209 | int k; | 209 | int k; |
210 | int nr = BITS_TO_LONGS(bits); | 210 | int nr = BITS_TO_LONGS(bits); |
211 | 211 | ||
212 | for (k = 0; k < nr; k++) | 212 | for (k = 0; k < nr; k++) |
213 | dst[k] = bitmap1[k] ^ bitmap2[k]; | 213 | dst[k] = bitmap1[k] ^ bitmap2[k]; |
214 | } | 214 | } |
215 | EXPORT_SYMBOL(__bitmap_xor); | 215 | EXPORT_SYMBOL(__bitmap_xor); |
216 | 216 | ||
217 | int __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1, | 217 | int __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1, |
218 | const unsigned long *bitmap2, int bits) | 218 | const unsigned long *bitmap2, int bits) |
219 | { | 219 | { |
220 | int k; | 220 | int k; |
221 | int nr = BITS_TO_LONGS(bits); | 221 | int nr = BITS_TO_LONGS(bits); |
222 | unsigned long result = 0; | 222 | unsigned long result = 0; |
223 | 223 | ||
224 | for (k = 0; k < nr; k++) | 224 | for (k = 0; k < nr; k++) |
225 | result |= (dst[k] = bitmap1[k] & ~bitmap2[k]); | 225 | result |= (dst[k] = bitmap1[k] & ~bitmap2[k]); |
226 | return result != 0; | 226 | return result != 0; |
227 | } | 227 | } |
228 | EXPORT_SYMBOL(__bitmap_andnot); | 228 | EXPORT_SYMBOL(__bitmap_andnot); |
229 | 229 | ||
230 | int __bitmap_intersects(const unsigned long *bitmap1, | 230 | int __bitmap_intersects(const unsigned long *bitmap1, |
231 | const unsigned long *bitmap2, int bits) | 231 | const unsigned long *bitmap2, int bits) |
232 | { | 232 | { |
233 | int k, lim = bits/BITS_PER_LONG; | 233 | int k, lim = bits/BITS_PER_LONG; |
234 | for (k = 0; k < lim; ++k) | 234 | for (k = 0; k < lim; ++k) |
235 | if (bitmap1[k] & bitmap2[k]) | 235 | if (bitmap1[k] & bitmap2[k]) |
236 | return 1; | 236 | return 1; |
237 | 237 | ||
238 | if (bits % BITS_PER_LONG) | 238 | if (bits % BITS_PER_LONG) |
239 | if ((bitmap1[k] & bitmap2[k]) & BITMAP_LAST_WORD_MASK(bits)) | 239 | if ((bitmap1[k] & bitmap2[k]) & BITMAP_LAST_WORD_MASK(bits)) |
240 | return 1; | 240 | return 1; |
241 | return 0; | 241 | return 0; |
242 | } | 242 | } |
243 | EXPORT_SYMBOL(__bitmap_intersects); | 243 | EXPORT_SYMBOL(__bitmap_intersects); |
244 | 244 | ||
245 | int __bitmap_subset(const unsigned long *bitmap1, | 245 | int __bitmap_subset(const unsigned long *bitmap1, |
246 | const unsigned long *bitmap2, int bits) | 246 | const unsigned long *bitmap2, int bits) |
247 | { | 247 | { |
248 | int k, lim = bits/BITS_PER_LONG; | 248 | int k, lim = bits/BITS_PER_LONG; |
249 | for (k = 0; k < lim; ++k) | 249 | for (k = 0; k < lim; ++k) |
250 | if (bitmap1[k] & ~bitmap2[k]) | 250 | if (bitmap1[k] & ~bitmap2[k]) |
251 | return 0; | 251 | return 0; |
252 | 252 | ||
253 | if (bits % BITS_PER_LONG) | 253 | if (bits % BITS_PER_LONG) |
254 | if ((bitmap1[k] & ~bitmap2[k]) & BITMAP_LAST_WORD_MASK(bits)) | 254 | if ((bitmap1[k] & ~bitmap2[k]) & BITMAP_LAST_WORD_MASK(bits)) |
255 | return 0; | 255 | return 0; |
256 | return 1; | 256 | return 1; |
257 | } | 257 | } |
258 | EXPORT_SYMBOL(__bitmap_subset); | 258 | EXPORT_SYMBOL(__bitmap_subset); |
259 | 259 | ||
260 | int __bitmap_weight(const unsigned long *bitmap, int bits) | 260 | int __bitmap_weight(const unsigned long *bitmap, int bits) |
261 | { | 261 | { |
262 | int k, w = 0, lim = bits/BITS_PER_LONG; | 262 | int k, w = 0, lim = bits/BITS_PER_LONG; |
263 | 263 | ||
264 | for (k = 0; k < lim; k++) | 264 | for (k = 0; k < lim; k++) |
265 | w += hweight_long(bitmap[k]); | 265 | w += hweight_long(bitmap[k]); |
266 | 266 | ||
267 | if (bits % BITS_PER_LONG) | 267 | if (bits % BITS_PER_LONG) |
268 | w += hweight_long(bitmap[k] & BITMAP_LAST_WORD_MASK(bits)); | 268 | w += hweight_long(bitmap[k] & BITMAP_LAST_WORD_MASK(bits)); |
269 | 269 | ||
270 | return w; | 270 | return w; |
271 | } | 271 | } |
272 | EXPORT_SYMBOL(__bitmap_weight); | 272 | EXPORT_SYMBOL(__bitmap_weight); |
273 | 273 | ||
274 | #define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) % BITS_PER_LONG)) | 274 | #define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) % BITS_PER_LONG)) |
275 | 275 | ||
276 | void bitmap_set(unsigned long *map, int start, int nr) | 276 | void bitmap_set(unsigned long *map, int start, int nr) |
277 | { | 277 | { |
278 | unsigned long *p = map + BIT_WORD(start); | 278 | unsigned long *p = map + BIT_WORD(start); |
279 | const int size = start + nr; | 279 | const int size = start + nr; |
280 | int bits_to_set = BITS_PER_LONG - (start % BITS_PER_LONG); | 280 | int bits_to_set = BITS_PER_LONG - (start % BITS_PER_LONG); |
281 | unsigned long mask_to_set = BITMAP_FIRST_WORD_MASK(start); | 281 | unsigned long mask_to_set = BITMAP_FIRST_WORD_MASK(start); |
282 | 282 | ||
283 | while (nr - bits_to_set >= 0) { | 283 | while (nr - bits_to_set >= 0) { |
284 | *p |= mask_to_set; | 284 | *p |= mask_to_set; |
285 | nr -= bits_to_set; | 285 | nr -= bits_to_set; |
286 | bits_to_set = BITS_PER_LONG; | 286 | bits_to_set = BITS_PER_LONG; |
287 | mask_to_set = ~0UL; | 287 | mask_to_set = ~0UL; |
288 | p++; | 288 | p++; |
289 | } | 289 | } |
290 | if (nr) { | 290 | if (nr) { |
291 | mask_to_set &= BITMAP_LAST_WORD_MASK(size); | 291 | mask_to_set &= BITMAP_LAST_WORD_MASK(size); |
292 | *p |= mask_to_set; | 292 | *p |= mask_to_set; |
293 | } | 293 | } |
294 | } | 294 | } |
295 | EXPORT_SYMBOL(bitmap_set); | 295 | EXPORT_SYMBOL(bitmap_set); |
296 | 296 | ||
297 | void bitmap_clear(unsigned long *map, int start, int nr) | 297 | void bitmap_clear(unsigned long *map, int start, int nr) |
298 | { | 298 | { |
299 | unsigned long *p = map + BIT_WORD(start); | 299 | unsigned long *p = map + BIT_WORD(start); |
300 | const int size = start + nr; | 300 | const int size = start + nr; |
301 | int bits_to_clear = BITS_PER_LONG - (start % BITS_PER_LONG); | 301 | int bits_to_clear = BITS_PER_LONG - (start % BITS_PER_LONG); |
302 | unsigned long mask_to_clear = BITMAP_FIRST_WORD_MASK(start); | 302 | unsigned long mask_to_clear = BITMAP_FIRST_WORD_MASK(start); |
303 | 303 | ||
304 | while (nr - bits_to_clear >= 0) { | 304 | while (nr - bits_to_clear >= 0) { |
305 | *p &= ~mask_to_clear; | 305 | *p &= ~mask_to_clear; |
306 | nr -= bits_to_clear; | 306 | nr -= bits_to_clear; |
307 | bits_to_clear = BITS_PER_LONG; | 307 | bits_to_clear = BITS_PER_LONG; |
308 | mask_to_clear = ~0UL; | 308 | mask_to_clear = ~0UL; |
309 | p++; | 309 | p++; |
310 | } | 310 | } |
311 | if (nr) { | 311 | if (nr) { |
312 | mask_to_clear &= BITMAP_LAST_WORD_MASK(size); | 312 | mask_to_clear &= BITMAP_LAST_WORD_MASK(size); |
313 | *p &= ~mask_to_clear; | 313 | *p &= ~mask_to_clear; |
314 | } | 314 | } |
315 | } | 315 | } |
316 | EXPORT_SYMBOL(bitmap_clear); | 316 | EXPORT_SYMBOL(bitmap_clear); |
317 | 317 | ||
318 | /* | 318 | /* |
319 | * bitmap_find_next_zero_area - find a contiguous aligned zero area | 319 | * bitmap_find_next_zero_area - find a contiguous aligned zero area |
320 | * @map: The address to base the search on | 320 | * @map: The address to base the search on |
321 | * @size: The bitmap size in bits | 321 | * @size: The bitmap size in bits |
322 | * @start: The bitnumber to start searching at | 322 | * @start: The bitnumber to start searching at |
323 | * @nr: The number of zeroed bits we're looking for | 323 | * @nr: The number of zeroed bits we're looking for |
324 | * @align_mask: Alignment mask for zero area | 324 | * @align_mask: Alignment mask for zero area |
325 | * | 325 | * |
326 | * The @align_mask should be one less than a power of 2; the effect is that | 326 | * The @align_mask should be one less than a power of 2; the effect is that |
327 | * the bit offset of all zero areas this function finds is multiples of that | 327 | * the bit offset of all zero areas this function finds is multiples of that |
328 | * power of 2. A @align_mask of 0 means no alignment is required. | 328 | * power of 2. A @align_mask of 0 means no alignment is required. |
329 | */ | 329 | */ |
330 | unsigned long bitmap_find_next_zero_area(unsigned long *map, | 330 | unsigned long bitmap_find_next_zero_area(unsigned long *map, |
331 | unsigned long size, | 331 | unsigned long size, |
332 | unsigned long start, | 332 | unsigned long start, |
333 | unsigned int nr, | 333 | unsigned int nr, |
334 | unsigned long align_mask) | 334 | unsigned long align_mask) |
335 | { | 335 | { |
336 | unsigned long index, end, i; | 336 | unsigned long index, end, i; |
337 | again: | 337 | again: |
338 | index = find_next_zero_bit(map, size, start); | 338 | index = find_next_zero_bit(map, size, start); |
339 | 339 | ||
340 | /* Align allocation */ | 340 | /* Align allocation */ |
341 | index = __ALIGN_MASK(index, align_mask); | 341 | index = __ALIGN_MASK(index, align_mask); |
342 | 342 | ||
343 | end = index + nr; | 343 | end = index + nr; |
344 | if (end > size) | 344 | if (end > size) |
345 | return end; | 345 | return end; |
346 | i = find_next_bit(map, end, index); | 346 | i = find_next_bit(map, end, index); |
347 | if (i < end) { | 347 | if (i < end) { |
348 | start = i + 1; | 348 | start = i + 1; |
349 | goto again; | 349 | goto again; |
350 | } | 350 | } |
351 | return index; | 351 | return index; |
352 | } | 352 | } |
353 | EXPORT_SYMBOL(bitmap_find_next_zero_area); | 353 | EXPORT_SYMBOL(bitmap_find_next_zero_area); |
354 | 354 | ||
355 | /* | 355 | /* |
356 | * Bitmap printing & parsing functions: first version by Bill Irwin, | 356 | * Bitmap printing & parsing functions: first version by Bill Irwin, |
357 | * second version by Paul Jackson, third by Joe Korty. | 357 | * second version by Paul Jackson, third by Joe Korty. |
358 | */ | 358 | */ |
359 | 359 | ||
360 | #define CHUNKSZ 32 | 360 | #define CHUNKSZ 32 |
361 | #define nbits_to_hold_value(val) fls(val) | 361 | #define nbits_to_hold_value(val) fls(val) |
362 | #define unhex(c) (isdigit(c) ? (c - '0') : (toupper(c) - 'A' + 10)) | 362 | #define unhex(c) (isdigit(c) ? (c - '0') : (toupper(c) - 'A' + 10)) |
363 | #define BASEDEC 10 /* fancier cpuset lists input in decimal */ | 363 | #define BASEDEC 10 /* fancier cpuset lists input in decimal */ |
364 | 364 | ||
365 | /** | 365 | /** |
366 | * bitmap_scnprintf - convert bitmap to an ASCII hex string. | 366 | * bitmap_scnprintf - convert bitmap to an ASCII hex string. |
367 | * @buf: byte buffer into which string is placed | 367 | * @buf: byte buffer into which string is placed |
368 | * @buflen: reserved size of @buf, in bytes | 368 | * @buflen: reserved size of @buf, in bytes |
369 | * @maskp: pointer to bitmap to convert | 369 | * @maskp: pointer to bitmap to convert |
370 | * @nmaskbits: size of bitmap, in bits | 370 | * @nmaskbits: size of bitmap, in bits |
371 | * | 371 | * |
372 | * Exactly @nmaskbits bits are displayed. Hex digits are grouped into | 372 | * Exactly @nmaskbits bits are displayed. Hex digits are grouped into |
373 | * comma-separated sets of eight digits per set. | 373 | * comma-separated sets of eight digits per set. |
374 | */ | 374 | */ |
375 | int bitmap_scnprintf(char *buf, unsigned int buflen, | 375 | int bitmap_scnprintf(char *buf, unsigned int buflen, |
376 | const unsigned long *maskp, int nmaskbits) | 376 | const unsigned long *maskp, int nmaskbits) |
377 | { | 377 | { |
378 | int i, word, bit, len = 0; | 378 | int i, word, bit, len = 0; |
379 | unsigned long val; | 379 | unsigned long val; |
380 | const char *sep = ""; | 380 | const char *sep = ""; |
381 | int chunksz; | 381 | int chunksz; |
382 | u32 chunkmask; | 382 | u32 chunkmask; |
383 | 383 | ||
384 | chunksz = nmaskbits & (CHUNKSZ - 1); | 384 | chunksz = nmaskbits & (CHUNKSZ - 1); |
385 | if (chunksz == 0) | 385 | if (chunksz == 0) |
386 | chunksz = CHUNKSZ; | 386 | chunksz = CHUNKSZ; |
387 | 387 | ||
388 | i = ALIGN(nmaskbits, CHUNKSZ) - CHUNKSZ; | 388 | i = ALIGN(nmaskbits, CHUNKSZ) - CHUNKSZ; |
389 | for (; i >= 0; i -= CHUNKSZ) { | 389 | for (; i >= 0; i -= CHUNKSZ) { |
390 | chunkmask = ((1ULL << chunksz) - 1); | 390 | chunkmask = ((1ULL << chunksz) - 1); |
391 | word = i / BITS_PER_LONG; | 391 | word = i / BITS_PER_LONG; |
392 | bit = i % BITS_PER_LONG; | 392 | bit = i % BITS_PER_LONG; |
393 | val = (maskp[word] >> bit) & chunkmask; | 393 | val = (maskp[word] >> bit) & chunkmask; |
394 | len += scnprintf(buf+len, buflen-len, "%s%0*lx", sep, | 394 | len += scnprintf(buf+len, buflen-len, "%s%0*lx", sep, |
395 | (chunksz+3)/4, val); | 395 | (chunksz+3)/4, val); |
396 | chunksz = CHUNKSZ; | 396 | chunksz = CHUNKSZ; |
397 | sep = ","; | 397 | sep = ","; |
398 | } | 398 | } |
399 | return len; | 399 | return len; |
400 | } | 400 | } |
401 | EXPORT_SYMBOL(bitmap_scnprintf); | 401 | EXPORT_SYMBOL(bitmap_scnprintf); |
402 | 402 | ||
403 | /** | 403 | /** |
404 | * __bitmap_parse - convert an ASCII hex string into a bitmap. | 404 | * __bitmap_parse - convert an ASCII hex string into a bitmap. |
405 | * @buf: pointer to buffer containing string. | 405 | * @buf: pointer to buffer containing string. |
406 | * @buflen: buffer size in bytes. If string is smaller than this | 406 | * @buflen: buffer size in bytes. If string is smaller than this |
407 | * then it must be terminated with a \0. | 407 | * then it must be terminated with a \0. |
408 | * @is_user: location of buffer, 0 indicates kernel space | 408 | * @is_user: location of buffer, 0 indicates kernel space |
409 | * @maskp: pointer to bitmap array that will contain result. | 409 | * @maskp: pointer to bitmap array that will contain result. |
410 | * @nmaskbits: size of bitmap, in bits. | 410 | * @nmaskbits: size of bitmap, in bits. |
411 | * | 411 | * |
412 | * Commas group hex digits into chunks. Each chunk defines exactly 32 | 412 | * Commas group hex digits into chunks. Each chunk defines exactly 32 |
413 | * bits of the resultant bitmask. No chunk may specify a value larger | 413 | * bits of the resultant bitmask. No chunk may specify a value larger |
414 | * than 32 bits (%-EOVERFLOW), and if a chunk specifies a smaller value | 414 | * than 32 bits (%-EOVERFLOW), and if a chunk specifies a smaller value |
415 | * then leading 0-bits are prepended. %-EINVAL is returned for illegal | 415 | * then leading 0-bits are prepended. %-EINVAL is returned for illegal |
416 | * characters and for grouping errors such as "1,,5", ",44", "," and "". | 416 | * characters and for grouping errors such as "1,,5", ",44", "," and "". |
417 | * Leading and trailing whitespace accepted, but not embedded whitespace. | 417 | * Leading and trailing whitespace accepted, but not embedded whitespace. |
418 | */ | 418 | */ |
419 | int __bitmap_parse(const char *buf, unsigned int buflen, | 419 | int __bitmap_parse(const char *buf, unsigned int buflen, |
420 | int is_user, unsigned long *maskp, | 420 | int is_user, unsigned long *maskp, |
421 | int nmaskbits) | 421 | int nmaskbits) |
422 | { | 422 | { |
423 | int c, old_c, totaldigits, ndigits, nchunks, nbits; | 423 | int c, old_c, totaldigits, ndigits, nchunks, nbits; |
424 | u32 chunk; | 424 | u32 chunk; |
425 | const char __user *ubuf = buf; | 425 | const char __user *ubuf = buf; |
426 | 426 | ||
427 | bitmap_zero(maskp, nmaskbits); | 427 | bitmap_zero(maskp, nmaskbits); |
428 | 428 | ||
429 | nchunks = nbits = totaldigits = c = 0; | 429 | nchunks = nbits = totaldigits = c = 0; |
430 | do { | 430 | do { |
431 | chunk = ndigits = 0; | 431 | chunk = ndigits = 0; |
432 | 432 | ||
433 | /* Get the next chunk of the bitmap */ | 433 | /* Get the next chunk of the bitmap */ |
434 | while (buflen) { | 434 | while (buflen) { |
435 | old_c = c; | 435 | old_c = c; |
436 | if (is_user) { | 436 | if (is_user) { |
437 | if (__get_user(c, ubuf++)) | 437 | if (__get_user(c, ubuf++)) |
438 | return -EFAULT; | 438 | return -EFAULT; |
439 | } | 439 | } |
440 | else | 440 | else |
441 | c = *buf++; | 441 | c = *buf++; |
442 | buflen--; | 442 | buflen--; |
443 | if (isspace(c)) | 443 | if (isspace(c)) |
444 | continue; | 444 | continue; |
445 | 445 | ||
446 | /* | 446 | /* |
447 | * If the last character was a space and the current | 447 | * If the last character was a space and the current |
448 | * character isn't '\0', we've got embedded whitespace. | 448 | * character isn't '\0', we've got embedded whitespace. |
449 | * This is a no-no, so throw an error. | 449 | * This is a no-no, so throw an error. |
450 | */ | 450 | */ |
451 | if (totaldigits && c && isspace(old_c)) | 451 | if (totaldigits && c && isspace(old_c)) |
452 | return -EINVAL; | 452 | return -EINVAL; |
453 | 453 | ||
454 | /* A '\0' or a ',' signal the end of the chunk */ | 454 | /* A '\0' or a ',' signal the end of the chunk */ |
455 | if (c == '\0' || c == ',') | 455 | if (c == '\0' || c == ',') |
456 | break; | 456 | break; |
457 | 457 | ||
458 | if (!isxdigit(c)) | 458 | if (!isxdigit(c)) |
459 | return -EINVAL; | 459 | return -EINVAL; |
460 | 460 | ||
461 | /* | 461 | /* |
462 | * Make sure there are at least 4 free bits in 'chunk'. | 462 | * Make sure there are at least 4 free bits in 'chunk'. |
463 | * If not, this hexdigit will overflow 'chunk', so | 463 | * If not, this hexdigit will overflow 'chunk', so |
464 | * throw an error. | 464 | * throw an error. |
465 | */ | 465 | */ |
466 | if (chunk & ~((1UL << (CHUNKSZ - 4)) - 1)) | 466 | if (chunk & ~((1UL << (CHUNKSZ - 4)) - 1)) |
467 | return -EOVERFLOW; | 467 | return -EOVERFLOW; |
468 | 468 | ||
469 | chunk = (chunk << 4) | unhex(c); | 469 | chunk = (chunk << 4) | unhex(c); |
470 | ndigits++; totaldigits++; | 470 | ndigits++; totaldigits++; |
471 | } | 471 | } |
472 | if (ndigits == 0) | 472 | if (ndigits == 0) |
473 | return -EINVAL; | 473 | return -EINVAL; |
474 | if (nchunks == 0 && chunk == 0) | 474 | if (nchunks == 0 && chunk == 0) |
475 | continue; | 475 | continue; |
476 | 476 | ||
477 | __bitmap_shift_left(maskp, maskp, CHUNKSZ, nmaskbits); | 477 | __bitmap_shift_left(maskp, maskp, CHUNKSZ, nmaskbits); |
478 | *maskp |= chunk; | 478 | *maskp |= chunk; |
479 | nchunks++; | 479 | nchunks++; |
480 | nbits += (nchunks == 1) ? nbits_to_hold_value(chunk) : CHUNKSZ; | 480 | nbits += (nchunks == 1) ? nbits_to_hold_value(chunk) : CHUNKSZ; |
481 | if (nbits > nmaskbits) | 481 | if (nbits > nmaskbits) |
482 | return -EOVERFLOW; | 482 | return -EOVERFLOW; |
483 | } while (buflen && c == ','); | 483 | } while (buflen && c == ','); |
484 | 484 | ||
485 | return 0; | 485 | return 0; |
486 | } | 486 | } |
487 | EXPORT_SYMBOL(__bitmap_parse); | 487 | EXPORT_SYMBOL(__bitmap_parse); |
488 | 488 | ||
489 | /** | 489 | /** |
490 | * bitmap_parse_user() | 490 | * bitmap_parse_user - convert an ASCII hex string in a user buffer into a bitmap |
491 | * | 491 | * |
492 | * @ubuf: pointer to user buffer containing string. | 492 | * @ubuf: pointer to user buffer containing string. |
493 | * @ulen: buffer size in bytes. If string is smaller than this | 493 | * @ulen: buffer size in bytes. If string is smaller than this |
494 | * then it must be terminated with a \0. | 494 | * then it must be terminated with a \0. |
495 | * @maskp: pointer to bitmap array that will contain result. | 495 | * @maskp: pointer to bitmap array that will contain result. |
496 | * @nmaskbits: size of bitmap, in bits. | 496 | * @nmaskbits: size of bitmap, in bits. |
497 | * | 497 | * |
498 | * Wrapper for __bitmap_parse(), providing it with user buffer. | 498 | * Wrapper for __bitmap_parse(), providing it with user buffer. |
499 | * | 499 | * |
500 | * We cannot have this as an inline function in bitmap.h because it needs | 500 | * We cannot have this as an inline function in bitmap.h because it needs |
501 | * linux/uaccess.h to get the access_ok() declaration and this causes | 501 | * linux/uaccess.h to get the access_ok() declaration and this causes |
502 | * cyclic dependencies. | 502 | * cyclic dependencies. |
503 | */ | 503 | */ |
504 | int bitmap_parse_user(const char __user *ubuf, | 504 | int bitmap_parse_user(const char __user *ubuf, |
505 | unsigned int ulen, unsigned long *maskp, | 505 | unsigned int ulen, unsigned long *maskp, |
506 | int nmaskbits) | 506 | int nmaskbits) |
507 | { | 507 | { |
508 | if (!access_ok(VERIFY_READ, ubuf, ulen)) | 508 | if (!access_ok(VERIFY_READ, ubuf, ulen)) |
509 | return -EFAULT; | 509 | return -EFAULT; |
510 | return __bitmap_parse((const char *)ubuf, ulen, 1, maskp, nmaskbits); | 510 | return __bitmap_parse((const char *)ubuf, ulen, 1, maskp, nmaskbits); |
511 | } | 511 | } |
512 | EXPORT_SYMBOL(bitmap_parse_user); | 512 | EXPORT_SYMBOL(bitmap_parse_user); |
513 | 513 | ||
514 | /* | 514 | /* |
515 | * bscnl_emit(buf, buflen, rbot, rtop, bp) | 515 | * bscnl_emit(buf, buflen, rbot, rtop, bp) |
516 | * | 516 | * |
517 | * Helper routine for bitmap_scnlistprintf(). Write decimal number | 517 | * Helper routine for bitmap_scnlistprintf(). Write decimal number |
518 | * or range to buf, suppressing output past buf+buflen, with optional | 518 | * or range to buf, suppressing output past buf+buflen, with optional |
519 | * comma-prefix. Return len of what would be written to buf, if it | 519 | * comma-prefix. Return len of what would be written to buf, if it |
520 | * all fit. | 520 | * all fit. |
521 | */ | 521 | */ |
522 | static inline int bscnl_emit(char *buf, int buflen, int rbot, int rtop, int len) | 522 | static inline int bscnl_emit(char *buf, int buflen, int rbot, int rtop, int len) |
523 | { | 523 | { |
524 | if (len > 0) | 524 | if (len > 0) |
525 | len += scnprintf(buf + len, buflen - len, ","); | 525 | len += scnprintf(buf + len, buflen - len, ","); |
526 | if (rbot == rtop) | 526 | if (rbot == rtop) |
527 | len += scnprintf(buf + len, buflen - len, "%d", rbot); | 527 | len += scnprintf(buf + len, buflen - len, "%d", rbot); |
528 | else | 528 | else |
529 | len += scnprintf(buf + len, buflen - len, "%d-%d", rbot, rtop); | 529 | len += scnprintf(buf + len, buflen - len, "%d-%d", rbot, rtop); |
530 | return len; | 530 | return len; |
531 | } | 531 | } |
532 | 532 | ||
533 | /** | 533 | /** |
534 | * bitmap_scnlistprintf - convert bitmap to list format ASCII string | 534 | * bitmap_scnlistprintf - convert bitmap to list format ASCII string |
535 | * @buf: byte buffer into which string is placed | 535 | * @buf: byte buffer into which string is placed |
536 | * @buflen: reserved size of @buf, in bytes | 536 | * @buflen: reserved size of @buf, in bytes |
537 | * @maskp: pointer to bitmap to convert | 537 | * @maskp: pointer to bitmap to convert |
538 | * @nmaskbits: size of bitmap, in bits | 538 | * @nmaskbits: size of bitmap, in bits |
539 | * | 539 | * |
540 | * Output format is a comma-separated list of decimal numbers and | 540 | * Output format is a comma-separated list of decimal numbers and |
541 | * ranges. Consecutively set bits are shown as two hyphen-separated | 541 | * ranges. Consecutively set bits are shown as two hyphen-separated |
542 | * decimal numbers, the smallest and largest bit numbers set in | 542 | * decimal numbers, the smallest and largest bit numbers set in |
543 | * the range. Output format is compatible with the format | 543 | * the range. Output format is compatible with the format |
544 | * accepted as input by bitmap_parselist(). | 544 | * accepted as input by bitmap_parselist(). |
545 | * | 545 | * |
546 | * The return value is the number of characters which would be | 546 | * The return value is the number of characters which would be |
547 | * generated for the given input, excluding the trailing '\0', as | 547 | * generated for the given input, excluding the trailing '\0', as |
548 | * per ISO C99. | 548 | * per ISO C99. |
549 | */ | 549 | */ |
550 | int bitmap_scnlistprintf(char *buf, unsigned int buflen, | 550 | int bitmap_scnlistprintf(char *buf, unsigned int buflen, |
551 | const unsigned long *maskp, int nmaskbits) | 551 | const unsigned long *maskp, int nmaskbits) |
552 | { | 552 | { |
553 | int len = 0; | 553 | int len = 0; |
554 | /* current bit is 'cur', most recently seen range is [rbot, rtop] */ | 554 | /* current bit is 'cur', most recently seen range is [rbot, rtop] */ |
555 | int cur, rbot, rtop; | 555 | int cur, rbot, rtop; |
556 | 556 | ||
557 | if (buflen == 0) | 557 | if (buflen == 0) |
558 | return 0; | 558 | return 0; |
559 | buf[0] = 0; | 559 | buf[0] = 0; |
560 | 560 | ||
561 | rbot = cur = find_first_bit(maskp, nmaskbits); | 561 | rbot = cur = find_first_bit(maskp, nmaskbits); |
562 | while (cur < nmaskbits) { | 562 | while (cur < nmaskbits) { |
563 | rtop = cur; | 563 | rtop = cur; |
564 | cur = find_next_bit(maskp, nmaskbits, cur+1); | 564 | cur = find_next_bit(maskp, nmaskbits, cur+1); |
565 | if (cur >= nmaskbits || cur > rtop + 1) { | 565 | if (cur >= nmaskbits || cur > rtop + 1) { |
566 | len = bscnl_emit(buf, buflen, rbot, rtop, len); | 566 | len = bscnl_emit(buf, buflen, rbot, rtop, len); |
567 | rbot = cur; | 567 | rbot = cur; |
568 | } | 568 | } |
569 | } | 569 | } |
570 | return len; | 570 | return len; |
571 | } | 571 | } |
572 | EXPORT_SYMBOL(bitmap_scnlistprintf); | 572 | EXPORT_SYMBOL(bitmap_scnlistprintf); |
573 | 573 | ||
574 | /** | 574 | /** |
575 | * bitmap_parselist - convert list format ASCII string to bitmap | 575 | * bitmap_parselist - convert list format ASCII string to bitmap |
576 | * @bp: read nul-terminated user string from this buffer | 576 | * @bp: read nul-terminated user string from this buffer |
577 | * @maskp: write resulting mask here | 577 | * @maskp: write resulting mask here |
578 | * @nmaskbits: number of bits in mask to be written | 578 | * @nmaskbits: number of bits in mask to be written |
579 | * | 579 | * |
580 | * Input format is a comma-separated list of decimal numbers and | 580 | * Input format is a comma-separated list of decimal numbers and |
581 | * ranges. Consecutively set bits are shown as two hyphen-separated | 581 | * ranges. Consecutively set bits are shown as two hyphen-separated |
582 | * decimal numbers, the smallest and largest bit numbers set in | 582 | * decimal numbers, the smallest and largest bit numbers set in |
583 | * the range. | 583 | * the range. |
584 | * | 584 | * |
585 | * Returns 0 on success, -errno on invalid input strings. | 585 | * Returns 0 on success, -errno on invalid input strings. |
586 | * Error values: | 586 | * Error values: |
587 | * %-EINVAL: second number in range smaller than first | 587 | * %-EINVAL: second number in range smaller than first |
588 | * %-EINVAL: invalid character in string | 588 | * %-EINVAL: invalid character in string |
589 | * %-ERANGE: bit number specified too large for mask | 589 | * %-ERANGE: bit number specified too large for mask |
590 | */ | 590 | */ |
591 | int bitmap_parselist(const char *bp, unsigned long *maskp, int nmaskbits) | 591 | int bitmap_parselist(const char *bp, unsigned long *maskp, int nmaskbits) |
592 | { | 592 | { |
593 | unsigned a, b; | 593 | unsigned a, b; |
594 | 594 | ||
595 | bitmap_zero(maskp, nmaskbits); | 595 | bitmap_zero(maskp, nmaskbits); |
596 | do { | 596 | do { |
597 | if (!isdigit(*bp)) | 597 | if (!isdigit(*bp)) |
598 | return -EINVAL; | 598 | return -EINVAL; |
599 | b = a = simple_strtoul(bp, (char **)&bp, BASEDEC); | 599 | b = a = simple_strtoul(bp, (char **)&bp, BASEDEC); |
600 | if (*bp == '-') { | 600 | if (*bp == '-') { |
601 | bp++; | 601 | bp++; |
602 | if (!isdigit(*bp)) | 602 | if (!isdigit(*bp)) |
603 | return -EINVAL; | 603 | return -EINVAL; |
604 | b = simple_strtoul(bp, (char **)&bp, BASEDEC); | 604 | b = simple_strtoul(bp, (char **)&bp, BASEDEC); |
605 | } | 605 | } |
606 | if (!(a <= b)) | 606 | if (!(a <= b)) |
607 | return -EINVAL; | 607 | return -EINVAL; |
608 | if (b >= nmaskbits) | 608 | if (b >= nmaskbits) |
609 | return -ERANGE; | 609 | return -ERANGE; |
610 | while (a <= b) { | 610 | while (a <= b) { |
611 | set_bit(a, maskp); | 611 | set_bit(a, maskp); |
612 | a++; | 612 | a++; |
613 | } | 613 | } |
614 | if (*bp == ',') | 614 | if (*bp == ',') |
615 | bp++; | 615 | bp++; |
616 | } while (*bp != '\0' && *bp != '\n'); | 616 | } while (*bp != '\0' && *bp != '\n'); |
617 | return 0; | 617 | return 0; |
618 | } | 618 | } |
619 | EXPORT_SYMBOL(bitmap_parselist); | 619 | EXPORT_SYMBOL(bitmap_parselist); |
620 | 620 | ||
621 | /** | 621 | /** |
622 | * bitmap_pos_to_ord(buf, pos, bits) | 622 | * bitmap_pos_to_ord - find ordinal of set bit at given position in bitmap |
623 | * @buf: pointer to a bitmap | 623 | * @buf: pointer to a bitmap |
624 | * @pos: a bit position in @buf (0 <= @pos < @bits) | 624 | * @pos: a bit position in @buf (0 <= @pos < @bits) |
625 | * @bits: number of valid bit positions in @buf | 625 | * @bits: number of valid bit positions in @buf |
626 | * | 626 | * |
627 | * Map the bit at position @pos in @buf (of length @bits) to the | 627 | * Map the bit at position @pos in @buf (of length @bits) to the |
628 | * ordinal of which set bit it is. If it is not set or if @pos | 628 | * ordinal of which set bit it is. If it is not set or if @pos |
629 | * is not a valid bit position, map to -1. | 629 | * is not a valid bit position, map to -1. |
630 | * | 630 | * |
631 | * If for example, just bits 4 through 7 are set in @buf, then @pos | 631 | * If for example, just bits 4 through 7 are set in @buf, then @pos |
632 | * values 4 through 7 will get mapped to 0 through 3, respectively, | 632 | * values 4 through 7 will get mapped to 0 through 3, respectively, |
633 | * and other @pos values will get mapped to 0. When @pos value 7 | 633 | * and other @pos values will get mapped to 0. When @pos value 7 |
634 | * gets mapped to (returns) @ord value 3 in this example, that means | 634 | * gets mapped to (returns) @ord value 3 in this example, that means |
635 | * that bit 7 is the 3rd (starting with 0th) set bit in @buf. | 635 | * that bit 7 is the 3rd (starting with 0th) set bit in @buf. |
636 | * | 636 | * |
637 | * The bit positions 0 through @bits are valid positions in @buf. | 637 | * The bit positions 0 through @bits are valid positions in @buf. |
638 | */ | 638 | */ |
639 | static int bitmap_pos_to_ord(const unsigned long *buf, int pos, int bits) | 639 | static int bitmap_pos_to_ord(const unsigned long *buf, int pos, int bits) |
640 | { | 640 | { |
641 | int i, ord; | 641 | int i, ord; |
642 | 642 | ||
643 | if (pos < 0 || pos >= bits || !test_bit(pos, buf)) | 643 | if (pos < 0 || pos >= bits || !test_bit(pos, buf)) |
644 | return -1; | 644 | return -1; |
645 | 645 | ||
646 | i = find_first_bit(buf, bits); | 646 | i = find_first_bit(buf, bits); |
647 | ord = 0; | 647 | ord = 0; |
648 | while (i < pos) { | 648 | while (i < pos) { |
649 | i = find_next_bit(buf, bits, i + 1); | 649 | i = find_next_bit(buf, bits, i + 1); |
650 | ord++; | 650 | ord++; |
651 | } | 651 | } |
652 | BUG_ON(i != pos); | 652 | BUG_ON(i != pos); |
653 | 653 | ||
654 | return ord; | 654 | return ord; |
655 | } | 655 | } |
656 | 656 | ||
657 | /** | 657 | /** |
658 | * bitmap_ord_to_pos(buf, ord, bits) | 658 | * bitmap_ord_to_pos - find position of n-th set bit in bitmap |
659 | * @buf: pointer to bitmap | 659 | * @buf: pointer to bitmap |
660 | * @ord: ordinal bit position (n-th set bit, n >= 0) | 660 | * @ord: ordinal bit position (n-th set bit, n >= 0) |
661 | * @bits: number of valid bit positions in @buf | 661 | * @bits: number of valid bit positions in @buf |
662 | * | 662 | * |
663 | * Map the ordinal offset of bit @ord in @buf to its position in @buf. | 663 | * Map the ordinal offset of bit @ord in @buf to its position in @buf. |
664 | * Value of @ord should be in range 0 <= @ord < weight(buf), else | 664 | * Value of @ord should be in range 0 <= @ord < weight(buf), else |
665 | * results are undefined. | 665 | * results are undefined. |
666 | * | 666 | * |
667 | * If for example, just bits 4 through 7 are set in @buf, then @ord | 667 | * If for example, just bits 4 through 7 are set in @buf, then @ord |
668 | * values 0 through 3 will get mapped to 4 through 7, respectively, | 668 | * values 0 through 3 will get mapped to 4 through 7, respectively, |
669 | * and all other @ord values return undefined values. When @ord value 3 | 669 | * and all other @ord values return undefined values. When @ord value 3 |
670 | * gets mapped to (returns) @pos value 7 in this example, that means | 670 | * gets mapped to (returns) @pos value 7 in this example, that means |
671 | * that the 3rd set bit (starting with 0th) is at position 7 in @buf. | 671 | * that the 3rd set bit (starting with 0th) is at position 7 in @buf. |
672 | * | 672 | * |
673 | * The bit positions 0 through @bits are valid positions in @buf. | 673 | * The bit positions 0 through @bits are valid positions in @buf. |
674 | */ | 674 | */ |
675 | static int bitmap_ord_to_pos(const unsigned long *buf, int ord, int bits) | 675 | static int bitmap_ord_to_pos(const unsigned long *buf, int ord, int bits) |
676 | { | 676 | { |
677 | int pos = 0; | 677 | int pos = 0; |
678 | 678 | ||
679 | if (ord >= 0 && ord < bits) { | 679 | if (ord >= 0 && ord < bits) { |
680 | int i; | 680 | int i; |
681 | 681 | ||
682 | for (i = find_first_bit(buf, bits); | 682 | for (i = find_first_bit(buf, bits); |
683 | i < bits && ord > 0; | 683 | i < bits && ord > 0; |
684 | i = find_next_bit(buf, bits, i + 1)) | 684 | i = find_next_bit(buf, bits, i + 1)) |
685 | ord--; | 685 | ord--; |
686 | if (i < bits && ord == 0) | 686 | if (i < bits && ord == 0) |
687 | pos = i; | 687 | pos = i; |
688 | } | 688 | } |
689 | 689 | ||
690 | return pos; | 690 | return pos; |
691 | } | 691 | } |
692 | 692 | ||
693 | /** | 693 | /** |
694 | * bitmap_remap - Apply map defined by a pair of bitmaps to another bitmap | 694 | * bitmap_remap - Apply map defined by a pair of bitmaps to another bitmap |
695 | * @dst: remapped result | 695 | * @dst: remapped result |
696 | * @src: subset to be remapped | 696 | * @src: subset to be remapped |
697 | * @old: defines domain of map | 697 | * @old: defines domain of map |
698 | * @new: defines range of map | 698 | * @new: defines range of map |
699 | * @bits: number of bits in each of these bitmaps | 699 | * @bits: number of bits in each of these bitmaps |
700 | * | 700 | * |
701 | * Let @old and @new define a mapping of bit positions, such that | 701 | * Let @old and @new define a mapping of bit positions, such that |
702 | * whatever position is held by the n-th set bit in @old is mapped | 702 | * whatever position is held by the n-th set bit in @old is mapped |
703 | * to the n-th set bit in @new. In the more general case, allowing | 703 | * to the n-th set bit in @new. In the more general case, allowing |
704 | * for the possibility that the weight 'w' of @new is less than the | 704 | * for the possibility that the weight 'w' of @new is less than the |
705 | * weight of @old, map the position of the n-th set bit in @old to | 705 | * weight of @old, map the position of the n-th set bit in @old to |
706 | * the position of the m-th set bit in @new, where m == n % w. | 706 | * the position of the m-th set bit in @new, where m == n % w. |
707 | * | 707 | * |
708 | * If either of the @old and @new bitmaps are empty, or if @src and | 708 | * If either of the @old and @new bitmaps are empty, or if @src and |
709 | * @dst point to the same location, then this routine copies @src | 709 | * @dst point to the same location, then this routine copies @src |
710 | * to @dst. | 710 | * to @dst. |
711 | * | 711 | * |
712 | * The positions of unset bits in @old are mapped to themselves | 712 | * The positions of unset bits in @old are mapped to themselves |
713 | * (the identify map). | 713 | * (the identify map). |
714 | * | 714 | * |
715 | * Apply the above specified mapping to @src, placing the result in | 715 | * Apply the above specified mapping to @src, placing the result in |
716 | * @dst, clearing any bits previously set in @dst. | 716 | * @dst, clearing any bits previously set in @dst. |
717 | * | 717 | * |
718 | * For example, lets say that @old has bits 4 through 7 set, and | 718 | * For example, lets say that @old has bits 4 through 7 set, and |
719 | * @new has bits 12 through 15 set. This defines the mapping of bit | 719 | * @new has bits 12 through 15 set. This defines the mapping of bit |
720 | * position 4 to 12, 5 to 13, 6 to 14 and 7 to 15, and of all other | 720 | * position 4 to 12, 5 to 13, 6 to 14 and 7 to 15, and of all other |
721 | * bit positions unchanged. So if say @src comes into this routine | 721 | * bit positions unchanged. So if say @src comes into this routine |
722 | * with bits 1, 5 and 7 set, then @dst should leave with bits 1, | 722 | * with bits 1, 5 and 7 set, then @dst should leave with bits 1, |
723 | * 13 and 15 set. | 723 | * 13 and 15 set. |
724 | */ | 724 | */ |
725 | void bitmap_remap(unsigned long *dst, const unsigned long *src, | 725 | void bitmap_remap(unsigned long *dst, const unsigned long *src, |
726 | const unsigned long *old, const unsigned long *new, | 726 | const unsigned long *old, const unsigned long *new, |
727 | int bits) | 727 | int bits) |
728 | { | 728 | { |
729 | int oldbit, w; | 729 | int oldbit, w; |
730 | 730 | ||
731 | if (dst == src) /* following doesn't handle inplace remaps */ | 731 | if (dst == src) /* following doesn't handle inplace remaps */ |
732 | return; | 732 | return; |
733 | bitmap_zero(dst, bits); | 733 | bitmap_zero(dst, bits); |
734 | 734 | ||
735 | w = bitmap_weight(new, bits); | 735 | w = bitmap_weight(new, bits); |
736 | for (oldbit = find_first_bit(src, bits); | 736 | for (oldbit = find_first_bit(src, bits); |
737 | oldbit < bits; | 737 | oldbit < bits; |
738 | oldbit = find_next_bit(src, bits, oldbit + 1)) { | 738 | oldbit = find_next_bit(src, bits, oldbit + 1)) { |
739 | int n = bitmap_pos_to_ord(old, oldbit, bits); | 739 | int n = bitmap_pos_to_ord(old, oldbit, bits); |
740 | if (n < 0 || w == 0) | 740 | if (n < 0 || w == 0) |
741 | set_bit(oldbit, dst); /* identity map */ | 741 | set_bit(oldbit, dst); /* identity map */ |
742 | else | 742 | else |
743 | set_bit(bitmap_ord_to_pos(new, n % w, bits), dst); | 743 | set_bit(bitmap_ord_to_pos(new, n % w, bits), dst); |
744 | } | 744 | } |
745 | } | 745 | } |
746 | EXPORT_SYMBOL(bitmap_remap); | 746 | EXPORT_SYMBOL(bitmap_remap); |
747 | 747 | ||
748 | /** | 748 | /** |
749 | * bitmap_bitremap - Apply map defined by a pair of bitmaps to a single bit | 749 | * bitmap_bitremap - Apply map defined by a pair of bitmaps to a single bit |
750 | * @oldbit: bit position to be mapped | 750 | * @oldbit: bit position to be mapped |
751 | * @old: defines domain of map | 751 | * @old: defines domain of map |
752 | * @new: defines range of map | 752 | * @new: defines range of map |
753 | * @bits: number of bits in each of these bitmaps | 753 | * @bits: number of bits in each of these bitmaps |
754 | * | 754 | * |
755 | * Let @old and @new define a mapping of bit positions, such that | 755 | * Let @old and @new define a mapping of bit positions, such that |
756 | * whatever position is held by the n-th set bit in @old is mapped | 756 | * whatever position is held by the n-th set bit in @old is mapped |
757 | * to the n-th set bit in @new. In the more general case, allowing | 757 | * to the n-th set bit in @new. In the more general case, allowing |
758 | * for the possibility that the weight 'w' of @new is less than the | 758 | * for the possibility that the weight 'w' of @new is less than the |
759 | * weight of @old, map the position of the n-th set bit in @old to | 759 | * weight of @old, map the position of the n-th set bit in @old to |
760 | * the position of the m-th set bit in @new, where m == n % w. | 760 | * the position of the m-th set bit in @new, where m == n % w. |
761 | * | 761 | * |
762 | * The positions of unset bits in @old are mapped to themselves | 762 | * The positions of unset bits in @old are mapped to themselves |
763 | * (the identify map). | 763 | * (the identify map). |
764 | * | 764 | * |
765 | * Apply the above specified mapping to bit position @oldbit, returning | 765 | * Apply the above specified mapping to bit position @oldbit, returning |
766 | * the new bit position. | 766 | * the new bit position. |
767 | * | 767 | * |
768 | * For example, lets say that @old has bits 4 through 7 set, and | 768 | * For example, lets say that @old has bits 4 through 7 set, and |
769 | * @new has bits 12 through 15 set. This defines the mapping of bit | 769 | * @new has bits 12 through 15 set. This defines the mapping of bit |
770 | * position 4 to 12, 5 to 13, 6 to 14 and 7 to 15, and of all other | 770 | * position 4 to 12, 5 to 13, 6 to 14 and 7 to 15, and of all other |
771 | * bit positions unchanged. So if say @oldbit is 5, then this routine | 771 | * bit positions unchanged. So if say @oldbit is 5, then this routine |
772 | * returns 13. | 772 | * returns 13. |
773 | */ | 773 | */ |
774 | int bitmap_bitremap(int oldbit, const unsigned long *old, | 774 | int bitmap_bitremap(int oldbit, const unsigned long *old, |
775 | const unsigned long *new, int bits) | 775 | const unsigned long *new, int bits) |
776 | { | 776 | { |
777 | int w = bitmap_weight(new, bits); | 777 | int w = bitmap_weight(new, bits); |
778 | int n = bitmap_pos_to_ord(old, oldbit, bits); | 778 | int n = bitmap_pos_to_ord(old, oldbit, bits); |
779 | if (n < 0 || w == 0) | 779 | if (n < 0 || w == 0) |
780 | return oldbit; | 780 | return oldbit; |
781 | else | 781 | else |
782 | return bitmap_ord_to_pos(new, n % w, bits); | 782 | return bitmap_ord_to_pos(new, n % w, bits); |
783 | } | 783 | } |
784 | EXPORT_SYMBOL(bitmap_bitremap); | 784 | EXPORT_SYMBOL(bitmap_bitremap); |
785 | 785 | ||
786 | /** | 786 | /** |
787 | * bitmap_onto - translate one bitmap relative to another | 787 | * bitmap_onto - translate one bitmap relative to another |
788 | * @dst: resulting translated bitmap | 788 | * @dst: resulting translated bitmap |
789 | * @orig: original untranslated bitmap | 789 | * @orig: original untranslated bitmap |
790 | * @relmap: bitmap relative to which translated | 790 | * @relmap: bitmap relative to which translated |
791 | * @bits: number of bits in each of these bitmaps | 791 | * @bits: number of bits in each of these bitmaps |
792 | * | 792 | * |
793 | * Set the n-th bit of @dst iff there exists some m such that the | 793 | * Set the n-th bit of @dst iff there exists some m such that the |
794 | * n-th bit of @relmap is set, the m-th bit of @orig is set, and | 794 | * n-th bit of @relmap is set, the m-th bit of @orig is set, and |
795 | * the n-th bit of @relmap is also the m-th _set_ bit of @relmap. | 795 | * the n-th bit of @relmap is also the m-th _set_ bit of @relmap. |
796 | * (If you understood the previous sentence the first time your | 796 | * (If you understood the previous sentence the first time your |
797 | * read it, you're overqualified for your current job.) | 797 | * read it, you're overqualified for your current job.) |
798 | * | 798 | * |
799 | * In other words, @orig is mapped onto (surjectively) @dst, | 799 | * In other words, @orig is mapped onto (surjectively) @dst, |
800 | * using the the map { <n, m> | the n-th bit of @relmap is the | 800 | * using the the map { <n, m> | the n-th bit of @relmap is the |
801 | * m-th set bit of @relmap }. | 801 | * m-th set bit of @relmap }. |
802 | * | 802 | * |
803 | * Any set bits in @orig above bit number W, where W is the | 803 | * Any set bits in @orig above bit number W, where W is the |
804 | * weight of (number of set bits in) @relmap are mapped nowhere. | 804 | * weight of (number of set bits in) @relmap are mapped nowhere. |
805 | * In particular, if for all bits m set in @orig, m >= W, then | 805 | * In particular, if for all bits m set in @orig, m >= W, then |
806 | * @dst will end up empty. In situations where the possibility | 806 | * @dst will end up empty. In situations where the possibility |
807 | * of such an empty result is not desired, one way to avoid it is | 807 | * of such an empty result is not desired, one way to avoid it is |
808 | * to use the bitmap_fold() operator, below, to first fold the | 808 | * to use the bitmap_fold() operator, below, to first fold the |
809 | * @orig bitmap over itself so that all its set bits x are in the | 809 | * @orig bitmap over itself so that all its set bits x are in the |
810 | * range 0 <= x < W. The bitmap_fold() operator does this by | 810 | * range 0 <= x < W. The bitmap_fold() operator does this by |
811 | * setting the bit (m % W) in @dst, for each bit (m) set in @orig. | 811 | * setting the bit (m % W) in @dst, for each bit (m) set in @orig. |
812 | * | 812 | * |
813 | * Example [1] for bitmap_onto(): | 813 | * Example [1] for bitmap_onto(): |
814 | * Let's say @relmap has bits 30-39 set, and @orig has bits | 814 | * Let's say @relmap has bits 30-39 set, and @orig has bits |
815 | * 1, 3, 5, 7, 9 and 11 set. Then on return from this routine, | 815 | * 1, 3, 5, 7, 9 and 11 set. Then on return from this routine, |
816 | * @dst will have bits 31, 33, 35, 37 and 39 set. | 816 | * @dst will have bits 31, 33, 35, 37 and 39 set. |
817 | * | 817 | * |
818 | * When bit 0 is set in @orig, it means turn on the bit in | 818 | * When bit 0 is set in @orig, it means turn on the bit in |
819 | * @dst corresponding to whatever is the first bit (if any) | 819 | * @dst corresponding to whatever is the first bit (if any) |
820 | * that is turned on in @relmap. Since bit 0 was off in the | 820 | * that is turned on in @relmap. Since bit 0 was off in the |
821 | * above example, we leave off that bit (bit 30) in @dst. | 821 | * above example, we leave off that bit (bit 30) in @dst. |
822 | * | 822 | * |
823 | * When bit 1 is set in @orig (as in the above example), it | 823 | * When bit 1 is set in @orig (as in the above example), it |
824 | * means turn on the bit in @dst corresponding to whatever | 824 | * means turn on the bit in @dst corresponding to whatever |
825 | * is the second bit that is turned on in @relmap. The second | 825 | * is the second bit that is turned on in @relmap. The second |
826 | * bit in @relmap that was turned on in the above example was | 826 | * bit in @relmap that was turned on in the above example was |
827 | * bit 31, so we turned on bit 31 in @dst. | 827 | * bit 31, so we turned on bit 31 in @dst. |
828 | * | 828 | * |
829 | * Similarly, we turned on bits 33, 35, 37 and 39 in @dst, | 829 | * Similarly, we turned on bits 33, 35, 37 and 39 in @dst, |
830 | * because they were the 4th, 6th, 8th and 10th set bits | 830 | * because they were the 4th, 6th, 8th and 10th set bits |
831 | * set in @relmap, and the 4th, 6th, 8th and 10th bits of | 831 | * set in @relmap, and the 4th, 6th, 8th and 10th bits of |
832 | * @orig (i.e. bits 3, 5, 7 and 9) were also set. | 832 | * @orig (i.e. bits 3, 5, 7 and 9) were also set. |
833 | * | 833 | * |
834 | * When bit 11 is set in @orig, it means turn on the bit in | 834 | * When bit 11 is set in @orig, it means turn on the bit in |
835 | * @dst corresponding to whatever is the twelth bit that is | 835 | * @dst corresponding to whatever is the twelth bit that is |
836 | * turned on in @relmap. In the above example, there were | 836 | * turned on in @relmap. In the above example, there were |
837 | * only ten bits turned on in @relmap (30..39), so that bit | 837 | * only ten bits turned on in @relmap (30..39), so that bit |
838 | * 11 was set in @orig had no affect on @dst. | 838 | * 11 was set in @orig had no affect on @dst. |
839 | * | 839 | * |
840 | * Example [2] for bitmap_fold() + bitmap_onto(): | 840 | * Example [2] for bitmap_fold() + bitmap_onto(): |
841 | * Let's say @relmap has these ten bits set: | 841 | * Let's say @relmap has these ten bits set: |
842 | * 40 41 42 43 45 48 53 61 74 95 | 842 | * 40 41 42 43 45 48 53 61 74 95 |
843 | * (for the curious, that's 40 plus the first ten terms of the | 843 | * (for the curious, that's 40 plus the first ten terms of the |
844 | * Fibonacci sequence.) | 844 | * Fibonacci sequence.) |
845 | * | 845 | * |
846 | * Further lets say we use the following code, invoking | 846 | * Further lets say we use the following code, invoking |
847 | * bitmap_fold() then bitmap_onto, as suggested above to | 847 | * bitmap_fold() then bitmap_onto, as suggested above to |
848 | * avoid the possitility of an empty @dst result: | 848 | * avoid the possitility of an empty @dst result: |
849 | * | 849 | * |
850 | * unsigned long *tmp; // a temporary bitmap's bits | 850 | * unsigned long *tmp; // a temporary bitmap's bits |
851 | * | 851 | * |
852 | * bitmap_fold(tmp, orig, bitmap_weight(relmap, bits), bits); | 852 | * bitmap_fold(tmp, orig, bitmap_weight(relmap, bits), bits); |
853 | * bitmap_onto(dst, tmp, relmap, bits); | 853 | * bitmap_onto(dst, tmp, relmap, bits); |
854 | * | 854 | * |
855 | * Then this table shows what various values of @dst would be, for | 855 | * Then this table shows what various values of @dst would be, for |
856 | * various @orig's. I list the zero-based positions of each set bit. | 856 | * various @orig's. I list the zero-based positions of each set bit. |
857 | * The tmp column shows the intermediate result, as computed by | 857 | * The tmp column shows the intermediate result, as computed by |
858 | * using bitmap_fold() to fold the @orig bitmap modulo ten | 858 | * using bitmap_fold() to fold the @orig bitmap modulo ten |
859 | * (the weight of @relmap). | 859 | * (the weight of @relmap). |
860 | * | 860 | * |
861 | * @orig tmp @dst | 861 | * @orig tmp @dst |
862 | * 0 0 40 | 862 | * 0 0 40 |
863 | * 1 1 41 | 863 | * 1 1 41 |
864 | * 9 9 95 | 864 | * 9 9 95 |
865 | * 10 0 40 (*) | 865 | * 10 0 40 (*) |
866 | * 1 3 5 7 1 3 5 7 41 43 48 61 | 866 | * 1 3 5 7 1 3 5 7 41 43 48 61 |
867 | * 0 1 2 3 4 0 1 2 3 4 40 41 42 43 45 | 867 | * 0 1 2 3 4 0 1 2 3 4 40 41 42 43 45 |
868 | * 0 9 18 27 0 9 8 7 40 61 74 95 | 868 | * 0 9 18 27 0 9 8 7 40 61 74 95 |
869 | * 0 10 20 30 0 40 | 869 | * 0 10 20 30 0 40 |
870 | * 0 11 22 33 0 1 2 3 40 41 42 43 | 870 | * 0 11 22 33 0 1 2 3 40 41 42 43 |
871 | * 0 12 24 36 0 2 4 6 40 42 45 53 | 871 | * 0 12 24 36 0 2 4 6 40 42 45 53 |
872 | * 78 102 211 1 2 8 41 42 74 (*) | 872 | * 78 102 211 1 2 8 41 42 74 (*) |
873 | * | 873 | * |
874 | * (*) For these marked lines, if we hadn't first done bitmap_fold() | 874 | * (*) For these marked lines, if we hadn't first done bitmap_fold() |
875 | * into tmp, then the @dst result would have been empty. | 875 | * into tmp, then the @dst result would have been empty. |
876 | * | 876 | * |
877 | * If either of @orig or @relmap is empty (no set bits), then @dst | 877 | * If either of @orig or @relmap is empty (no set bits), then @dst |
878 | * will be returned empty. | 878 | * will be returned empty. |
879 | * | 879 | * |
880 | * If (as explained above) the only set bits in @orig are in positions | 880 | * If (as explained above) the only set bits in @orig are in positions |
881 | * m where m >= W, (where W is the weight of @relmap) then @dst will | 881 | * m where m >= W, (where W is the weight of @relmap) then @dst will |
882 | * once again be returned empty. | 882 | * once again be returned empty. |
883 | * | 883 | * |
884 | * All bits in @dst not set by the above rule are cleared. | 884 | * All bits in @dst not set by the above rule are cleared. |
885 | */ | 885 | */ |
886 | void bitmap_onto(unsigned long *dst, const unsigned long *orig, | 886 | void bitmap_onto(unsigned long *dst, const unsigned long *orig, |
887 | const unsigned long *relmap, int bits) | 887 | const unsigned long *relmap, int bits) |
888 | { | 888 | { |
889 | int n, m; /* same meaning as in above comment */ | 889 | int n, m; /* same meaning as in above comment */ |
890 | 890 | ||
891 | if (dst == orig) /* following doesn't handle inplace mappings */ | 891 | if (dst == orig) /* following doesn't handle inplace mappings */ |
892 | return; | 892 | return; |
893 | bitmap_zero(dst, bits); | 893 | bitmap_zero(dst, bits); |
894 | 894 | ||
895 | /* | 895 | /* |
896 | * The following code is a more efficient, but less | 896 | * The following code is a more efficient, but less |
897 | * obvious, equivalent to the loop: | 897 | * obvious, equivalent to the loop: |
898 | * for (m = 0; m < bitmap_weight(relmap, bits); m++) { | 898 | * for (m = 0; m < bitmap_weight(relmap, bits); m++) { |
899 | * n = bitmap_ord_to_pos(orig, m, bits); | 899 | * n = bitmap_ord_to_pos(orig, m, bits); |
900 | * if (test_bit(m, orig)) | 900 | * if (test_bit(m, orig)) |
901 | * set_bit(n, dst); | 901 | * set_bit(n, dst); |
902 | * } | 902 | * } |
903 | */ | 903 | */ |
904 | 904 | ||
905 | m = 0; | 905 | m = 0; |
906 | for (n = find_first_bit(relmap, bits); | 906 | for (n = find_first_bit(relmap, bits); |
907 | n < bits; | 907 | n < bits; |
908 | n = find_next_bit(relmap, bits, n + 1)) { | 908 | n = find_next_bit(relmap, bits, n + 1)) { |
909 | /* m == bitmap_pos_to_ord(relmap, n, bits) */ | 909 | /* m == bitmap_pos_to_ord(relmap, n, bits) */ |
910 | if (test_bit(m, orig)) | 910 | if (test_bit(m, orig)) |
911 | set_bit(n, dst); | 911 | set_bit(n, dst); |
912 | m++; | 912 | m++; |
913 | } | 913 | } |
914 | } | 914 | } |
915 | EXPORT_SYMBOL(bitmap_onto); | 915 | EXPORT_SYMBOL(bitmap_onto); |
916 | 916 | ||
917 | /** | 917 | /** |
918 | * bitmap_fold - fold larger bitmap into smaller, modulo specified size | 918 | * bitmap_fold - fold larger bitmap into smaller, modulo specified size |
919 | * @dst: resulting smaller bitmap | 919 | * @dst: resulting smaller bitmap |
920 | * @orig: original larger bitmap | 920 | * @orig: original larger bitmap |
921 | * @sz: specified size | 921 | * @sz: specified size |
922 | * @bits: number of bits in each of these bitmaps | 922 | * @bits: number of bits in each of these bitmaps |
923 | * | 923 | * |
924 | * For each bit oldbit in @orig, set bit oldbit mod @sz in @dst. | 924 | * For each bit oldbit in @orig, set bit oldbit mod @sz in @dst. |
925 | * Clear all other bits in @dst. See further the comment and | 925 | * Clear all other bits in @dst. See further the comment and |
926 | * Example [2] for bitmap_onto() for why and how to use this. | 926 | * Example [2] for bitmap_onto() for why and how to use this. |
927 | */ | 927 | */ |
928 | void bitmap_fold(unsigned long *dst, const unsigned long *orig, | 928 | void bitmap_fold(unsigned long *dst, const unsigned long *orig, |
929 | int sz, int bits) | 929 | int sz, int bits) |
930 | { | 930 | { |
931 | int oldbit; | 931 | int oldbit; |
932 | 932 | ||
933 | if (dst == orig) /* following doesn't handle inplace mappings */ | 933 | if (dst == orig) /* following doesn't handle inplace mappings */ |
934 | return; | 934 | return; |
935 | bitmap_zero(dst, bits); | 935 | bitmap_zero(dst, bits); |
936 | 936 | ||
937 | for (oldbit = find_first_bit(orig, bits); | 937 | for (oldbit = find_first_bit(orig, bits); |
938 | oldbit < bits; | 938 | oldbit < bits; |
939 | oldbit = find_next_bit(orig, bits, oldbit + 1)) | 939 | oldbit = find_next_bit(orig, bits, oldbit + 1)) |
940 | set_bit(oldbit % sz, dst); | 940 | set_bit(oldbit % sz, dst); |
941 | } | 941 | } |
942 | EXPORT_SYMBOL(bitmap_fold); | 942 | EXPORT_SYMBOL(bitmap_fold); |
943 | 943 | ||
944 | /* | 944 | /* |
945 | * Common code for bitmap_*_region() routines. | 945 | * Common code for bitmap_*_region() routines. |
946 | * bitmap: array of unsigned longs corresponding to the bitmap | 946 | * bitmap: array of unsigned longs corresponding to the bitmap |
947 | * pos: the beginning of the region | 947 | * pos: the beginning of the region |
948 | * order: region size (log base 2 of number of bits) | 948 | * order: region size (log base 2 of number of bits) |
949 | * reg_op: operation(s) to perform on that region of bitmap | 949 | * reg_op: operation(s) to perform on that region of bitmap |
950 | * | 950 | * |
951 | * Can set, verify and/or release a region of bits in a bitmap, | 951 | * Can set, verify and/or release a region of bits in a bitmap, |
952 | * depending on which combination of REG_OP_* flag bits is set. | 952 | * depending on which combination of REG_OP_* flag bits is set. |
953 | * | 953 | * |
954 | * A region of a bitmap is a sequence of bits in the bitmap, of | 954 | * A region of a bitmap is a sequence of bits in the bitmap, of |
955 | * some size '1 << order' (a power of two), aligned to that same | 955 | * some size '1 << order' (a power of two), aligned to that same |
956 | * '1 << order' power of two. | 956 | * '1 << order' power of two. |
957 | * | 957 | * |
958 | * Returns 1 if REG_OP_ISFREE succeeds (region is all zero bits). | 958 | * Returns 1 if REG_OP_ISFREE succeeds (region is all zero bits). |
959 | * Returns 0 in all other cases and reg_ops. | 959 | * Returns 0 in all other cases and reg_ops. |
960 | */ | 960 | */ |
961 | 961 | ||
962 | enum { | 962 | enum { |
963 | REG_OP_ISFREE, /* true if region is all zero bits */ | 963 | REG_OP_ISFREE, /* true if region is all zero bits */ |
964 | REG_OP_ALLOC, /* set all bits in region */ | 964 | REG_OP_ALLOC, /* set all bits in region */ |
965 | REG_OP_RELEASE, /* clear all bits in region */ | 965 | REG_OP_RELEASE, /* clear all bits in region */ |
966 | }; | 966 | }; |
967 | 967 | ||
968 | static int __reg_op(unsigned long *bitmap, int pos, int order, int reg_op) | 968 | static int __reg_op(unsigned long *bitmap, int pos, int order, int reg_op) |
969 | { | 969 | { |
970 | int nbits_reg; /* number of bits in region */ | 970 | int nbits_reg; /* number of bits in region */ |
971 | int index; /* index first long of region in bitmap */ | 971 | int index; /* index first long of region in bitmap */ |
972 | int offset; /* bit offset region in bitmap[index] */ | 972 | int offset; /* bit offset region in bitmap[index] */ |
973 | int nlongs_reg; /* num longs spanned by region in bitmap */ | 973 | int nlongs_reg; /* num longs spanned by region in bitmap */ |
974 | int nbitsinlong; /* num bits of region in each spanned long */ | 974 | int nbitsinlong; /* num bits of region in each spanned long */ |
975 | unsigned long mask; /* bitmask for one long of region */ | 975 | unsigned long mask; /* bitmask for one long of region */ |
976 | int i; /* scans bitmap by longs */ | 976 | int i; /* scans bitmap by longs */ |
977 | int ret = 0; /* return value */ | 977 | int ret = 0; /* return value */ |
978 | 978 | ||
979 | /* | 979 | /* |
980 | * Either nlongs_reg == 1 (for small orders that fit in one long) | 980 | * Either nlongs_reg == 1 (for small orders that fit in one long) |
981 | * or (offset == 0 && mask == ~0UL) (for larger multiword orders.) | 981 | * or (offset == 0 && mask == ~0UL) (for larger multiword orders.) |
982 | */ | 982 | */ |
983 | nbits_reg = 1 << order; | 983 | nbits_reg = 1 << order; |
984 | index = pos / BITS_PER_LONG; | 984 | index = pos / BITS_PER_LONG; |
985 | offset = pos - (index * BITS_PER_LONG); | 985 | offset = pos - (index * BITS_PER_LONG); |
986 | nlongs_reg = BITS_TO_LONGS(nbits_reg); | 986 | nlongs_reg = BITS_TO_LONGS(nbits_reg); |
987 | nbitsinlong = min(nbits_reg, BITS_PER_LONG); | 987 | nbitsinlong = min(nbits_reg, BITS_PER_LONG); |
988 | 988 | ||
989 | /* | 989 | /* |
990 | * Can't do "mask = (1UL << nbitsinlong) - 1", as that | 990 | * Can't do "mask = (1UL << nbitsinlong) - 1", as that |
991 | * overflows if nbitsinlong == BITS_PER_LONG. | 991 | * overflows if nbitsinlong == BITS_PER_LONG. |
992 | */ | 992 | */ |
993 | mask = (1UL << (nbitsinlong - 1)); | 993 | mask = (1UL << (nbitsinlong - 1)); |
994 | mask += mask - 1; | 994 | mask += mask - 1; |
995 | mask <<= offset; | 995 | mask <<= offset; |
996 | 996 | ||
997 | switch (reg_op) { | 997 | switch (reg_op) { |
998 | case REG_OP_ISFREE: | 998 | case REG_OP_ISFREE: |
999 | for (i = 0; i < nlongs_reg; i++) { | 999 | for (i = 0; i < nlongs_reg; i++) { |
1000 | if (bitmap[index + i] & mask) | 1000 | if (bitmap[index + i] & mask) |
1001 | goto done; | 1001 | goto done; |
1002 | } | 1002 | } |
1003 | ret = 1; /* all bits in region free (zero) */ | 1003 | ret = 1; /* all bits in region free (zero) */ |
1004 | break; | 1004 | break; |
1005 | 1005 | ||
1006 | case REG_OP_ALLOC: | 1006 | case REG_OP_ALLOC: |
1007 | for (i = 0; i < nlongs_reg; i++) | 1007 | for (i = 0; i < nlongs_reg; i++) |
1008 | bitmap[index + i] |= mask; | 1008 | bitmap[index + i] |= mask; |
1009 | break; | 1009 | break; |
1010 | 1010 | ||
1011 | case REG_OP_RELEASE: | 1011 | case REG_OP_RELEASE: |
1012 | for (i = 0; i < nlongs_reg; i++) | 1012 | for (i = 0; i < nlongs_reg; i++) |
1013 | bitmap[index + i] &= ~mask; | 1013 | bitmap[index + i] &= ~mask; |
1014 | break; | 1014 | break; |
1015 | } | 1015 | } |
1016 | done: | 1016 | done: |
1017 | return ret; | 1017 | return ret; |
1018 | } | 1018 | } |
1019 | 1019 | ||
1020 | /** | 1020 | /** |
1021 | * bitmap_find_free_region - find a contiguous aligned mem region | 1021 | * bitmap_find_free_region - find a contiguous aligned mem region |
1022 | * @bitmap: array of unsigned longs corresponding to the bitmap | 1022 | * @bitmap: array of unsigned longs corresponding to the bitmap |
1023 | * @bits: number of bits in the bitmap | 1023 | * @bits: number of bits in the bitmap |
1024 | * @order: region size (log base 2 of number of bits) to find | 1024 | * @order: region size (log base 2 of number of bits) to find |
1025 | * | 1025 | * |
1026 | * Find a region of free (zero) bits in a @bitmap of @bits bits and | 1026 | * Find a region of free (zero) bits in a @bitmap of @bits bits and |
1027 | * allocate them (set them to one). Only consider regions of length | 1027 | * allocate them (set them to one). Only consider regions of length |
1028 | * a power (@order) of two, aligned to that power of two, which | 1028 | * a power (@order) of two, aligned to that power of two, which |
1029 | * makes the search algorithm much faster. | 1029 | * makes the search algorithm much faster. |
1030 | * | 1030 | * |
1031 | * Return the bit offset in bitmap of the allocated region, | 1031 | * Return the bit offset in bitmap of the allocated region, |
1032 | * or -errno on failure. | 1032 | * or -errno on failure. |
1033 | */ | 1033 | */ |
1034 | int bitmap_find_free_region(unsigned long *bitmap, int bits, int order) | 1034 | int bitmap_find_free_region(unsigned long *bitmap, int bits, int order) |
1035 | { | 1035 | { |
1036 | int pos, end; /* scans bitmap by regions of size order */ | 1036 | int pos, end; /* scans bitmap by regions of size order */ |
1037 | 1037 | ||
1038 | for (pos = 0 ; (end = pos + (1 << order)) <= bits; pos = end) { | 1038 | for (pos = 0 ; (end = pos + (1 << order)) <= bits; pos = end) { |
1039 | if (!__reg_op(bitmap, pos, order, REG_OP_ISFREE)) | 1039 | if (!__reg_op(bitmap, pos, order, REG_OP_ISFREE)) |
1040 | continue; | 1040 | continue; |
1041 | __reg_op(bitmap, pos, order, REG_OP_ALLOC); | 1041 | __reg_op(bitmap, pos, order, REG_OP_ALLOC); |
1042 | return pos; | 1042 | return pos; |
1043 | } | 1043 | } |
1044 | return -ENOMEM; | 1044 | return -ENOMEM; |
1045 | } | 1045 | } |
1046 | EXPORT_SYMBOL(bitmap_find_free_region); | 1046 | EXPORT_SYMBOL(bitmap_find_free_region); |
1047 | 1047 | ||
1048 | /** | 1048 | /** |
1049 | * bitmap_release_region - release allocated bitmap region | 1049 | * bitmap_release_region - release allocated bitmap region |
1050 | * @bitmap: array of unsigned longs corresponding to the bitmap | 1050 | * @bitmap: array of unsigned longs corresponding to the bitmap |
1051 | * @pos: beginning of bit region to release | 1051 | * @pos: beginning of bit region to release |
1052 | * @order: region size (log base 2 of number of bits) to release | 1052 | * @order: region size (log base 2 of number of bits) to release |
1053 | * | 1053 | * |
1054 | * This is the complement to __bitmap_find_free_region() and releases | 1054 | * This is the complement to __bitmap_find_free_region() and releases |
1055 | * the found region (by clearing it in the bitmap). | 1055 | * the found region (by clearing it in the bitmap). |
1056 | * | 1056 | * |
1057 | * No return value. | 1057 | * No return value. |
1058 | */ | 1058 | */ |
1059 | void bitmap_release_region(unsigned long *bitmap, int pos, int order) | 1059 | void bitmap_release_region(unsigned long *bitmap, int pos, int order) |
1060 | { | 1060 | { |
1061 | __reg_op(bitmap, pos, order, REG_OP_RELEASE); | 1061 | __reg_op(bitmap, pos, order, REG_OP_RELEASE); |
1062 | } | 1062 | } |
1063 | EXPORT_SYMBOL(bitmap_release_region); | 1063 | EXPORT_SYMBOL(bitmap_release_region); |
1064 | 1064 | ||
1065 | /** | 1065 | /** |
1066 | * bitmap_allocate_region - allocate bitmap region | 1066 | * bitmap_allocate_region - allocate bitmap region |
1067 | * @bitmap: array of unsigned longs corresponding to the bitmap | 1067 | * @bitmap: array of unsigned longs corresponding to the bitmap |
1068 | * @pos: beginning of bit region to allocate | 1068 | * @pos: beginning of bit region to allocate |
1069 | * @order: region size (log base 2 of number of bits) to allocate | 1069 | * @order: region size (log base 2 of number of bits) to allocate |
1070 | * | 1070 | * |
1071 | * Allocate (set bits in) a specified region of a bitmap. | 1071 | * Allocate (set bits in) a specified region of a bitmap. |
1072 | * | 1072 | * |
1073 | * Return 0 on success, or %-EBUSY if specified region wasn't | 1073 | * Return 0 on success, or %-EBUSY if specified region wasn't |
1074 | * free (not all bits were zero). | 1074 | * free (not all bits were zero). |
1075 | */ | 1075 | */ |
1076 | int bitmap_allocate_region(unsigned long *bitmap, int pos, int order) | 1076 | int bitmap_allocate_region(unsigned long *bitmap, int pos, int order) |
1077 | { | 1077 | { |
1078 | if (!__reg_op(bitmap, pos, order, REG_OP_ISFREE)) | 1078 | if (!__reg_op(bitmap, pos, order, REG_OP_ISFREE)) |
1079 | return -EBUSY; | 1079 | return -EBUSY; |
1080 | __reg_op(bitmap, pos, order, REG_OP_ALLOC); | 1080 | __reg_op(bitmap, pos, order, REG_OP_ALLOC); |
1081 | return 0; | 1081 | return 0; |
1082 | } | 1082 | } |
1083 | EXPORT_SYMBOL(bitmap_allocate_region); | 1083 | EXPORT_SYMBOL(bitmap_allocate_region); |
1084 | 1084 | ||
1085 | /** | 1085 | /** |
1086 | * bitmap_copy_le - copy a bitmap, putting the bits into little-endian order. | 1086 | * bitmap_copy_le - copy a bitmap, putting the bits into little-endian order. |
1087 | * @dst: destination buffer | 1087 | * @dst: destination buffer |
1088 | * @src: bitmap to copy | 1088 | * @src: bitmap to copy |
1089 | * @nbits: number of bits in the bitmap | 1089 | * @nbits: number of bits in the bitmap |
1090 | * | 1090 | * |
1091 | * Require nbits % BITS_PER_LONG == 0. | 1091 | * Require nbits % BITS_PER_LONG == 0. |
1092 | */ | 1092 | */ |
1093 | void bitmap_copy_le(void *dst, const unsigned long *src, int nbits) | 1093 | void bitmap_copy_le(void *dst, const unsigned long *src, int nbits) |
1094 | { | 1094 | { |
1095 | unsigned long *d = dst; | 1095 | unsigned long *d = dst; |
1096 | int i; | 1096 | int i; |
1097 | 1097 | ||
1098 | for (i = 0; i < nbits/BITS_PER_LONG; i++) { | 1098 | for (i = 0; i < nbits/BITS_PER_LONG; i++) { |
1099 | if (BITS_PER_LONG == 64) | 1099 | if (BITS_PER_LONG == 64) |
1100 | d[i] = cpu_to_le64(src[i]); | 1100 | d[i] = cpu_to_le64(src[i]); |
1101 | else | 1101 | else |
1102 | d[i] = cpu_to_le32(src[i]); | 1102 | d[i] = cpu_to_le32(src[i]); |
1103 | } | 1103 | } |
1104 | } | 1104 | } |
1105 | EXPORT_SYMBOL(bitmap_copy_le); | 1105 | EXPORT_SYMBOL(bitmap_copy_le); |
1106 | 1106 |