]> git.itanic.dy.fi Git - linux-stable/commitdiff
s390/dasd: add average request times to dasd statistics
authorStefan Haberland <sth@linux.vnet.ibm.com>
Fri, 14 Jul 2017 08:33:18 +0000 (10:33 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 23 Aug 2017 11:31:46 +0000 (13:31 +0200)
Add average times to the DASD statistics interface.

Signed-off-by: Stefan Haberland <sth@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/block/dasd.c
drivers/s390/block/dasd_int.h

index 670ac0a4ef4977425bae14465eb3c4d793af3582..a97b2b819f5100fd968a1c02821eec618b167484 100644 (file)
@@ -801,11 +801,12 @@ static void dasd_profile_end(struct dasd_block *block,
                             struct dasd_ccw_req *cqr,
                             struct request *req)
 {
-       long strtime, irqtime, endtime, tottime;        /* in microseconds */
-       long tottimeps, sectors;
+       unsigned long strtime, irqtime, endtime, tottime;
+       unsigned long tottimeps, sectors;
        struct dasd_device *device;
        int sectors_ind, tottime_ind, tottimeps_ind, strtime_ind;
        int irqtime_ind, irqtimeps_ind, endtime_ind;
+       struct dasd_profile_info *data;
 
        device = cqr->startdev;
        if (!(dasd_global_profile_level ||
@@ -835,6 +836,11 @@ static void dasd_profile_end(struct dasd_block *block,
 
        spin_lock(&dasd_global_profile.lock);
        if (dasd_global_profile.data) {
+               data = dasd_global_profile.data;
+               data->dasd_sum_times += tottime;
+               data->dasd_sum_time_str += strtime;
+               data->dasd_sum_time_irq += irqtime;
+               data->dasd_sum_time_end += endtime;
                dasd_profile_end_add_data(dasd_global_profile.data,
                                          cqr->startdev != block->base,
                                          cqr->cpmode == 1,
@@ -847,7 +853,12 @@ static void dasd_profile_end(struct dasd_block *block,
        spin_unlock(&dasd_global_profile.lock);
 
        spin_lock(&block->profile.lock);
-       if (block->profile.data)
+       if (block->profile.data) {
+               data = block->profile.data;
+               data->dasd_sum_times += tottime;
+               data->dasd_sum_time_str += strtime;
+               data->dasd_sum_time_irq += irqtime;
+               data->dasd_sum_time_end += endtime;
                dasd_profile_end_add_data(block->profile.data,
                                          cqr->startdev != block->base,
                                          cqr->cpmode == 1,
@@ -856,10 +867,16 @@ static void dasd_profile_end(struct dasd_block *block,
                                          tottimeps_ind, strtime_ind,
                                          irqtime_ind, irqtimeps_ind,
                                          endtime_ind);
+       }
        spin_unlock(&block->profile.lock);
 
        spin_lock(&device->profile.lock);
-       if (device->profile.data)
+       if (device->profile.data) {
+               data = device->profile.data;
+               data->dasd_sum_times += tottime;
+               data->dasd_sum_time_str += strtime;
+               data->dasd_sum_time_irq += irqtime;
+               data->dasd_sum_time_end += endtime;
                dasd_profile_end_add_data(device->profile.data,
                                          cqr->startdev != block->base,
                                          cqr->cpmode == 1,
@@ -868,6 +885,7 @@ static void dasd_profile_end(struct dasd_block *block,
                                          tottimeps_ind, strtime_ind,
                                          irqtime_ind, irqtimeps_ind,
                                          endtime_ind);
+       }
        spin_unlock(&device->profile.lock);
 }
 
@@ -989,6 +1007,14 @@ static void dasd_stats_seq_print(struct seq_file *m,
        seq_printf(m, "total_sectors %u\n", data->dasd_io_sects);
        seq_printf(m, "total_pav %u\n", data->dasd_io_alias);
        seq_printf(m, "total_hpf %u\n", data->dasd_io_tpm);
+       seq_printf(m, "avg_total %lu\n", data->dasd_io_reqs ?
+                  data->dasd_sum_times / data->dasd_io_reqs : 0UL);
+       seq_printf(m, "avg_build_to_ssch %lu\n", data->dasd_io_reqs ?
+                  data->dasd_sum_time_str / data->dasd_io_reqs : 0UL);
+       seq_printf(m, "avg_ssch_to_irq %lu\n", data->dasd_io_reqs ?
+                  data->dasd_sum_time_irq / data->dasd_io_reqs : 0UL);
+       seq_printf(m, "avg_irq_to_end %lu\n", data->dasd_io_reqs ?
+                  data->dasd_sum_time_end / data->dasd_io_reqs : 0UL);
        seq_puts(m, "histogram_sectors ");
        dasd_stats_array(m, data->dasd_io_secs);
        seq_puts(m, "histogram_io_times ");
index dca7cb1e6f651d91790045f50ac0801a36da6795..43f383b2f87d0c7e227f26e68de94898371f63f7 100644 (file)
@@ -454,6 +454,10 @@ struct dasd_profile_info {
        unsigned int dasd_read_time2[32];  /* hist. of time from start to irq */
        unsigned int dasd_read_time3[32];  /* hist. of time from irq to end */
        unsigned int dasd_read_nr_req[32]; /* hist. of # of requests in chanq */
+       unsigned long dasd_sum_times;      /* sum of request times */
+       unsigned long dasd_sum_time_str;   /* sum of time from build to start */
+       unsigned long dasd_sum_time_irq;   /* sum of time from start to irq */
+       unsigned long dasd_sum_time_end;   /* sum of time from irq to end */
 };
 
 struct dasd_profile {