Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ba69239f authored by Liam Mark's avatar Liam Mark Committed by Swathi Sridhar
Browse files

mm, oom: Try to online memory block before killing



Before killing a process first try to see if there are any offlined
memory blocks, if there are try to online one of them.

Change-Id: Ie97c8b69f0ba173c202a891a38a5c914869ddaae
Signed-off-by: default avatarLiam Mark <lmark@codeaurora.org>
parent 5917f56a
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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 */
@@ -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) {}

+32 −0
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@
#include <linux/memblock.h>
#include <linux/bootmem.h>
#include <linux/compaction.h>
#include <linux/device.h>

#include <asm/tlbflush.h>

@@ -1094,6 +1095,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();
+7 −0
Original line number Diff line number Diff line
@@ -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"
@@ -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)