diff --git a/include/linux/mm_event.h b/include/linux/mm_event.h index 9f89ca038574..0ab3ea12c3d4 100644 --- a/include/linux/mm_event.h +++ b/include/linux/mm_event.h @@ -5,6 +5,7 @@ enum mm_event_type { MM_MIN_FAULT = 0, MM_MAJ_FAULT, + MM_READ_IO, MM_COMPACTION, MM_RECLAIM, MM_SWP_FAULT, diff --git a/include/trace/events/mm_event.h b/include/trace/events/mm_event.h index 7d69e42bc8bd..6073701d900c 100644 --- a/include/trace/events/mm_event.h +++ b/include/trace/events/mm_event.h @@ -14,6 +14,7 @@ struct mm_event_task; __print_symbolic(type, \ { MM_MIN_FAULT, "min_flt" }, \ { MM_MAJ_FAULT, "maj_flt" }, \ + { MM_READ_IO, "read_io" }, \ { MM_COMPACTION, "compaction" }, \ { MM_RECLAIM, "reclaim" }, \ { MM_SWP_FAULT, "swp_flt" }, \ diff --git a/mm/filemap.c b/mm/filemap.c index 4fc4dbf61f38..95d2f744b04b 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -2190,6 +2190,7 @@ static ssize_t generic_file_buffered_read(struct kiocb *iocb, pgoff_t end_index; loff_t isize; unsigned long nr, ret; + ktime_t event_ts = 0; cond_resched(); find_page: @@ -2200,6 +2201,7 @@ find_page: page = find_get_page(mapping, index); if (!page) { + mm_event_start(&event_ts); if (iocb->ki_flags & IOCB_NOWAIT) goto would_block; page_cache_sync_readahead(mapping, @@ -2248,6 +2250,8 @@ find_page: unlock_page(page); } page_ok: + if (event_ts != 0) + mm_event_end(MM_READ_IO, event_ts); /* * i_size must be checked after we know the page is Uptodate. *