Fixed REMAP to update Q2A & fixed #Q calculations
authorAlan D. Brunelle <Alan.Brunelle@hp.com>
Thu, 8 Nov 2007 13:34:44 +0000 (08:34 -0500)
committerAlan D. Brunelle <Alan.Brunelle@hp.com>
Thu, 8 Nov 2007 13:34:44 +0000 (08:34 -0500)
btt/globals.h
btt/output.c
btt/trace_queue.c
btt/trace_remap.c

index b4ef4e3e7cbcf444f70c65942801bbead0dc4f7b..e1751e452fc51c94b4f1214633e192c80f255a8c 100644 (file)
@@ -162,7 +162,7 @@ struct d_info {
        FILE *d2c_ofp, *q2c_ofp;
        struct avgs_info avgs;
        struct stats stats, all_stats;
-       __u64 last_q, n_ds;
+       __u64 last_q, n_qs, n_ds;
        __u32 device;
 
        int pre_culling;
index fd9392aeb19095bb2dc6d30a0f648bfb35033269..21392d636cc71b6d6718e113c509f92e244ac9b9 100644 (file)
@@ -141,15 +141,25 @@ void __output_dip_merge_ratio(struct d_info *dip, void *arg)
 {
        double blks_avg;
        char scratch[15];
-       double ratio, q2c_n = dip->avgs.q2c.n, d2c_n = dip->n_ds;
+       double ratio, q2c_n, d2c_n;
 
+       if (dip->n_qs == 0 || dip->n_ds == 0)
+               return;
+       else if (dip->n_qs < dip->n_ds)
+               dip->n_qs = dip->n_ds;
+
+       q2c_n = dip->n_qs;
+       d2c_n = dip->n_ds;
        if (q2c_n > 0.0 && d2c_n > 0.0) {
-               ratio = q2c_n / d2c_n;
+               if (q2c_n < d2c_n)
+                       ratio = 1.0;
+               else
+                       ratio = q2c_n / d2c_n;
                blks_avg = (double)dip->avgs.blks.total / d2c_n;
                fprintf((FILE *)arg, 
                        "%10s | %8llu %8llu %7.1lf | %8llu %8llu %8llu %8llu\n",
                        make_dev_hdr(scratch, 15, dip),
-                       (unsigned long long)dip->avgs.q2c.n,
+                       (unsigned long long)dip->n_qs,
                        (unsigned long long)dip->n_ds,
                        ratio,
                        (unsigned long long)dip->avgs.blks.min,
@@ -162,7 +172,7 @@ void __output_dip_merge_ratio(struct d_info *dip, void *arg)
                        merge_data.blkmax = dip->avgs.blks.max;
                }
 
-               merge_data.nq += dip->avgs.q2c.n;
+               merge_data.nq += dip->n_qs;
                merge_data.nd += dip->n_ds;
                merge_data.total += dip->avgs.blks.total;
                if (dip->avgs.blks.min < merge_data.blkmin)
index f882ad2ee0a4d48ca5ab23b1ad6393b70bc4f1c8..1d2afbe3486ad2e59b2cfc25adeb92e5db607cc4 100644 (file)
@@ -32,6 +32,7 @@ static void handle_queue(struct io *q_iop)
 
        q_iop->i_time = q_iop->gm_time = q_iop->d_time = (__u64)-1;
        q_iop->is_getrq = -1;
+       q_iop->dip->n_qs++;
 }
 
 void trace_queue(struct io *q_iop)
index 1e11ddc79dcd3c06d7fade694ef4e4732ff9b1d1..22d340bb6acfbd7b065543b9db99bf3883e6350d 100644 (file)
  */
 #include "globals.h"
 
-static void handle_remap(struct io *a_iop)
+static inline void cvt_pdu_remap(struct blk_io_trace_remap *rp)
 {
-       struct blk_io_trace_remap *rp = a_iop->pdu;
-       struct io *q_iop;
-
-       q_iop = dip_find_sec(a_iop->dip, IOP_Q, be64_to_cpu(rp->sector));
-       if (q_iop) 
-               update_q2a(q_iop, tdelta(q_iop->t.time, a_iop->t.time));
+       rp->device = be32_to_cpu(rp->device);
+       rp->device_from = be32_to_cpu(rp->device_from);
+       rp->sector = be64_to_cpu(rp->sector);
 }
 
+/*
+ * q_iop == volume device
+ * a_iop == underlying device
+ */
 void trace_remap(struct io *a_iop)
 {
+       struct io *q_iop;
+       struct d_info *q_dip;
        struct blk_io_trace_remap *rp = a_iop->pdu;
 
-       a_iop->t.device = be32_to_cpu(rp->device_from);
-       if (io_setup(a_iop, IOP_A))
-               handle_remap(a_iop);
+       cvt_pdu_remap(rp);
+
+       a_iop->t.device = rp->device_from;
+       if (!io_setup(a_iop, IOP_A))
+               goto out;
+
+       q_dip = __dip_find(rp->device);
+       if (!q_dip)
+               goto out;
+
+       q_iop = dip_find_sec(q_dip, IOP_Q, rp->sector);
+       if (q_iop)
+               update_q2a(q_iop, tdelta(q_iop->t.time, a_iop->t.time));
 
+out:
        io_release(a_iop);
 }