diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 12111662e56d..9d4ee2802caf 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -421,6 +421,11 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_do_read_fault); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_queue_request_and_unlock); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_fuse_request_end); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_read_trylock_failed); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_shmem_swapin_folio); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_do_wp_page); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_do_swap_page); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_do_anonymous_page); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_uprobes_replace_page); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_percpu_rwsem_down_read); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_percpu_rwsem_up_write); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_percpu_rwsem_wait_complete); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index e13159239923..4b0da560a4f0 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -224,6 +224,22 @@ DECLARE_HOOK(android_vh_kmalloc_large_alloced, DECLARE_HOOK(android_vh_tune_fault_around_bytes, TP_PROTO(unsigned long *fault_around_bytes), TP_ARGS(fault_around_bytes)); +DECLARE_HOOK(android_vh_do_anonymous_page, + TP_PROTO(struct vm_area_struct *vma, struct page *page), + TP_ARGS(vma, page)); +DECLARE_HOOK(android_vh_do_swap_page, + TP_PROTO(struct folio *folio, pte_t *pte, struct vm_fault *vmf, + swp_entry_t entry), + TP_ARGS(folio, pte, vmf, entry)); +DECLARE_HOOK(android_vh_do_wp_page, + TP_PROTO(struct folio *folio), + TP_ARGS(folio)); +DECLARE_HOOK(android_vh_uprobes_replace_page, + TP_PROTO(struct folio *new_folio, struct folio *old_folio), + TP_ARGS(new_folio, old_folio)); +DECLARE_HOOK(android_vh_shmem_swapin_folio, + TP_PROTO(struct folio *folio), + TP_ARGS(folio)); #endif /* _TRACE_HOOK_MM_H */ /* This part must be outside protection */ diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c index d9e357b7e17c..003cb6cd74aa 100644 --- a/kernel/events/uprobes.c +++ b/kernel/events/uprobes.c @@ -30,6 +30,9 @@ #include +#undef CREATE_TRACE_POINTS +#include + #define UINSNS_PER_PAGE (PAGE_SIZE/UPROBE_XOL_SLOT_BYTES) #define MAX_UPROBE_XOL_SLOTS UINSNS_PER_PAGE @@ -184,6 +187,7 @@ static int __replace_page(struct vm_area_struct *vma, unsigned long addr, folio_get(new_folio); page_add_new_anon_rmap(new_page, vma, addr); folio_add_lru_vma(new_folio, vma); + trace_android_vh_uprobes_replace_page(new_folio, old_folio); } else /* no new page, just dec_mm_counter for old_page */ dec_mm_counter(mm, MM_ANONPAGES); diff --git a/mm/memory.c b/mm/memory.c index 68634e96c175..57b9fda3c069 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -82,6 +82,9 @@ #include +#undef CREATE_TRACE_POINTS +#include + #include #include #include @@ -3494,6 +3497,7 @@ static vm_fault_t do_wp_page(struct vm_fault *vmf) * not dirty accountable. */ folio = page_folio(vmf->page); + trace_android_vh_do_wp_page(folio); if (folio_test_anon(folio)) { /* * If the page is exclusive to this process we must reuse the @@ -4077,6 +4081,7 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) inc_mm_counter_fast(vma->vm_mm, MM_ANONPAGES); dec_mm_counter_fast(vma->vm_mm, MM_SWAPENTS); pte = mk_pte(page, vma->vm_page_prot); + trace_android_vh_do_swap_page(folio, &pte, vmf, entry); /* * Same logic as in do_wp_page(); however, optimize for pages that are @@ -4232,6 +4237,7 @@ static vm_fault_t do_anonymous_page(struct vm_fault *vmf) */ __SetPageUptodate(page); + trace_android_vh_do_anonymous_page(vma, page); entry = mk_pte(page, vma->vm_page_prot); entry = pte_sw_mkyoung(entry); if (vma->vm_flags & VM_WRITE) diff --git a/mm/shmem.c b/mm/shmem.c index 1c5a63771012..1bf06946e7a8 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -1792,6 +1792,7 @@ static int shmem_swapin_folio(struct inode *inode, pgoff_t index, /* We have to do this with folio locked to prevent races */ folio_lock(folio); + trace_android_vh_shmem_swapin_folio(folio); if (!folio_test_swapcache(folio) || folio_swap_entry(folio).val != swap.val || !shmem_confirm_swap(mapping, index, swap)) {