Lines 447-453
static void memory_bm_free(struct memory
Link Here
|
447 |
* of @bm->cur_zone_bm are updated. |
447 |
* of @bm->cur_zone_bm are updated. |
448 |
*/ |
448 |
*/ |
449 |
|
449 |
|
450 |
static void memory_bm_find_bit(struct memory_bitmap *bm, unsigned long pfn, |
450 |
static int memory_bm_find_bit(struct memory_bitmap *bm, unsigned long pfn, |
451 |
void **addr, unsigned int *bit_nr) |
451 |
void **addr, unsigned int *bit_nr) |
452 |
{ |
452 |
{ |
453 |
struct zone_bitmap *zone_bm; |
453 |
struct zone_bitmap *zone_bm; |
Lines 461-467
static void memory_bm_find_bit(struct me
Link Here
|
461 |
while (pfn < zone_bm->start_pfn || pfn >= zone_bm->end_pfn) { |
461 |
while (pfn < zone_bm->start_pfn || pfn >= zone_bm->end_pfn) { |
462 |
zone_bm = zone_bm->next; |
462 |
zone_bm = zone_bm->next; |
463 |
|
463 |
|
464 |
BUG_ON(!zone_bm); |
464 |
return -EFAULT; |
465 |
} |
465 |
} |
466 |
bm->cur.zone_bm = zone_bm; |
466 |
bm->cur.zone_bm = zone_bm; |
467 |
} |
467 |
} |
Lines 479-501
static void memory_bm_find_bit(struct me
Link Here
|
479 |
pfn -= bb->start_pfn; |
479 |
pfn -= bb->start_pfn; |
480 |
*bit_nr = pfn % BM_BITS_PER_CHUNK; |
480 |
*bit_nr = pfn % BM_BITS_PER_CHUNK; |
481 |
*addr = bb->data + pfn / BM_BITS_PER_CHUNK; |
481 |
*addr = bb->data + pfn / BM_BITS_PER_CHUNK; |
|
|
482 |
return 0; |
482 |
} |
483 |
} |
483 |
|
484 |
|
484 |
static void memory_bm_set_bit(struct memory_bitmap *bm, unsigned long pfn) |
485 |
static void memory_bm_set_bit(struct memory_bitmap *bm, unsigned long pfn) |
485 |
{ |
486 |
{ |
486 |
void *addr; |
487 |
void *addr; |
487 |
unsigned int bit; |
488 |
unsigned int bit; |
|
|
489 |
int error; |
488 |
|
490 |
|
489 |
memory_bm_find_bit(bm, pfn, &addr, &bit); |
491 |
error = memory_bm_find_bit(bm, pfn, &addr, &bit); |
|
|
492 |
BUG_ON(error); |
490 |
set_bit(bit, addr); |
493 |
set_bit(bit, addr); |
491 |
} |
494 |
} |
492 |
|
495 |
|
|
|
496 |
static int mem_bm_set_bit_check(struct memory_bitmap *bm, unsigned long pfn) |
497 |
{ |
498 |
void *addr; |
499 |
unsigned int bit; |
500 |
int error; |
501 |
|
502 |
error = memory_bm_find_bit(bm, pfn, &addr, &bit); |
503 |
if (!error) |
504 |
set_bit(bit, addr); |
505 |
return error; |
506 |
} |
507 |
|
493 |
static void memory_bm_clear_bit(struct memory_bitmap *bm, unsigned long pfn) |
508 |
static void memory_bm_clear_bit(struct memory_bitmap *bm, unsigned long pfn) |
494 |
{ |
509 |
{ |
495 |
void *addr; |
510 |
void *addr; |
496 |
unsigned int bit; |
511 |
unsigned int bit; |
|
|
512 |
int error; |
497 |
|
513 |
|
498 |
memory_bm_find_bit(bm, pfn, &addr, &bit); |
514 |
error = memory_bm_find_bit(bm, pfn, &addr, &bit); |
|
|
515 |
BUG_ON(error); |
499 |
clear_bit(bit, addr); |
516 |
clear_bit(bit, addr); |
500 |
} |
517 |
} |
501 |
|
518 |
|
Lines 503-510
static int memory_bm_test_bit(struct mem
Link Here
|
503 |
{ |
520 |
{ |
504 |
void *addr; |
521 |
void *addr; |
505 |
unsigned int bit; |
522 |
unsigned int bit; |
|
|
523 |
int error; |
506 |
|
524 |
|
507 |
memory_bm_find_bit(bm, pfn, &addr, &bit); |
525 |
error = memory_bm_find_bit(bm, pfn, &addr, &bit); |
|
|
526 |
BUG_ON(error); |
508 |
return test_bit(bit, addr); |
527 |
return test_bit(bit, addr); |
509 |
} |
528 |
} |
510 |
|
529 |
|
Lines 708-716
static void mark_nosave_pages(struct mem
Link Here
|
708 |
region->start_pfn << PAGE_SHIFT, |
727 |
region->start_pfn << PAGE_SHIFT, |
709 |
region->end_pfn << PAGE_SHIFT); |
728 |
region->end_pfn << PAGE_SHIFT); |
710 |
|
729 |
|
711 |
for (pfn = region->start_pfn; pfn < region->end_pfn; pfn++) |
730 |
for (pfn = region->start_pfn; pfn < region->end_pfn; pfn++) { |
712 |
if (pfn_valid(pfn)) |
731 |
if (!pfn_valid(pfn)) |
713 |
memory_bm_set_bit(bm, pfn); |
732 |
continue; |
|
|
733 |
if (mem_bm_set_bit_check(bm, pfn)) |
734 |
printk(KERN_ERR "PM: Invalid pfn: %lu\n", pfn); |
735 |
} |
714 |
} |
736 |
} |
715 |
} |
737 |
} |
716 |
|
738 |
|