|
@@ -948,15 +948,15 @@ done:
|
|
*/
|
|
*/
|
|
int bitmap_find_free_region(unsigned long *bitmap, int bits, int order)
|
|
int bitmap_find_free_region(unsigned long *bitmap, int bits, int order)
|
|
{
|
|
{
|
|
- int pos; /* scans bitmap by regions of size order */
|
|
|
|
|
|
+ int pos, end; /* scans bitmap by regions of size order */
|
|
|
|
|
|
- for (pos = 0; pos < bits; pos += (1 << order))
|
|
|
|
- if (__reg_op(bitmap, pos, order, REG_OP_ISFREE))
|
|
|
|
- break;
|
|
|
|
- if (pos == bits)
|
|
|
|
- return -ENOMEM;
|
|
|
|
- __reg_op(bitmap, pos, order, REG_OP_ALLOC);
|
|
|
|
- return pos;
|
|
|
|
|
|
+ for (pos = 0 ; (end = pos + (1 << order)) <= bits; pos = end) {
|
|
|
|
+ if (!__reg_op(bitmap, pos, order, REG_OP_ISFREE))
|
|
|
|
+ continue;
|
|
|
|
+ __reg_op(bitmap, pos, order, REG_OP_ALLOC);
|
|
|
|
+ return pos;
|
|
|
|
+ }
|
|
|
|
+ return -ENOMEM;
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(bitmap_find_free_region);
|
|
EXPORT_SYMBOL(bitmap_find_free_region);
|
|
|
|
|