root/fs/f2fs/iostat.h
/* 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__ */