#define BIT_START(iop) ((iop)->t.sector)
#define BIT_END(iop) ((iop)->t.sector + ((iop)->t.bytes >> 9))
#define IOP_READ(iop) ((iop)->t.action & BLK_TC_ACT(BLK_TC_READ))
+#define IOP_RW(iop) (IOP_READ(iop) ? 1 : 0)
#if defined(DEBUG)
#define ASSERT(truth) do { \
char devno[32];
};
+struct stats {
+ __u64 rqm[2];
+ __u64 ios[2];
+ __u64 sec[2];
+ __u64 wait;
+ __u64 svctm;
+
+ int cur_qusz, cur_dev;
+ double last_qu_change, last_dev_change, tot_qusz, idle_time;
+};
+
struct d_info {
struct list_head head, hash_head;
struct list_head iop_heads[N_IOP_TYPES];
__u64 n_ds;
struct devmap *map;
void *seek_handle;
+ struct stats stats, all_stats;
};
struct io {
};
extern char bt_timeline_version[], *devices, *exes, *input_name, *output_name;
-extern char *seek_name;
+extern char *seek_name, *iostat_name;
extern double range_delta;
-extern FILE *ranges_ofp, *avgs_ofp;
+extern FILE *ranges_ofp, *avgs_ofp, *iostat_ofp;
extern int is_lvm, verbose, ifd;
extern unsigned int n_devs;
extern unsigned long n_traces, n_io_allocs, n_io_frees;
extern struct my_mem *free_ios, *free_bits;
extern char iop_map[];
extern unsigned int pending_xs;
+extern __u64 iostat_interval, iostat_last_stamp;
void add_trace(struct io *iop);
int in_devices(struct blk_io_trace *t);
+char *make_dev_hdr(char *pad, size_t len, struct d_info *dip);
int output_avgs(FILE *ofp);
int output_ranges(FILE *ofp);
unsigned int do_read(int ifd, void *buf, int len);
long long seeki_median(void *handle);
int seeki_mode(void *handle, long long **modes_p, int *nseeks_p);
+void iostat_init(void);
+void iostat_insert(struct io *iop);
+void iostat_merge(struct io *iop);
+void iostat_issue(struct io *iop);
+void iostat_complete(struct io *iop);
+void iostat_check_time(__u64 stamp);
+void iostat_dump_stats(__u64 stamp, int all);
+
#include "inlines.h"