On Mon, 24 Oct 2022 20:39:22 +0530 Gautam Menghani <gautammenghani201@xxxxxxxxx> wrote: > +TRACE_EVENT(mm_khugepaged_collapse_file, > + TP_PROTO(struct mm_struct *mm, struct page *hpage, > + unsigned long addr, const char *filename, int nr, > + int result), > + TP_ARGS(mm, hpage, addr, filename, nr, result), > + TP_STRUCT__entry( > + __field(struct mm_struct *, mm) > + __field(unsigned long, hpfn) > + __field(unsigned long, addr) > + __string(filename, filename) > + __field(int, nr) > + __field(int, result) > + ), > + > + TP_fast_assign( > + __entry->mm = mm; > + __entry->hpfn = hpage ? page_to_pfn(hpage) : -1; > + __entry->addr = addr; > + __assign_str(filename, filename); > + __entry->nr = nr; > + __entry->result = result; > + ), > + > + TP_printk("mm=%p, hpage_pfn=0x%lx, addr=%ld, filename=%s, nr=%d, result=%s", > + __entry->mm, > + __entry->hpfn, > + __entry->addr, > + __get_str(filename), > + __entry->nr, > + __print_symbolic(__entry->result, SCAN_STATUS)) > +); > + > #endif /* __HUGE_MEMORY_H */ > #include <trace/define_trace.h> > diff --git a/mm/khugepaged.c b/mm/khugepaged.c > index 4734315f7940..14db90e2f2ec 100644 > --- a/mm/khugepaged.c > +++ b/mm/khugepaged.c > @@ -2059,7 +2059,9 @@ static int collapse_file(struct mm_struct *mm, unsigned long addr, > mem_cgroup_uncharge(page_folio(hpage)); > put_page(hpage); > } > - /* TODO: tracepoints */ > + > + trace_mm_khugepaged_collapse_file(mm, hpage, addr, file->f_path.dentry->d_iname, I try to keep dereferences out of the calling path as much as possible (adds to I$ at the call site). Could you just pass in file, and then have: __string(filename, file->f_path.dentry->d_iname) [..] __assign_string(filename, file->f_path.dentry->d_iname); If you are paranoid, you can have the above also be: file ? file->f_path.dentry ? file->f_path.dentry->d_iname : "(null)" : "(null)") -- Steve > + nr, result); > return result;