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 <chenrui9@honor.com>
This commit is contained in:
Rui Chen
2024-12-11 19:50:25 +08:00
committed by Treehugger Robot
parent b9ba16d91d
commit dbb9fda3cf
6 changed files with 22 additions and 0 deletions

View File

@@ -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_compact_end);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_wpcopy_start); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_wpcopy_start);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_wpcopy_end); 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_rvh_usb_dev_suspend);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_usb_dev_resume); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_usb_dev_resume);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_sound_usb_support_cpu_suspend); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_sound_usb_support_cpu_suspend);

View File

@@ -38,6 +38,9 @@
#include <linux/uio.h> #include <linux/uio.h>
#include <linux/atomic.h> #include <linux/atomic.h>
#include <linux/prefetch.h> #include <linux/prefetch.h>
#ifndef __GENKSYMS__
#include <trace/hooks/mm.h>
#endif
#include "internal.h" #include "internal.h"
@@ -1053,6 +1056,12 @@ do_holes:
put_page(page); put_page(page);
goto out; 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->next_block_for_io += this_chunk_blocks;
sdio->block_in_file += this_chunk_blocks; sdio->block_in_file += this_chunk_blocks;

View File

@@ -12,6 +12,9 @@
#include <linux/backing-dev.h> #include <linux/backing-dev.h>
#include <linux/uio.h> #include <linux/uio.h>
#include <linux/task_io_accounting_ops.h> #include <linux/task_io_accounting_ops.h>
#ifndef __GENKSYMS__
#include <trace/hooks/mm.h>
#endif
#include "trace.h" #include "trace.h"
#include "../internal.h" #include "../internal.h"
@@ -320,6 +323,9 @@ static loff_t iomap_dio_bio_iter(const struct iomap_iter *iter,
goto out; 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); bio = iomap_dio_alloc_bio(iter, dio, nr_pages, bio_opf);
fscrypt_set_bio_crypt_ctx(bio, inode, pos >> inode->i_blkbits, fscrypt_set_bio_crypt_ctx(bio, inode, pos >> inode->i_blkbits,
GFP_KERNEL); GFP_KERNEL);

View File

@@ -18,6 +18,10 @@ DECLARE_RESTRICTED_HOOK(android_rvh_shmem_get_folio,
TP_PROTO(struct shmem_inode_info *info, struct folio **folio), TP_PROTO(struct shmem_inode_info *info, struct folio **folio),
TP_ARGS(info, folio), 2); 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, DECLARE_RESTRICTED_HOOK(android_rvh_set_gfp_zone_flags,
TP_PROTO(unsigned int *flags), /* gfp_t *flags */ TP_PROTO(unsigned int *flags), /* gfp_t *flags */
TP_ARGS(flags), 1); TP_ARGS(flags), 1);

View File

@@ -3892,6 +3892,7 @@ again:
if (unlikely(status < 0)) if (unlikely(status < 0))
break; break;
} }
trace_android_vh_io_statistics(mapping, page->index, 1, false, false);
cond_resched(); cond_resched();
if (unlikely(status == 0)) { if (unlikely(status == 0)) {

View File

@@ -256,6 +256,7 @@ void page_cache_ra_unbounded(struct readahead_control *ractl,
continue; continue;
} }
trace_android_vh_io_statistics(mapping, index + i, 1, true, false);
folio = filemap_alloc_folio(gfp_mask, 0); folio = filemap_alloc_folio(gfp_mask, 0);
if (!folio) if (!folio)
break; break;