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

Commit fb23f8fa authored by Sudarshan Rajagopalan's avatar Sudarshan Rajagopalan Committed by Chris Goldsworthy
Browse files

mm, page_owner: set page owner info for tail pages



When allocating higher order pages, currently only the head page is set
with page owner info, leaving the tail pages with previous or stale info.
This patch sets the info for tail pages too and sets the time of free in
page owner info of all pages during free. This patch also adds an extra
info to page extension flags to help check if page is in buddy or not.

Change-Id: I96d13485af698d586a4dd7b1092a379a645c8fcb
Signed-off-by: default avatarSudarshan Rajagopalan <sudaraja@codeaurora.org>
[cgoldswo@codeaurora.org: Fix merge conflicts, add GKI #ifdef guards]
Signed-off-by: default avatarChris Goldsworthy <cgoldswo@codeaurora.org>
parent 68f85c60
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -19,6 +19,9 @@ struct page_ext_operations {
enum page_ext_flags {
	PAGE_EXT_OWNER,
	PAGE_EXT_OWNER_ALLOCATED,
#ifdef CONFIG_PAGE_EXTENSION_PAGE_FREE
	PAGE_EXT_PG_FREE,
#endif
#if defined(CONFIG_IDLE_PAGE_TRACKING) && !defined(CONFIG_64BIT)
	PAGE_EXT_YOUNG,
	PAGE_EXT_IDLE,
+9 −0
Original line number Diff line number Diff line
@@ -8,6 +8,15 @@ config PAGE_EXTENSION
	  by not allocating this extra memory according to boottime
	  configuration.

config PAGE_EXTENSION_PAGE_FREE
	bool "Add a flag in page_ext_flags to indicate if a page is free"
	depends on PAGE_EXTENSION && QGKI
	help
	  Add the PAGE_FREE flag in page_ext_flags, in order to indicate
	  whether a page from the buddy allocator is free or is in
	  use.  This information can aid in debugging buddy allocator
	  related issues.

config DEBUG_PAGEALLOC
	bool "Debug page memory allocations"
	depends on DEBUG_KERNEL
+12 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ struct page_owner {
	depot_stack_handle_t free_handle;
	int pid;
	u64 ts_nsec;
	u64 free_ts_nsec;
};

static bool page_owner_enabled = IS_ENABLED(CONFIG_PAGE_OWNER_ENABLE_DEFAULT);
@@ -152,6 +153,7 @@ void __reset_page_owner(struct page *page, unsigned int order)
	struct page_ext *page_ext;
	depot_stack_handle_t handle = 0;
	struct page_owner *page_owner;
	u64 free_ts_nsec = local_clock();

	handle = save_stack(GFP_NOWAIT | __GFP_NOWARN);

@@ -160,8 +162,12 @@ void __reset_page_owner(struct page *page, unsigned int order)
		return;
	for (i = 0; i < (1 << order); i++) {
		__clear_bit(PAGE_EXT_OWNER_ALLOCATED, &page_ext->flags);
#ifdef CONFIG_PAGE_EXTENSION_PAGE_FREE
		__set_bit(PAGE_EXT_PG_FREE, &page_ext->flags);
#endif
		page_owner = get_page_owner(page_ext);
		page_owner->free_handle = handle;
		page_owner->free_ts_nsec = free_ts_nsec;
		page_ext = page_ext_next(page_ext);
	}
}
@@ -181,8 +187,13 @@ static inline void __set_page_owner_handle(struct page *page,
		page_owner->last_migrate_reason = -1;
		page_owner->pid = current->pid;
		page_owner->ts_nsec = local_clock();
		page_owner->free_ts_nsec = 0;

		__set_bit(PAGE_EXT_OWNER, &page_ext->flags);
		__set_bit(PAGE_EXT_OWNER_ALLOCATED, &page_ext->flags);
#ifdef CONFIG_PAGE_EXTENSION_PAGE_FREE
		__clear_bit(PAGE_EXT_PG_FREE, &page_ext->flags);
#endif

		page_ext = page_ext_next(page_ext);
	}
@@ -247,6 +258,7 @@ void __copy_page_owner(struct page *oldpage, struct page *newpage)
	new_page_owner->handle = old_page_owner->handle;
	new_page_owner->pid = old_page_owner->pid;
	new_page_owner->ts_nsec = old_page_owner->ts_nsec;
	new_page_owner->free_ts_nsec = old_page_owner->ts_nsec;

	/*
	 * We don't clear the bit on the oldpage as it's going to be freed