|  | /* SPDX-License-Identifier: GPL-2.0 */ | 
|  | /* | 
|  | * Copyright 2021 Google LLC | 
|  | * Author: Daeho Jeong <daehojeong@google.com> | 
|  | */ | 
|  | #ifndef __F2FS_IOSTAT_H__ | 
|  | #define __F2FS_IOSTAT_H__ | 
|  |  | 
|  | struct bio_post_read_ctx; | 
|  |  | 
|  | enum iostat_lat_type { | 
|  | READ_IO = 0, | 
|  | WRITE_SYNC_IO, | 
|  | WRITE_ASYNC_IO, | 
|  | MAX_IO_TYPE, | 
|  | }; | 
|  |  | 
|  | #ifdef CONFIG_F2FS_IOSTAT | 
|  |  | 
|  | #define NUM_PREALLOC_IOSTAT_CTXS	128 | 
|  | #define DEFAULT_IOSTAT_PERIOD_MS	3000 | 
|  | #define MIN_IOSTAT_PERIOD_MS		100 | 
|  | /* maximum period of iostat tracing is 1 day */ | 
|  | #define MAX_IOSTAT_PERIOD_MS		8640000 | 
|  |  | 
|  | struct iostat_lat_info { | 
|  | unsigned long sum_lat[MAX_IO_TYPE][NR_PAGE_TYPE];	/* sum of io latencies */ | 
|  | unsigned long peak_lat[MAX_IO_TYPE][NR_PAGE_TYPE];	/* peak io latency */ | 
|  | unsigned int bio_cnt[MAX_IO_TYPE][NR_PAGE_TYPE];	/* bio count */ | 
|  | }; | 
|  |  | 
|  | extern int __maybe_unused iostat_info_seq_show(struct seq_file *seq, | 
|  | void *offset); | 
|  | extern void f2fs_reset_iostat(struct f2fs_sb_info *sbi); | 
|  | extern void f2fs_update_iostat(struct f2fs_sb_info *sbi, struct inode *inode, | 
|  | enum iostat_type type, unsigned long long io_bytes); | 
|  |  | 
|  | struct bio_iostat_ctx { | 
|  | struct f2fs_sb_info *sbi; | 
|  | unsigned long submit_ts; | 
|  | enum page_type type; | 
|  | struct bio_post_read_ctx *post_read_ctx; | 
|  | }; | 
|  |  | 
|  | static inline void iostat_update_submit_ctx(struct bio *bio, | 
|  | enum page_type type) | 
|  | { | 
|  | struct bio_iostat_ctx *iostat_ctx = bio->bi_private; | 
|  |  | 
|  | iostat_ctx->submit_ts = jiffies; | 
|  | iostat_ctx->type = type; | 
|  | } | 
|  |  | 
|  | static inline struct bio_post_read_ctx *get_post_read_ctx(struct bio *bio) | 
|  | { | 
|  | struct bio_iostat_ctx *iostat_ctx = bio->bi_private; | 
|  |  | 
|  | return iostat_ctx->post_read_ctx; | 
|  | } | 
|  |  | 
|  | extern void iostat_update_and_unbind_ctx(struct bio *bio); | 
|  | extern void iostat_alloc_and_bind_ctx(struct f2fs_sb_info *sbi, | 
|  | struct bio *bio, struct bio_post_read_ctx *ctx); | 
|  | extern int f2fs_init_iostat_processing(void); | 
|  | extern void f2fs_destroy_iostat_processing(void); | 
|  | extern int f2fs_init_iostat(struct f2fs_sb_info *sbi); | 
|  | extern void f2fs_destroy_iostat(struct f2fs_sb_info *sbi); | 
|  | #else | 
|  | static inline void f2fs_update_iostat(struct f2fs_sb_info *sbi, struct inode *inode, | 
|  | enum iostat_type type, unsigned long long io_bytes) {} | 
|  | static inline void iostat_update_and_unbind_ctx(struct bio *bio) {} | 
|  | static inline void iostat_alloc_and_bind_ctx(struct f2fs_sb_info *sbi, | 
|  | struct bio *bio, struct bio_post_read_ctx *ctx) {} | 
|  | static inline void iostat_update_submit_ctx(struct bio *bio, | 
|  | enum page_type type) {} | 
|  | static inline struct bio_post_read_ctx *get_post_read_ctx(struct bio *bio) | 
|  | { | 
|  | return bio->bi_private; | 
|  | } | 
|  | static inline int f2fs_init_iostat_processing(void) { return 0; } | 
|  | static inline void f2fs_destroy_iostat_processing(void) {} | 
|  | static inline int f2fs_init_iostat(struct f2fs_sb_info *sbi) { return 0; } | 
|  | static inline void f2fs_destroy_iostat(struct f2fs_sb_info *sbi) {} | 
|  | #endif | 
|  | #endif /* __F2FS_IOSTAT_H__ */ |