Lines Matching full:bm
588 static void memory_bm_position_reset(struct memory_bitmap *bm) in memory_bm_position_reset() argument
590 bm->cur.zone = list_entry(bm->zones.next, struct mem_zone_bm_rtree, in memory_bm_position_reset()
592 bm->cur.node = list_entry(bm->cur.zone->leaves.next, in memory_bm_position_reset()
594 bm->cur.node_pfn = 0; in memory_bm_position_reset()
595 bm->cur.cur_pfn = BM_END_OF_MAP; in memory_bm_position_reset()
596 bm->cur.node_bit = 0; in memory_bm_position_reset()
599 static void memory_bm_free(struct memory_bitmap *bm, int clear_nosave_free);
684 static int memory_bm_create(struct memory_bitmap *bm, gfp_t gfp_mask, in memory_bm_create() argument
693 INIT_LIST_HEAD(&bm->zones); in memory_bm_create()
708 list_add_tail(&zone->list, &bm->zones); in memory_bm_create()
711 bm->p_list = ca.chain; in memory_bm_create()
712 memory_bm_position_reset(bm); in memory_bm_create()
718 bm->p_list = ca.chain; in memory_bm_create()
719 memory_bm_free(bm, PG_UNSAFE_CLEAR); in memory_bm_create()
725 * @bm: Memory bitmap.
727 static void memory_bm_free(struct memory_bitmap *bm, int clear_nosave_free) in memory_bm_free() argument
731 list_for_each_entry(zone, &bm->zones, list) in memory_bm_free()
734 free_list_of_pages(bm->p_list, clear_nosave_free); in memory_bm_free()
736 INIT_LIST_HEAD(&bm->zones); in memory_bm_free()
742 * Find the bit in memory bitmap @bm that corresponds to the given PFN.
743 * The cur.zone, cur.block and cur.node_pfn members of @bm are updated.
748 static int memory_bm_find_bit(struct memory_bitmap *bm, unsigned long pfn, in memory_bm_find_bit() argument
755 zone = bm->cur.zone; in memory_bm_find_bit()
763 list_for_each_entry(curr, &bm->zones, list) { in memory_bm_find_bit()
784 node = bm->cur.node; in memory_bm_find_bit()
785 if (zone == bm->cur.zone && in memory_bm_find_bit()
786 ((pfn - zone->start_pfn) & ~BM_BLOCK_MASK) == bm->cur.node_pfn) in memory_bm_find_bit()
803 bm->cur.zone = zone; in memory_bm_find_bit()
804 bm->cur.node = node; in memory_bm_find_bit()
805 bm->cur.node_pfn = (pfn - zone->start_pfn) & ~BM_BLOCK_MASK; in memory_bm_find_bit()
806 bm->cur.cur_pfn = pfn; in memory_bm_find_bit()
815 static void memory_bm_set_bit(struct memory_bitmap *bm, unsigned long pfn) in memory_bm_set_bit() argument
821 error = memory_bm_find_bit(bm, pfn, &addr, &bit); in memory_bm_set_bit()
826 static int mem_bm_set_bit_check(struct memory_bitmap *bm, unsigned long pfn) in mem_bm_set_bit_check() argument
832 error = memory_bm_find_bit(bm, pfn, &addr, &bit); in mem_bm_set_bit_check()
839 static void memory_bm_clear_bit(struct memory_bitmap *bm, unsigned long pfn) in memory_bm_clear_bit() argument
845 error = memory_bm_find_bit(bm, pfn, &addr, &bit); in memory_bm_clear_bit()
850 static void memory_bm_clear_current(struct memory_bitmap *bm) in memory_bm_clear_current() argument
854 bit = max(bm->cur.node_bit - 1, 0); in memory_bm_clear_current()
855 clear_bit(bit, bm->cur.node->data); in memory_bm_clear_current()
858 static unsigned long memory_bm_get_current(struct memory_bitmap *bm) in memory_bm_get_current() argument
860 return bm->cur.cur_pfn; in memory_bm_get_current()
863 static int memory_bm_test_bit(struct memory_bitmap *bm, unsigned long pfn) in memory_bm_test_bit() argument
869 error = memory_bm_find_bit(bm, pfn, &addr, &bit); in memory_bm_test_bit()
874 static bool memory_bm_pfn_present(struct memory_bitmap *bm, unsigned long pfn) in memory_bm_pfn_present() argument
879 return !memory_bm_find_bit(bm, pfn, &addr, &bit); in memory_bm_pfn_present()
892 static bool rtree_next_node(struct memory_bitmap *bm) in rtree_next_node() argument
894 if (!list_is_last(&bm->cur.node->list, &bm->cur.zone->leaves)) { in rtree_next_node()
895 bm->cur.node = list_entry(bm->cur.node->list.next, in rtree_next_node()
897 bm->cur.node_pfn += BM_BITS_PER_BLOCK; in rtree_next_node()
898 bm->cur.node_bit = 0; in rtree_next_node()
904 if (!list_is_last(&bm->cur.zone->list, &bm->zones)) { in rtree_next_node()
905 bm->cur.zone = list_entry(bm->cur.zone->list.next, in rtree_next_node()
907 bm->cur.node = list_entry(bm->cur.zone->leaves.next, in rtree_next_node()
909 bm->cur.node_pfn = 0; in rtree_next_node()
910 bm->cur.node_bit = 0; in rtree_next_node()
920 * @bm: Memory bitmap.
923 * set bit in @bm and returns the PFN represented by it. If no more bits are
929 static unsigned long memory_bm_next_pfn(struct memory_bitmap *bm) in memory_bm_next_pfn() argument
935 pages = bm->cur.zone->end_pfn - bm->cur.zone->start_pfn; in memory_bm_next_pfn()
936 bits = min(pages - bm->cur.node_pfn, BM_BITS_PER_BLOCK); in memory_bm_next_pfn()
937 bit = find_next_bit(bm->cur.node->data, bits, in memory_bm_next_pfn()
938 bm->cur.node_bit); in memory_bm_next_pfn()
940 pfn = bm->cur.zone->start_pfn + bm->cur.node_pfn + bit; in memory_bm_next_pfn()
941 bm->cur.node_bit = bit + 1; in memory_bm_next_pfn()
942 bm->cur.cur_pfn = pfn; in memory_bm_next_pfn()
945 } while (rtree_next_node(bm)); in memory_bm_next_pfn()
947 bm->cur.cur_pfn = BM_END_OF_MAP; in memory_bm_next_pfn()
974 static void memory_bm_recycle(struct memory_bitmap *bm) in memory_bm_recycle() argument
979 list_for_each_entry(zone, &bm->zones, list) in memory_bm_recycle()
982 p_list = bm->p_list; in memory_bm_recycle()
1077 * @bm: Memory bitmap.
1079 * Set the bits in @bm that correspond to the page frames the contents of which
1082 static void mark_nosave_pages(struct memory_bitmap *bm) in mark_nosave_pages() argument
1105 mem_bm_set_bit_check(bm, pfn); in mark_nosave_pages()
1197 struct memory_bitmap *bm = free_pages_map; in clear_or_poison_free_pages() local
1204 memory_bm_position_reset(bm); in clear_or_poison_free_pages()
1205 pfn = memory_bm_next_pfn(bm); in clear_or_poison_free_pages()
1210 pfn = memory_bm_next_pfn(bm); in clear_or_poison_free_pages()
1212 memory_bm_position_reset(bm); in clear_or_poison_free_pages()
2046 static inline unsigned int alloc_highmem_pages(struct memory_bitmap *bm, in alloc_highmem_pages() argument
2059 memory_bm_set_bit(bm, page_to_pfn(page)); in alloc_highmem_pages()
2066 static inline unsigned int alloc_highmem_pages(struct memory_bitmap *bm, in alloc_highmem_pages() argument
2199 * @bm: Memory bitmap.
2203 * PFNs corresponding to set bits in @bm are stored in the area of memory
2208 static inline void pack_pfns(unsigned long *buf, struct memory_bitmap *bm, in pack_pfns() argument
2214 buf[j] = memory_bm_next_pfn(bm); in pack_pfns()
2304 static void mark_unsafe_pages(struct memory_bitmap *bm) in mark_unsafe_pages() argument
2317 duplicate_memory_bitmap(free_pages_map, bm); in mark_unsafe_pages()
2354 * @bm: Memory bitmap.
2359 * corresponding bit in @bm. If the page was originally populated with only
2362 static int unpack_orig_pfns(unsigned long *buf, struct memory_bitmap *bm, in unpack_orig_pfns() argument
2375 if (pfn_valid(decoded_pfn) && memory_bm_pfn_present(bm, decoded_pfn)) { in unpack_orig_pfns()
2376 memory_bm_set_bit(bm, decoded_pfn); in unpack_orig_pfns()
2414 * @bm: Memory bitmap.
2416 * The bits in @bm that correspond to image pages are assumed to be set.
2418 static unsigned int count_highmem_image_pages(struct memory_bitmap *bm) in count_highmem_image_pages() argument
2423 memory_bm_position_reset(bm); in count_highmem_image_pages()
2424 pfn = memory_bm_next_pfn(bm); in count_highmem_image_pages()
2429 pfn = memory_bm_next_pfn(bm); in count_highmem_image_pages()
2440 * @bm: Pointer to an uninitialized memory bitmap structure.
2447 * @bm (it must be uninitialized).
2451 static int prepare_highmem_image(struct memory_bitmap *bm, in prepare_highmem_image() argument
2456 if (memory_bm_create(bm, GFP_ATOMIC, PG_SAFE)) in prepare_highmem_image()
2475 memory_bm_set_bit(bm, page_to_pfn(page)); in prepare_highmem_image()
2482 memory_bm_position_reset(bm); in prepare_highmem_image()
2483 safe_highmem_bm = bm; in prepare_highmem_image()
2585 static unsigned int count_highmem_image_pages(struct memory_bitmap *bm) { return 0; } in count_highmem_image_pages() argument
2587 static inline int prepare_highmem_image(struct memory_bitmap *bm, in prepare_highmem_image() argument
2606 * @bm: Memory bitmap with unsafe pages marked.
2609 * Use @bm to mark the pages that will be overwritten in the process of
2622 static int prepare_image(struct memory_bitmap *new_bm, struct memory_bitmap *bm, in prepare_image() argument
2634 nr_highmem = count_highmem_image_pages(bm); in prepare_image()
2635 mark_unsafe_pages(bm); in prepare_image()
2641 duplicate_memory_bitmap(new_bm, bm); in prepare_image()
2642 memory_bm_free(bm, PG_UNSAFE_KEEP); in prepare_image()
2662 error = prepare_highmem_image(bm, &nr_highmem); in prepare_image()
2718 static void *get_buffer(struct memory_bitmap *bm, struct chain_allocator *ca) in get_buffer() argument
2722 unsigned long pfn = memory_bm_next_pfn(bm); in get_buffer()