[PATCH] Fix disk statistic reporting to include all disks

From: Bill Wilson (billw@wt.net)
Date: Tue Aug 29 2000 - 11:40:03 EDT

  • Next message: Arnaud S . Launay: "Re: 2.2.17pre16 VM: do_try_to_free_pages failed"

    This patch fixes the enhanced disk statistics to report all drives
    so IDE1 - IDE3 (/dev/hdc - /dev/hdh) can be monitored.

    It is also more efficient when scanning the kstat disk tables
    during a read of /proc/stat because entries in the table are looked
    at only if a disk has registered any activity.

    Bill

    Bill Wilson <bill@gkrellm.net>

    diff -ur linux-2.4.0-test7/drivers/block/ll_rw_blk.c
    linux/drivers/block/ll_rw_blk.c
    --- linux-2.4.0-test7/drivers/block/ll_rw_blk.c Sat Aug 26 12:28:23 2000
    +++ linux/drivers/block/ll_rw_blk.c Tue Aug 29 07:58:18 2000
    @@ -551,19 +551,26 @@
                                    unsigned long nr_sectors, int new_io)
     {
            unsigned int major = MAJOR(dev);
    - unsigned int index;
    + unsigned int disk;
    + int index;
     
    - index = disk_index(dev);
    - if ((index >= DK_MAX_DISK) || (major >= DK_MAX_MAJOR))
    + disk = disk_index(dev);
    + if ((disk >= DK_MAX_DISK) || (major >= MAX_BLKDEV))
                    return;
    -
    - kstat.dk_drive[major][index] += new_io;
    + if ((index = kstat.dk_drive_map[major] - 1) < 0) {
    + if (kstat.dk_drive_max >= DK_MAX_MAJOR)
    + return;
    + index = kstat.dk_drive_max++;
    + kstat.dk_drive_map[major] = index + 1;
    + kstat.dk_drive_major[index] = (int) major;
    + }
    + kstat.dk_drive[index][disk] += new_io;
            if (rw == READ) {
    - kstat.dk_drive_rio[major][index] += new_io;
    - kstat.dk_drive_rblk[major][index] += nr_sectors;
    + kstat.dk_drive_rio[index][disk] += new_io;
    + kstat.dk_drive_rblk[index][disk] += nr_sectors;
            } else if (rw == WRITE) {
    - kstat.dk_drive_wio[major][index] += new_io;
    - kstat.dk_drive_wblk[major][index] += nr_sectors;
    + kstat.dk_drive_wio[index][disk] += new_io;
    + kstat.dk_drive_wblk[index][disk] += nr_sectors;
            } else
                    printk(KERN_ERR "drive_stat_acct: cmd not R/W?\n");
     }
    diff -ur linux-2.4.0-test7/drivers/block/md.c linux/drivers/block/md.c
    --- linux-2.4.0-test7/drivers/block/md.c Sat Aug 26 12:28:23 2000
    +++ linux/drivers/block/md.c Tue Aug 29 07:58:18 2000
    @@ -3218,6 +3218,7 @@
            struct md_list_head *tmp;
            int idle;
            unsigned long curr_events;
    + int index;
     
            idle = 1;
            ITERATE_RDEV(mddev,rdev,tmp) {
    @@ -3226,9 +3227,11 @@
     
                    if ((idx >= DK_MAX_DISK) || (major >= DK_MAX_MAJOR))
                            continue;
    -
    - curr_events = kstat.dk_drive_rblk[major][idx] +
    - kstat.dk_drive_wblk[major][idx]
    ;
    + if ((index = kstat.dk_drive_map[major] - 1) < 0)
    + curr_events = 0;
    + else
    + curr_events = kstat.dk_drive_rblk[index][idx] +
    + kstat.dk_drive_wblk[index][idx]
    ;
                    curr_events -= sync_io[major][idx];
     // printk("events(major: %d, idx: %d): %ld\n", major, idx,
    curr_events);
                    if (curr_events != rdev->last_events) {
    diff -ur linux-2.4.0-test7/fs/proc/proc_misc.c linux/fs/proc/proc_misc.c
    --- linux-2.4.0-test7/fs/proc/proc_misc.c Mon Aug 7 13:20:10 2000
    +++ linux/fs/proc/proc_misc.c Tue Aug 29 07:58:18 2000
    @@ -288,7 +288,7 @@
            extern unsigned long total_forks;
            unsigned long jif = jiffies;
            unsigned int sum = 0, user = 0, nice = 0, system = 0;
    - int major, disk;
    + int index, major, disk;
     
            for (i = 0 ; i < smp_num_cpus; i++) {
                    int cpu = cpu_logical_map(i), j;
    @@ -326,20 +326,22 @@
     
            len += sprintf(page + len, "\ndisk_io: ");
     
    - for (major = 0; major < DK_MAX_MAJOR; major++) {
    + for (index = 0; index < kstat.dk_drive_max; index++) {
    + if ((major = kstat.dk_drive_major[index]) == 0)
    + continue;
                    for (disk = 0; disk < DK_MAX_DISK; disk++) {
    - int active = kstat.dk_drive_rio[major][disk] +
    - kstat.dk_drive_rblk[major][disk] +
    - kstat.dk_drive_wio[major][disk] +
    - kstat.dk_drive_wblk[major][disk];
    + int active = kstat.dk_drive_rio[index][disk] +
    + kstat.dk_drive_rblk[index][disk] +
    + kstat.dk_drive_wio[index][disk] +
    + kstat.dk_drive_wblk[index][disk];
                            if (active)
                                    len += sprintf(page + len,
                                            "(%u,%u):(%u,%u,%u,%u) ",
                                            major, disk,
    - kstat.dk_drive_rio[major][disk],
    - kstat.dk_drive_rblk[major][disk],
    - kstat.dk_drive_wio[major][disk],
    - kstat.dk_drive_wblk[major][disk]
    + kstat.dk_drive_rio[index][disk],
    + kstat.dk_drive_rblk[index][disk],
    + kstat.dk_drive_wio[index][disk],
    + kstat.dk_drive_wblk[index][disk]
                            );
                    }
            }
    diff -ur linux-2.4.0-test7/include/linux/genhd.h linux/include/linux/genhd.h
    --- linux-2.4.0-test7/include/linux/genhd.h Mon Aug 7 13:20:12 2000
    +++ linux/include/linux/genhd.h Tue Aug 29 07:58:18 2000
    @@ -249,12 +249,19 @@
                    case SCSI_DISK0_MAJOR:
                            index = (minor & 0x00f0) >> 4;
                            break;
    + case SCSI_CDROM_MAJOR:
    + case SCSI_GENERIC_MAJOR:
    + case FLOPPY_MAJOR:
    + index = (minor & 0x000f);
    + break;
                    case IDE0_MAJOR: /* same as HD_MAJOR */
    + case IDE1_MAJOR:
    + case IDE2_MAJOR:
    + case IDE3_MAJOR:
    + case IDE4_MAJOR:
    + case IDE5_MAJOR:
                    case XT_DISK_MAJOR:
                            index = (minor & 0x0040) >> 6;
    - break;
    - case IDE1_MAJOR:
    - index = ((minor & 0x0040) >> 6) + 2;
                            break;
                    default:
                            return 0;
    diff -ur linux-2.4.0-test7/include/linux/kernel_stat.h
    linux/include/linux/kernel_stat.h
    --- linux-2.4.0-test7/include/linux/kernel_stat.h Mon Aug 7 13:20:12 2000
    +++ linux/include/linux/kernel_stat.h Tue Aug 29 07:58:18 2000
    @@ -19,6 +19,9 @@
            unsigned int per_cpu_user[NR_CPUS],
                         per_cpu_nice[NR_CPUS],
                         per_cpu_system[NR_CPUS];
    + int dk_drive_max;
    + int dk_drive_map[MAX_BLKDEV];
    + int dk_drive_major[DK_MAX_MAJOR];
            unsigned int dk_drive[DK_MAX_MAJOR][DK_MAX_DISK];
            unsigned int dk_drive_rio[DK_MAX_MAJOR][DK_MAX_DISK];
            unsigned int dk_drive_wio[DK_MAX_MAJOR][DK_MAX_DISK];

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    Please read the FAQ at http://www.tux.org/lkml/



    This archive was generated by hypermail 2b29 : Tue Aug 29 2000 - 11:41:24 EDT