summaryrefslogtreecommitdiff
path: root/btt/inlines.h
diff options
context:
space:
mode:
authorAlan D. Brunelle <Alan.Brunelle@hp.com>2007-09-10 18:37:49 +0200
committerJens Axboe <jens.axboe@oracle.com>2007-09-10 18:37:49 +0200
commit4c48f14ea8ae2fae86811ac4dc1d72ad9bb601c2 (patch)
tree97a01448fa090ed0aacf979e640bf77e40b637bf /btt/inlines.h
parenta5981e2e795319502cc8dda629482928f3b7b204 (diff)
downloadblktrace-4c48f14ea8ae2fae86811ac4dc1d72ad9bb601c2.tar.gz
blktrace-4c48f14ea8ae2fae86811ac4dc1d72ad9bb601c2.tar.bz2
Major revamping (ver 2.0)
After a lot of fighting with maintaining a tree-styled design (each trace having it's own node), it was just getting too cumbersome to work in all circumstances. Taking a clue from blkparse itself, I decided to just keep track of IOs at queue time, and updating fields based upon later traces. The attached (large) patch works much faster, handles larger test cases with less failures, and is managing some pretty large jobs I'm working on (large Oracle-based DB analysis - 32-way box w/ lots of storage). I've also added a Q2Q seek distance feature - it's come in handy when comparing results of IO scheduler choice: We can see what the incoming IO seek distances are (at queue time), and then see how the scheduler itself manages things (via merges & sorting) by looking at D2D seek distances generated. As noted in the subject, I arbitrarily bumped this to version 2.00 as the innards are so different. The documentation (btt/doc/btt.tex) has been updated to reflect some minor output changes. I also fixed a bug dealing with process name notification: there was a problem that if a new PID came up with a name that was previously seen, btt wouldn't keep track of it right. [When running with Oracle, a lot of processes have the same name but different PIDs of course.] Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'btt/inlines.h')
-rw-r--r--btt/inlines.h187
1 files changed, 31 insertions, 156 deletions
diff --git a/btt/inlines.h b/btt/inlines.h
index 25e5b21..43dada0 100644
--- a/btt/inlines.h
+++ b/btt/inlines.h
@@ -143,13 +143,9 @@ static inline struct io *io_alloc(void)
}
memset(iop, 0, sizeof(struct io));
- INIT_LIST_HEAD(&iop->down_list);
- INIT_LIST_HEAD(&iop->up_list);
# if defined(DEBUG)
iop->f_head.next = LIST_POISON1;
- iop->c_pending.next = LIST_POISON1;
- iop->retry.next = LIST_POISON1;
# endif
# if defined(COUNT_IOS)
@@ -199,10 +195,6 @@ static inline int io_setup(struct io *iop, enum iop_type type)
static inline void io_release(struct io *iop)
{
ASSERT(iop->f_head.next == LIST_POISON1);
- ASSERT(iop->c_pending.next == LIST_POISON1);
- ASSERT(iop->retry.next == LIST_POISON1);
- ASSERT(list_empty(&iop->up_list));
- ASSERT(list_empty(&iop->down_list));
if (iop->linked)
dip_rem(iop);
@@ -278,15 +270,14 @@ static inline void unupdate_i2d(struct io *iop, __u64 d_time)
UNUPDATE_AVGS(i2d, iop, iop->pip, d_time);
}
-static inline void update_d2c(struct io *iop, int n, __u64 c_time)
+static inline void update_d2c(struct io *iop, __u64 c_time)
{
# if defined(DEBUG)
if (per_io_ofp)
- fprintf(per_io_ofp, "d2c %13.9f\n",
- n*BIT_TIME(c_time));
+ fprintf(per_io_ofp, "d2c %13.9f\n", BIT_TIME(c_time));
# endif
- UPDATE_AVGS_N(d2c, iop, iop->pip, c_time, n);
+ UPDATE_AVGS(d2c, iop, iop->pip, c_time);
}
static inline void update_blks(struct io *iop)
@@ -333,37 +324,9 @@ static inline struct io *dip_rb_find_sec(struct d_info *dip,
return rb_find_sec(__get_root(dip, type), sec);
}
-static inline void bump_retry(__u64 now)
+static inline __u64 tdelta(__u64 from, __u64 to)
{
- if (!list_empty(&retries))
- next_retry_check = now + (100 * 1000); // 100 usec
- else
- next_retry_check = 0;
-}
-
-static inline void add_retry(struct io *iop)
-{
- bump_retry(iop->t.time);
- if (!iop->on_retry_list) {
- list_add_tail(&iop->retry, &retries);
- iop->on_retry_list = 1;
- }
-}
-
-static inline void del_retry(struct io *iop)
-{
- if (iop->on_retry_list) {
- LIST_DEL(&iop->retry);
- iop->on_retry_list = 0;
- }
- bump_retry(iop->t.time);
-}
-
-static inline __u64 tdelta(struct io *iop1, struct io *iop2)
-{
- __u64 t1 = iop1->t.time;
- __u64 t2 = iop2->t.time;
- return (t1 < t2) ? (t2 - t1) : 1;
+ return (from < to) ? (to - from) : 1;
}
static inline int remapper_dev(__u32 dev)
@@ -372,18 +335,6 @@ static inline int remapper_dev(__u32 dev)
return mjr == 9 || mjr == 253 || mjr == 254;
}
-static inline void dump_iop(struct io *iop, int extra_nl)
-{
- if (per_io_ofp)
- __dump_iop(per_io_ofp, iop, extra_nl);
-}
-
-static inline void dump_iop2(struct io *a_iop, struct io *l_iop)
-{
- if (per_io_ofp)
- __dump_iop2(per_io_ofp, a_iop, l_iop);
-}
-
static inline int type2c(enum iop_type type)
{
int c;
@@ -397,130 +348,54 @@ static inline int type2c(enum iop_type type)
case IOP_D: c = 'D'; break;
case IOP_C: c = 'C'; break;
case IOP_R: c = 'R'; break;
- case IOP_L: c = 'L'; break;
+ case IOP_G: c = 'G'; break;
default : c = '?'; break;
}
return c;
}
-static inline void bilink_free(struct bilink *blp)
-{
- list_add_tail(&blp->bilink_free_head, &free_bilinks);
-}
-
-static inline void bilink_free_all(void)
-{
- struct bilink *blp;
- struct list_head *p, *q;
-
- list_for_each_safe(p, q, &free_bilinks) {
- blp = list_entry(p, struct bilink, bilink_free_head);
- free(blp);
- }
-}
-
-static inline struct bilink *bilink_alloc(struct io *diop, struct io *uiop)
-{
- struct bilink *blp;
-
- if (!list_empty(&free_bilinks)) {
- blp = list_entry(free_bilinks.prev, struct bilink,
- bilink_free_head);
- LIST_DEL(&blp->bilink_free_head);
- }
- else
- blp = malloc(sizeof(*blp));
-
- blp->diop = diop;
- blp->uiop = uiop;
-
- return blp;
-}
-
-static inline void bilink(struct io *diop, struct io *uiop)
+static inline int histo_idx(__u64 nbytes)
{
- struct bilink *blp = bilink_alloc(diop, uiop);
-
- list_add_tail(&blp->down_head, &diop->up_list);
- list_add_tail(&blp->up_head, &uiop->down_list);
-
- diop->up_len++;
- uiop->down_len++;
+ int idx = (nbytes >> 9) - 1;
+ return min(idx, N_HIST_BKTS-1);
}
-static inline void biunlink(struct bilink *blp)
+static inline void update_q_histo(__u64 nbytes)
{
- LIST_DEL(&blp->down_head);
- LIST_DEL(&blp->up_head);
- blp->diop->up_len--;
- blp->uiop->down_len--;
- bilink_free(blp);
+ q_histo[histo_idx(nbytes)]++;
}
-static inline struct io *bilink_first_down(struct io *iop,
- struct bilink **blp_p)
+static inline void update_d_histo(__u64 nbytes)
{
- struct bilink *blp;
-
- if (list_empty(&iop->down_list))
- return NULL;
- blp = list_entry(iop->down_list.next, struct bilink, up_head);
-
- if (blp_p != NULL)
- *blp_p = blp;
- return blp->diop;
+ d_histo[histo_idx(nbytes)]++;
}
-static inline struct io *bilink_first_up(struct io *iop, struct bilink **blp_p)
+static inline struct io *io_first_list(struct list_head *head)
{
- struct bilink *blp;
-
- if (list_empty(&iop->up_list))
+ if (list_empty(head))
return NULL;
- blp = list_entry(iop->up_list.next, struct bilink, down_head);
- if (blp_p != NULL)
- *blp_p = blp;
- return blp->uiop;
+ return list_entry(head->next, struct io, f_head);
}
-typedef void (*bilink_func)(struct io *diop, struct io *uiop,
- struct io *c_iop);
-static inline void bilink_for_each_down(bilink_func func, struct io *uiop,
- struct io *c_iop, int ul)
+static inline void __dump_iop(FILE *ofp, struct io *iop, int extra_nl)
{
- struct bilink *blp;
- struct list_head *p, *q;
-
- list_for_each_safe(p, q, &uiop->down_list) {
- blp = list_entry(p, struct bilink, up_head);
- func(blp->diop, uiop, c_iop);
- if (ul)
- biunlink(blp);
- }
+ fprintf(ofp, "%5d.%09lu %3d,%-3d %c %10llu+%-4u\n",
+ (int)SECONDS(iop->t.time),
+ (unsigned long)NANO_SECONDS(iop->t.time),
+ MAJOR(iop->t.device), MINOR(iop->t.device), type2c(iop->type),
+ (unsigned long long)iop->t.sector, t_sec(&iop->t));
+ if (extra_nl) fprintf(ofp, "\n");
}
-static inline int histo_idx(__u64 nbytes)
+static inline void __dump_iop2(FILE *ofp, struct io *a_iop, struct io *l_iop)
{
- int idx = (nbytes >> 9) - 1;
- return min(idx, N_HIST_BKTS-1);
-}
-
-static inline void update_q_histo(__u64 nbytes)
-{
- q_histo[histo_idx(nbytes)]++;
-}
-
-static inline void update_d_histo(__u64 nbytes)
-{
- d_histo[histo_idx(nbytes)]++;
-}
-
-static inline void add_rmhd(struct io *iop)
-{
- if (!iop->on_rm_list) {
- list_add_tail(&iop->rm_head, &rmhd);
- iop->on_rm_list = 1;
- }
+ fprintf(ofp, "%5d.%09lu %3d,%-3d %c %10llu+%-4u <- (%3d,%-3d) %10llu\n",
+ (int)SECONDS(a_iop->t.time),
+ (unsigned long)NANO_SECONDS(a_iop->t.time),
+ MAJOR(a_iop->t.device), MINOR(a_iop->t.device),
+ type2c(a_iop->type), (unsigned long long)a_iop->t.sector,
+ t_sec(&a_iop->t), MAJOR(l_iop->t.device),
+ MINOR(l_iop->t.device), (unsigned long long)l_iop->t.sector);
}