| /* 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__ */ |