blktrace: don't stop tracer if not setup trace successfully
[blktrace.git] / btt / trace_issue.c
index d2b083245ee746623c0fff811061d64cd5d1ee34..976fe1c3736f2065944c95a3de60a17a406ddad6 100644 (file)
  */
 #include "globals.h"
 
-static void __run_issue(struct io *im_iop, struct io *d_iop, struct io *c_iop)
+static void handle_issue(struct io *d_iop)
 {
-       update_i2d(im_iop, tdelta(im_iop, d_iop));
-       run_im(im_iop, d_iop, c_iop);
-       dump_iop(d_iop, 0);
-}
+       LIST_HEAD(head);
+       struct list_head *p, *q;
 
-static void __run_unissue(struct io *im_iop, struct io *d_iop, 
-                         struct io *c_iop)
-{
-       unupdate_i2d(im_iop, tdelta(im_iop, d_iop));
-       run_unim(im_iop, d_iop, c_iop);
-}
+       if (d_iop->dip->n_act_q != 0)
+               d_iop->dip->n_act_q--;
 
-void run_issue(struct io *d_iop, __attribute__((__unused__))struct io *u_iop, 
-                                                       struct io *c_iop)
-{
-       bilink_for_each_down(__run_issue, d_iop, c_iop, 1);
-       add_rmhd(d_iop);
-}
+       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);
+       aqd_issue(d_iop->dip->aqd_handle, BIT_TIME(d_iop->t.time));
 
-void run_unissue(struct io *d_iop, 
-                __attribute__((__unused__))struct io *u_iop, 
-                struct io *c_iop)
-{
-       bilink_for_each_down(__run_unissue, d_iop, c_iop, 1);
-       add_rmhd(d_iop);
-}
+       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);
 
-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;
+               if (q_iop->i_time != (__u64)-1)
+                       update_i2d(q_iop, tdelta(q_iop->i_time, d_iop->t.time));
+               else if (q_iop->m_time != (__u64)-1)
+                       update_m2d(q_iop, tdelta(q_iop->m_time, d_iop->t.time));
 
-               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);
+               d_iop->bytes_left -= q_iop->t.bytes;
+               list_del(&q_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;
-                       }
-               }
-       }
+               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);
 
-       return d_iop->bytes_left == 0;
+               if (output_all_data)
+                       q2d_histo_add(q_iop->dip->q2d_priv,
+                                               d_iop->t.time - q_iop->t.time);
+               latency_q2d(q_iop->dip, d_iop->t.time, 
+                                               d_iop->t.time - q_iop->t.time);
+       }
 }
 
 void trace_issue(struct io *d_iop)
 {
-       if (io_setup(d_iop, IOP_D)) {
-               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);
-       }
-       else
-               io_release(d_iop);
+       if (d_iop->t.bytes == 0)
+               return;
+
+       if (io_setup(d_iop, IOP_D))
+               handle_issue(d_iop);
+
+       io_release(d_iop);
 
 }