From dbb9fda3cf15496cb798f88c00a477ea557daf9f Mon Sep 17 00:00:00 2001 From: Rui Chen Date: Wed, 11 Dec 2024 19:50:25 +0800 Subject: [PATCH] ANDROID: fs: add vendor hook to collect IO statistics Add vendor hook to get metainfo of direct/buffered read and write. Determine hot files in each performance-sensitive user scenario. Bug: 380502059 Change-Id: Ie7604852df637d6664afd72e87bd6d4b14bbc2a2 Signed-off-by: Rui Chen --- drivers/android/vendor_hooks.c | 1 + fs/direct-io.c | 9 +++++++++ fs/iomap/direct-io.c | 6 ++++++ include/trace/hooks/mm.h | 4 ++++ mm/filemap.c | 1 + mm/readahead.c | 1 + 6 files changed, 22 insertions(+) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 58fdb68e6b0b..8fe40d59ce14 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -422,6 +422,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_compact_start); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_compact_end); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_wpcopy_start); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_wpcopy_end); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_io_statistics); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_usb_dev_suspend); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_usb_dev_resume); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_sound_usb_support_cpu_suspend); diff --git a/fs/direct-io.c b/fs/direct-io.c index 03d381377ae1..383bd70e4ab3 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -38,6 +38,9 @@ #include #include #include +#ifndef __GENKSYMS__ +#include +#endif #include "internal.h" @@ -1053,6 +1056,12 @@ do_holes: put_page(page); goto out; } + + trace_android_vh_io_statistics(dio->inode->i_mapping, + sdio->block_in_file >> sdio->blkfactor, + this_chunk_blocks >> sdio->blkfactor, + iov_iter_rw(sdio->iter) == READ, true); + sdio->next_block_for_io += this_chunk_blocks; sdio->block_in_file += this_chunk_blocks; diff --git a/fs/iomap/direct-io.c b/fs/iomap/direct-io.c index 105c4a1d20a2..ec6d72df1485 100644 --- a/fs/iomap/direct-io.c +++ b/fs/iomap/direct-io.c @@ -12,6 +12,9 @@ #include #include #include +#ifndef __GENKSYMS__ +#include +#endif #include "trace.h" #include "../internal.h" @@ -320,6 +323,9 @@ static loff_t iomap_dio_bio_iter(const struct iomap_iter *iter, goto out; } + trace_android_vh_io_statistics(inode->i_mapping, pos >> inode->i_blkbits, + nr_pages, !(dio->flags & IOMAP_DIO_WRITE), true); + bio = iomap_dio_alloc_bio(iter, dio, nr_pages, bio_opf); fscrypt_set_bio_crypt_ctx(bio, inode, pos >> inode->i_blkbits, GFP_KERNEL); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index 0b7f301eddf9..4f7bfc8bcb20 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -18,6 +18,10 @@ DECLARE_RESTRICTED_HOOK(android_rvh_shmem_get_folio, TP_PROTO(struct shmem_inode_info *info, struct folio **folio), TP_ARGS(info, folio), 2); +DECLARE_HOOK(android_vh_io_statistics, + TP_PROTO(struct address_space *mapping, unsigned int index, + unsigned int nr_page, bool read, bool direct), + TP_ARGS(mapping, index, nr_page, read, direct)); DECLARE_RESTRICTED_HOOK(android_rvh_set_gfp_zone_flags, TP_PROTO(unsigned int *flags), /* gfp_t *flags */ TP_ARGS(flags), 1); diff --git a/mm/filemap.c b/mm/filemap.c index 496f2bcee5f6..5188b315de13 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -3892,6 +3892,7 @@ again: if (unlikely(status < 0)) break; } + trace_android_vh_io_statistics(mapping, page->index, 1, false, false); cond_resched(); if (unlikely(status == 0)) { diff --git a/mm/readahead.c b/mm/readahead.c index 76698bdf40cc..d702a16c8d77 100644 --- a/mm/readahead.c +++ b/mm/readahead.c @@ -256,6 +256,7 @@ void page_cache_ra_unbounded(struct readahead_control *ractl, continue; } + trace_android_vh_io_statistics(mapping, index + i, 1, true, false); folio = filemap_alloc_folio(gfp_mask, 0); if (!folio) break;