View | Details | Raw Unified | Return to bug 9966 | Differences between
and this patch

Collapse All | Expand All

(-)linux-2.6/kernel/power/snapshot.c (-8 / +30 lines)
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

Return to bug 9966