diff -drupN a/include/linux/blkdev.h b/include/linux/blkdev.h --- a/include/linux/blkdev.h 2018-08-06 17:23:04.000000000 +0300 +++ b/include/linux/blkdev.h 2022-06-12 05:28:14.000000000 +0300 @@ -196,6 +196,9 @@ struct request { /* for bidi */ struct request *next_rq; + + ktime_t lat_hist_io_start; + int lat_hist_enabled; }; #define REQ_OP_SHIFT (8 * sizeof(u64) - REQ_OP_BITS) @@ -1028,6 +1031,8 @@ extern void blk_queue_write_cache(struct extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev); extern int blk_rq_map_sg(struct request_queue *, struct request *, struct scatterlist *); +extern int sunxi_blk_rq_map_sg(struct request_queue *, struct request *, + struct scatterlist *); extern void blk_dump_rq_flags(struct request *, char *); extern long nr_blockdev_pages(void); @@ -1700,6 +1705,62 @@ extern int bdev_write_page(struct block_ extern long bdev_direct_access(struct block_device *, struct blk_dax_ctl *); extern int bdev_dax_supported(struct super_block *, int); extern bool bdev_dax_capable(struct block_device *); + +/* + * X-axis for IO latency histogram support. + */ +static const u_int64_t latency_x_axis_us[] = { + 100, + 200, + 300, + 400, + 500, + 600, + 700, + 800, + 900, + 1000, + 1200, + 1400, + 1600, + 1800, + 2000, + 2500, + 3000, + 4000, + 5000, + 6000, + 7000, + 9000, + 10000 +}; + +#define BLK_IO_LAT_HIST_DISABLE 0 +#define BLK_IO_LAT_HIST_ENABLE 1 +#define BLK_IO_LAT_HIST_ZERO 2 + +struct io_latency_state { + u_int64_t latency_y_axis[ARRAY_SIZE(latency_x_axis_us) + 1]; + u_int64_t latency_elems; + u_int64_t latency_sum; +}; + +static inline void +blk_update_latency_hist(struct io_latency_state *s, u_int64_t delta_us) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(latency_x_axis_us); i++) + if (delta_us < (u_int64_t)latency_x_axis_us[i]) + break; + s->latency_y_axis[i]++; + s->latency_elems++; + s->latency_sum += delta_us; +} + +ssize_t blk_latency_hist_show(char* name, struct io_latency_state *s, + char *buf, int buf_size); + #else /* CONFIG_BLOCK */ struct block_device;