Added in Q2D histograms (requires -A)
[blktrace.git] / btt / trace_issue.c
index 5266e87e97cc67090fd6b4b0d57204bc7dcd3b95..418afd0f1d87fbe60d09d170118d6d605e52018d 100644 (file)
  */
 #include "globals.h"
 
-struct params {
-       struct io *c_iop;
-       struct list_head *rmhd;
-};
-
-void __run_issue(struct io *im_iop, struct io *d_iop, void *param)
+static void handle_issue(struct io *d_iop)
 {
-       struct params *p = param;
+       LIST_HEAD(head);
+       struct list_head *p, *q;
 
-       update_i2d(im_iop, tdelta(im_iop, d_iop));
-       run_im(im_iop, p->c_iop, p->rmhd);
-       dump_iop(d_iop, 0);
-       list_add_tail(&d_iop->f_head, p->rmhd);
-}
+       if (d_iop->dip->n_act_q != 0)
+               d_iop->dip->n_act_q--;
 
-void __run_unissue(struct io *im_iop, struct io *d_iop, void *param)
-{
-       struct params *p = param;
+       seeki_add(d_iop->dip->seek_handle, d_iop);
+       bno_dump_add(d_iop->dip->bno_dump_handle, d_iop);
+       iostat_issue(d_iop);
+       d_iop->dip->n_ds++;
+       if (!remapper_dev(d_iop->t.device))
+               update_d_histo(d_iop->t.bytes);
 
-       unupdate_i2d(im_iop, tdelta(im_iop, d_iop));
-       run_unim(im_iop, p->rmhd);
-       list_add_tail(&d_iop->f_head, p->rmhd);
-}
+       dip_foreach_list(d_iop, IOP_Q, &head);
+       list_for_each_safe(p, q, &head) {
+               struct io *q_iop = list_entry(p, struct io, f_head);
+               
+               update_i2d(q_iop, tdelta(q_iop->gm_time, d_iop->t.time));
+               d_iop->bytes_left -= q_iop->t.bytes;
+               LIST_DEL(&q_iop->f_head);
 
-void run_issue(struct io *d_iop, struct io *c_iop, void *param)
-{
-       struct params p = {
-               .c_iop = c_iop,
-               .rmhd = (struct list_head *)param
-       };
-       bilink_for_each_down(__run_issue, d_iop, &p, 1);
-}
+               q_iop->d_time = d_iop->t.time;
+               q_iop->d_sec = d_iop->t.sector;
+               q_iop->d_nsec = t_sec(&d_iop->t);
 
-void run_unissue(struct io *d_iop, struct list_head *rmhd)
-{
-       struct params p = {
-               .c_iop = NULL,
-               .rmhd = rmhd
-       };
-       bilink_for_each_down(__run_unissue, d_iop, &p, 1);
-}
-
-int ready_issue(struct io *d_iop, struct io *c_iop)
-{
-       if (d_iop->bytes_left > 0) {
-               LIST_HEAD(head);
-               struct io *im_iop;
-               struct list_head *p, *q;
-
-               dip_foreach_list(d_iop, IOP_I, &head);
-               dip_foreach_list(d_iop, IOP_M, &head);
-               list_for_each_safe(p, q, &head) {
-                       im_iop = list_entry(p, struct io, f_head);
-                       LIST_DEL(&im_iop->f_head);
-
-                       ASSERT(d_iop->bytes_left >= im_iop->t.bytes);
-                       if (ready_im(im_iop, c_iop)) {
-                               bilink(im_iop, d_iop);
-                               dip_rem(im_iop);
-                               d_iop->bytes_left -= im_iop->t.bytes;
-                       }
-               }
+               if (output_all_data)
+                       q2d_histo_add(q_iop->dip->q2d_priv, 
+                                               d_iop->t.time - q_iop->t.time);
        }
 
-       return d_iop->bytes_left == 0;
+       assert(d_iop->bytes_left == 0);
 }
 
 void trace_issue(struct io *d_iop)
 {
-       if (io_setup(d_iop, IOP_D)) {
-               seeki_add(d_iop->dip->seek_handle, d_iop);
-               iostat_issue(d_iop);
-               d_iop->dip->n_ds++;
-       }
-       else
-               io_release(d_iop);
+       if (io_setup(d_iop, IOP_D))
+               handle_issue(d_iop);
+       io_release(d_iop);
 
 }