From 74ae8d16a99681b567aa84d6ed643110ab4c3a76 Mon Sep 17 00:00:00 2001 From: Rui Chen Date: Thu, 26 Dec 2024 21:24:34 +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 (cherry picked from commit affce30e154624e0af9c6485586c5c5d27ad7834) --- drivers/android/vendor_hooks.c | 1 + fs/direct-io.c | 8 ++++++++ fs/iomap/direct-io.c | 3 +++ include/trace/hooks/mm.h | 4 ++++ mm/filemap.c | 4 ++++ mm/readahead.c | 2 ++ 6 files changed, 22 insertions(+) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index b56cc1d280cc..a779a150f63c 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -106,6 +106,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_send_uic_command); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_send_tm_command); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_check_int_errors); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_update_sdev); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_io_statistics); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cgroup_attach); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_iommu_setup_dma_ops); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_iommu_alloc_insert_iova); diff --git a/fs/direct-io.c b/fs/direct-io.c index bbd05f1a2145..5926102a5d60 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -37,6 +37,8 @@ #include #include #include +#include +#include #include "internal.h" @@ -1036,6 +1038,12 @@ do_holes: dio_unpin_page(dio, 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 f637aa0706a3..9b986df94ecd 100644 --- a/fs/iomap/direct-io.c +++ b/fs/iomap/direct-io.c @@ -12,6 +12,7 @@ #include #include #include +#include #include "trace.h" #include "../internal.h" @@ -393,6 +394,8 @@ 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 a0ce1350fb7b..393d7c5b0232 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -35,6 +35,10 @@ DECLARE_HOOK(android_vh_mem_cgroup_alloc, DECLARE_HOOK(android_vh_mem_cgroup_free, TP_PROTO(struct mem_cgroup *memcg), TP_ARGS(memcg)); +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)); struct cma; DECLARE_HOOK(android_vh_cma_alloc_bypass, diff --git a/mm/filemap.c b/mm/filemap.c index d7e89f65ea9c..a2c3d4f7f1f7 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -55,6 +55,9 @@ #define CREATE_TRACE_POINTS #include +#undef CREATE_TRACE_POINTS +#include + /* * FIXME: remove all knowledge of the buffer layer from the core VM */ @@ -4084,6 +4087,7 @@ retry: if (unlikely(status < 0)) break; } + trace_android_vh_io_statistics(mapping, folio->index, 1, false, false); cond_resched(); if (unlikely(status == 0)) { diff --git a/mm/readahead.c b/mm/readahead.c index bf79275060f3..770f5f4f162b 100644 --- a/mm/readahead.c +++ b/mm/readahead.c @@ -128,6 +128,7 @@ #include #include #include +#include #include "internal.h" @@ -260,6 +261,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, mapping_min_folio_order(mapping)); if (!folio)