diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 9df83fbfe170..8e48ff9b8984 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -543,6 +543,11 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_blk_mq_all_tag_iter); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_blk_mq_queue_tag_busy_iter); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_blk_mq_free_tags); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_blk_mq_sched_insert_request); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_shmem_swapin_page); +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); /* * For type visibility */ diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index efe0b0e9b974..d502c69069f1 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -370,6 +370,22 @@ DECLARE_HOOK(android_vh_do_swap_page_spf, 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 page *page, pte_t *pte, struct vm_fault *vmf, + swp_entry_t entry), + TP_ARGS(page, pte, vmf, entry)); +DECLARE_HOOK(android_vh_do_wp_page, + TP_PROTO(struct page *page), + TP_ARGS(page)); +DECLARE_HOOK(android_vh_uprobes_replace_page, + TP_PROTO(struct page *new_page, struct page *old_page), + TP_ARGS(new_page, old_page)); +DECLARE_HOOK(android_vh_shmem_swapin_page, + TP_PROTO(struct page *page), + TP_ARGS(page)); #endif /* _TRACE_HOOK_MM_H */ /* This part must be outside protection */ diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c index 826a2355da1e..93325a58d68b 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 @@ -185,6 +188,7 @@ static int __replace_page(struct vm_area_struct *vma, unsigned long addr, get_page(new_page); page_add_new_anon_rmap(new_page, vma, addr, false); lru_cache_add_inactive_or_unevictable(new_page, vma); + trace_android_vh_uprobes_replace_page(new_page, old_page); } 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 d41ab12a2eba..2aeeef494103 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -78,6 +78,9 @@ #include +#undef CREATE_TRACE_POINTS +#include + #include #include #include @@ -3444,6 +3447,7 @@ static vm_fault_t do_wp_page(struct vm_fault *vmf) * Take out anonymous pages first, anonymous shared vmas are * not dirty accountable. */ + trace_android_vh_do_wp_page(vmf->page); if (PageAnon(vmf->page)) { struct page *page = vmf->page; @@ -3815,6 +3819,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, vmf->vma_page_prot); + trace_android_vh_do_swap_page(page, &pte, vmf, entry); if ((vmf->flags & FAULT_FLAG_WRITE) && reuse_swap_page(page, NULL)) { pte = maybe_mkwrite(pte_mkdirty(pte), vmf->vma_flags); vmf->flags &= ~FAULT_FLAG_WRITE; @@ -3971,6 +3976,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, vmf->vma_page_prot); entry = pte_sw_mkyoung(entry); if (vmf->vma_flags & VM_WRITE) diff --git a/mm/shmem.c b/mm/shmem.c index b812f26e6f8d..17863d315899 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -1742,6 +1742,7 @@ static int shmem_swapin_page(struct inode *inode, pgoff_t index, /* We have to do this with page locked to prevent races */ lock_page(page); + trace_android_vh_shmem_swapin_page(page); if (!PageSwapCache(page) || page_private(page) != swap.val || !shmem_confirm_swap(mapping, index, swap)) { error = -EEXIST;