linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] mm/page_owner.c: record task name of process
@ 2022-02-03 12:00 Yixuan Cao
  2022-02-03 15:52 ` Vlastimil Babka
  0 siblings, 1 reply; 2+ messages in thread
From: Yixuan Cao @ 2022-02-03 12:00 UTC (permalink / raw)
  To: akpm; +Cc: linux-mm, linux-kernel, Yixuan Cao

I think in tracing page allocation behavior,
It is useful to record the task name of the process.

Although the current Page Owner has recorded the process ID,
When the process exits,
It is difficult to distinguish the specific function of this process,
This brings some inconvenience to debugging memory problems.

Therefore, add the task name information to the Page Owner,
So that users can clearly understand the task name of the process.
At the same time, with this information,
We can use tools/vm/page_owner_sort.c,
Provides more output modes for Page Owner.

Signed-off-by: Yixuan Cao <caoyixuan2019@email.szu.edu.cn>
---
 mm/page_owner.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/mm/page_owner.c b/mm/page_owner.c
index 99e360df9465..a8d666cd13ac 100644
--- a/mm/page_owner.c
+++ b/mm/page_owner.c
@@ -29,6 +29,7 @@ struct page_owner {
 	u64 ts_nsec;
 	u64 free_ts_nsec;
 	pid_t pid;
+	char task_name[TASK_COMM_LEN];
 };
 
 static bool page_owner_enabled = false;
@@ -163,6 +164,7 @@ static inline void __set_page_owner_handle(struct page_ext *page_ext,
 		page_owner->gfp_mask = gfp_mask;
 		page_owner->last_migrate_reason = -1;
 		page_owner->pid = current->pid;
+		strcpy(page_owner->task_name, current->comm);
 		page_owner->ts_nsec = local_clock();
 		__set_bit(PAGE_EXT_OWNER, &page_ext->flags);
 		__set_bit(PAGE_EXT_OWNER_ALLOCATED, &page_ext->flags);
@@ -229,6 +231,7 @@ void __folio_copy_owner(struct folio *newfolio, struct folio *old)
 		old_page_owner->last_migrate_reason;
 	new_page_owner->handle = old_page_owner->handle;
 	new_page_owner->pid = old_page_owner->pid;
+	strcpy(new_page_owner->task_name, old_page_owner->task_name);
 	new_page_owner->ts_nsec = old_page_owner->ts_nsec;
 	new_page_owner->free_ts_nsec = old_page_owner->ts_nsec;
 
@@ -339,9 +342,10 @@ print_page_owner(char __user *buf, size_t count, unsigned long pfn,
 		return -ENOMEM;
 
 	ret = snprintf(kbuf, count,
-			"Page allocated via order %u, mask %#x(%pGg), pid %d, ts %llu ns, free_ts %llu ns\n",
+			"Page allocated via order %u, mask %#x(%pGg), pid %d, task_name [%s], ts %llu ns, free_ts %llu ns\n",
 			page_owner->order, page_owner->gfp_mask,
 			&page_owner->gfp_mask, page_owner->pid,
+			page_owner->task_name,
 			page_owner->ts_nsec, page_owner->free_ts_nsec);
 
 	if (ret >= count)
@@ -415,9 +419,10 @@ void __dump_page_owner(const struct page *page)
 	else
 		pr_alert("page_owner tracks the page as freed\n");
 
-	pr_alert("page last allocated via order %u, migratetype %s, gfp_mask %#x(%pGg), pid %d, ts %llu, free_ts %llu\n",
+	pr_alert("page last allocated via order %u, migratetype %s, gfp_mask %#x(%pGg), pid %d, task_name [%s], ts %llu, free_ts %llu\n",
 		 page_owner->order, migratetype_names[mt], gfp_mask, &gfp_mask,
-		 page_owner->pid, page_owner->ts_nsec, page_owner->free_ts_nsec);
+		 page_owner->pid, page_owner->task_name,
+		 page_owner->ts_nsec, page_owner->free_ts_nsec);
 
 	handle = READ_ONCE(page_owner->handle);
 	if (!handle)
@@ -629,3 +634,4 @@ static int __init pageowner_init(void)
 	return 0;
 }
 late_initcall(pageowner_init)
+
-- 
2.31.1




^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] mm/page_owner.c: record task name of process
  2022-02-03 12:00 [PATCH] mm/page_owner.c: record task name of process Yixuan Cao
@ 2022-02-03 15:52 ` Vlastimil Babka
  0 siblings, 0 replies; 2+ messages in thread
From: Vlastimil Babka @ 2022-02-03 15:52 UTC (permalink / raw)
  To: Yixuan Cao, akpm; +Cc: linux-mm, linux-kernel, Waiman Long

On 2/3/22 13:00, Yixuan Cao wrote:
> I think in tracing page allocation behavior,
> It is useful to record the task name of the process.
> 
> Although the current Page Owner has recorded the process ID,
> When the process exits,
> It is difficult to distinguish the specific function of this process,
> This brings some inconvenience to debugging memory problems.
> 
> Therefore, add the task name information to the Page Owner,
> So that users can clearly understand the task name of the process.
> At the same time, with this information,
> We can use tools/vm/page_owner_sort.c,
> Provides more output modes for Page Owner.
> 
> Signed-off-by: Yixuan Cao <caoyixuan2019@email.szu.edu.cn>

A patch with the same goal is already part of Waiman's series:
https://lore.kernel.org/all/20220131192308.608837-5-longman@redhat.com/

> ---
>  mm/page_owner.c | 12 +++++++++---
>  1 file changed, 9 insertions(+), 3 deletions(-)
> 
> diff --git a/mm/page_owner.c b/mm/page_owner.c
> index 99e360df9465..a8d666cd13ac 100644
> --- a/mm/page_owner.c
> +++ b/mm/page_owner.c
> @@ -29,6 +29,7 @@ struct page_owner {
>  	u64 ts_nsec;
>  	u64 free_ts_nsec;
>  	pid_t pid;
> +	char task_name[TASK_COMM_LEN];
>  };
>  
>  static bool page_owner_enabled = false;
> @@ -163,6 +164,7 @@ static inline void __set_page_owner_handle(struct page_ext *page_ext,
>  		page_owner->gfp_mask = gfp_mask;
>  		page_owner->last_migrate_reason = -1;
>  		page_owner->pid = current->pid;
> +		strcpy(page_owner->task_name, current->comm);
>  		page_owner->ts_nsec = local_clock();
>  		__set_bit(PAGE_EXT_OWNER, &page_ext->flags);
>  		__set_bit(PAGE_EXT_OWNER_ALLOCATED, &page_ext->flags);
> @@ -229,6 +231,7 @@ void __folio_copy_owner(struct folio *newfolio, struct folio *old)
>  		old_page_owner->last_migrate_reason;
>  	new_page_owner->handle = old_page_owner->handle;
>  	new_page_owner->pid = old_page_owner->pid;
> +	strcpy(new_page_owner->task_name, old_page_owner->task_name);
>  	new_page_owner->ts_nsec = old_page_owner->ts_nsec;
>  	new_page_owner->free_ts_nsec = old_page_owner->ts_nsec;
>  
> @@ -339,9 +342,10 @@ print_page_owner(char __user *buf, size_t count, unsigned long pfn,
>  		return -ENOMEM;
>  
>  	ret = snprintf(kbuf, count,
> -			"Page allocated via order %u, mask %#x(%pGg), pid %d, ts %llu ns, free_ts %llu ns\n",
> +			"Page allocated via order %u, mask %#x(%pGg), pid %d, task_name [%s], ts %llu ns, free_ts %llu ns\n",
>  			page_owner->order, page_owner->gfp_mask,
>  			&page_owner->gfp_mask, page_owner->pid,
> +			page_owner->task_name,
>  			page_owner->ts_nsec, page_owner->free_ts_nsec);
>  
>  	if (ret >= count)
> @@ -415,9 +419,10 @@ void __dump_page_owner(const struct page *page)
>  	else
>  		pr_alert("page_owner tracks the page as freed\n");
>  
> -	pr_alert("page last allocated via order %u, migratetype %s, gfp_mask %#x(%pGg), pid %d, ts %llu, free_ts %llu\n",
> +	pr_alert("page last allocated via order %u, migratetype %s, gfp_mask %#x(%pGg), pid %d, task_name [%s], ts %llu, free_ts %llu\n",
>  		 page_owner->order, migratetype_names[mt], gfp_mask, &gfp_mask,
> -		 page_owner->pid, page_owner->ts_nsec, page_owner->free_ts_nsec);
> +		 page_owner->pid, page_owner->task_name,
> +		 page_owner->ts_nsec, page_owner->free_ts_nsec);
>  
>  	handle = READ_ONCE(page_owner->handle);
>  	if (!handle)
> @@ -629,3 +634,4 @@ static int __init pageowner_init(void)
>  	return 0;
>  }
>  late_initcall(pageowner_init)
> +


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-02-03 15:52 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-03 12:00 [PATCH] mm/page_owner.c: record task name of process Yixuan Cao
2022-02-03 15:52 ` Vlastimil Babka

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).