Loading include/linux/memory_hotplug.h +6 −0 Original line number Diff line number Diff line Loading @@ -97,6 +97,7 @@ extern void __online_page_increment_counters(struct page *page); extern void __online_page_free(struct page *page); extern int try_online_node(int nid); extern bool try_online_one_block(int nid); extern bool memhp_auto_online; /* If movable_node boot option specified */ Loading Loading @@ -255,6 +256,11 @@ static inline int try_online_node(int nid) return 0; } static inline bool try_online_one_block(int nid) { return false; } static inline void get_online_mems(void) {} static inline void put_online_mems(void) {} Loading mm/memory_hotplug.c +32 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ #include <linux/memblock.h> #include <linux/bootmem.h> #include <linux/compaction.h> #include <linux/device.h> #include <asm/tlbflush.h> Loading Loading @@ -1095,6 +1096,37 @@ int try_online_node(int nid) return ret; } static int online_memory_one_block(struct memory_block *mem, void *arg) { bool *onlined_block = (bool *)arg; int ret; if (*onlined_block || !is_memblock_offlined(mem)) return 0; ret = device_online(&mem->dev); if (!ret) *onlined_block = true; return 0; } bool try_online_one_block(int nid) { struct zone *zone = &NODE_DATA(nid)->node_zones[ZONE_MOVABLE]; bool onlined_block = false; int ret = lock_device_hotplug_sysfs(); if (ret) return false; walk_memory_range(zone->zone_start_pfn, zone_end_pfn(zone), &onlined_block, online_memory_one_block); unlock_device_hotplug(); return onlined_block; } static int check_hotplug_memory_range(u64 start, u64 size) { unsigned long block_sz = memory_block_size_bytes(); Loading mm/oom_kill.c +7 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ #include <linux/kthread.h> #include <linux/init.h> #include <linux/mmu_notifier.h> #include <linux/memory_hotplug.h> #include <asm/tlb.h> #include "internal.h" Loading Loading @@ -1072,6 +1073,12 @@ bool out_of_memory(struct oom_control *oc) if (oom_killer_disabled) return false; if (try_online_one_block(numa_node_id())) { /* Got some memory back */ WARN(1, "OOM killer had to online a memory block\n"); return true; } if (!is_memcg_oom(oc)) { blocking_notifier_call_chain(&oom_notify_list, 0, &freed); if (freed > 0) Loading Loading
include/linux/memory_hotplug.h +6 −0 Original line number Diff line number Diff line Loading @@ -97,6 +97,7 @@ extern void __online_page_increment_counters(struct page *page); extern void __online_page_free(struct page *page); extern int try_online_node(int nid); extern bool try_online_one_block(int nid); extern bool memhp_auto_online; /* If movable_node boot option specified */ Loading Loading @@ -255,6 +256,11 @@ static inline int try_online_node(int nid) return 0; } static inline bool try_online_one_block(int nid) { return false; } static inline void get_online_mems(void) {} static inline void put_online_mems(void) {} Loading
mm/memory_hotplug.c +32 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ #include <linux/memblock.h> #include <linux/bootmem.h> #include <linux/compaction.h> #include <linux/device.h> #include <asm/tlbflush.h> Loading Loading @@ -1095,6 +1096,37 @@ int try_online_node(int nid) return ret; } static int online_memory_one_block(struct memory_block *mem, void *arg) { bool *onlined_block = (bool *)arg; int ret; if (*onlined_block || !is_memblock_offlined(mem)) return 0; ret = device_online(&mem->dev); if (!ret) *onlined_block = true; return 0; } bool try_online_one_block(int nid) { struct zone *zone = &NODE_DATA(nid)->node_zones[ZONE_MOVABLE]; bool onlined_block = false; int ret = lock_device_hotplug_sysfs(); if (ret) return false; walk_memory_range(zone->zone_start_pfn, zone_end_pfn(zone), &onlined_block, online_memory_one_block); unlock_device_hotplug(); return onlined_block; } static int check_hotplug_memory_range(u64 start, u64 size) { unsigned long block_sz = memory_block_size_bytes(); Loading
mm/oom_kill.c +7 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ #include <linux/kthread.h> #include <linux/init.h> #include <linux/mmu_notifier.h> #include <linux/memory_hotplug.h> #include <asm/tlb.h> #include "internal.h" Loading Loading @@ -1072,6 +1073,12 @@ bool out_of_memory(struct oom_control *oc) if (oom_killer_disabled) return false; if (try_online_one_block(numa_node_id())) { /* Got some memory back */ WARN(1, "OOM killer had to online a memory block\n"); return true; } if (!is_memcg_oom(oc)) { blocking_notifier_call_chain(&oom_notify_list, 0, &freed); if (freed > 0) Loading