diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/memblock.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/mm/memblock.c b/mm/memblock.c index 270b005ca964..2121ec4c7fa0 100644 --- a/mm/memblock.c +++ b/mm/memblock.c | |||
@@ -683,6 +683,59 @@ int __init_memblock memblock_reserve(phys_addr_t base, phys_addr_t size) | |||
683 | } | 683 | } |
684 | 684 | ||
685 | /** | 685 | /** |
686 | * memblock_mark_hotplug - Mark hotpluggable memory with flag MEMBLOCK_HOTPLUG. | ||
687 | * @base: the base phys addr of the region | ||
688 | * @size: the size of the region | ||
689 | * | ||
690 | * This function isolates region [@base, @base + @size), and mark it with flag | ||
691 | * MEMBLOCK_HOTPLUG. | ||
692 | * | ||
693 | * Return 0 on succees, -errno on failure. | ||
694 | */ | ||
695 | int __init_memblock memblock_mark_hotplug(phys_addr_t base, phys_addr_t size) | ||
696 | { | ||
697 | struct memblock_type *type = &memblock.memory; | ||
698 | int i, ret, start_rgn, end_rgn; | ||
699 | |||
700 | ret = memblock_isolate_range(type, base, size, &start_rgn, &end_rgn); | ||
701 | if (ret) | ||
702 | return ret; | ||
703 | |||
704 | for (i = start_rgn; i < end_rgn; i++) | ||
705 | memblock_set_region_flags(&type->regions[i], MEMBLOCK_HOTPLUG); | ||
706 | |||
707 | memblock_merge_regions(type); | ||
708 | return 0; | ||
709 | } | ||
710 | |||
711 | /** | ||
712 | * memblock_clear_hotplug - Clear flag MEMBLOCK_HOTPLUG for a specified region. | ||
713 | * @base: the base phys addr of the region | ||
714 | * @size: the size of the region | ||
715 | * | ||
716 | * This function isolates region [@base, @base + @size), and clear flag | ||
717 | * MEMBLOCK_HOTPLUG for the isolated regions. | ||
718 | * | ||
719 | * Return 0 on succees, -errno on failure. | ||
720 | */ | ||
721 | int __init_memblock memblock_clear_hotplug(phys_addr_t base, phys_addr_t size) | ||
722 | { | ||
723 | struct memblock_type *type = &memblock.memory; | ||
724 | int i, ret, start_rgn, end_rgn; | ||
725 | |||
726 | ret = memblock_isolate_range(type, base, size, &start_rgn, &end_rgn); | ||
727 | if (ret) | ||
728 | return ret; | ||
729 | |||
730 | for (i = start_rgn; i < end_rgn; i++) | ||
731 | memblock_clear_region_flags(&type->regions[i], | ||
732 | MEMBLOCK_HOTPLUG); | ||
733 | |||
734 | memblock_merge_regions(type); | ||
735 | return 0; | ||
736 | } | ||
737 | |||
738 | /** | ||
686 | * __next_free_mem_range - next function for for_each_free_mem_range() | 739 | * __next_free_mem_range - next function for for_each_free_mem_range() |
687 | * @idx: pointer to u64 loop variable | 740 | * @idx: pointer to u64 loop variable |
688 | * @nid: node selector, %MAX_NUMNODES for all nodes | 741 | * @nid: node selector, %MAX_NUMNODES for all nodes |