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@xxxxxxxxxxxxxxxx> A patch with the same goal is already part of Waiman's series: https://lore.kernel.org/all/20220131192308.608837-5-longman@xxxxxxxxxx/ > --- > 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) > +