Index: oldkernel/linux/drivers/block/ll_rw_blk.c diff -u linux/drivers/block/ll_rw_blk.c:1.2 linux/drivers/block/ll_rw_blk.c:1.3 --- linux/drivers/block/ll_rw_blk.c:1.2 Thu Jun 1 14:51:28 2000 +++ linux/drivers/block/ll_rw_blk.c Thu Jun 1 17:02:44 2000 @@ -297,6 +297,37 @@ printk(KERN_ERR "drive_stat_acct: cmd not R/W?\n"); } +static inline void drive_pg_stat_acct(int cmd, int major, int minor) +{ + short disk_index = 255; + + switch (major) { + case DAC960_MAJOR+0: + disk_index = (minor & 0x00f8) >> 3; + break; + case SCSI_DISK0_MAJOR: + disk_index = (minor & 0x00f0) >> 4; + break; + case IDE0_MAJOR: /* same as HD_MAJOR */ + case XT_DISK_MAJOR: + disk_index = (minor & 0x0040) >> 6; + break; + case IDE1_MAJOR: + disk_index = ((minor & 0x0040) >> 6) + 2; + default: + break; + } + + if (disk_index < 4) { + if (cmd == READ) + kstat.dk_drive_pgin[disk_index]++; + else if (cmd == WRITE) + kstat.dk_drive_pgout[disk_index]++; + else + printk(KERN_ERR "drive_pg_stat_acct: cmd not R/W?\n"); + } +} + /* * add-request adds a request to the linked list. * It disables interrupts (aquires the request spinlock) so that it can muck @@ -414,12 +445,16 @@ wake_up (&wait_for_request); } -void make_request(int major, int rw, struct buffer_head * bh) +void make_request(kdev_t dev, int rw, struct buffer_head * bh) { unsigned int sector, count; struct request * req; int rw_ahead, max_req, max_sectors, max_segments; unsigned long flags; + int major, minor; + + major = MAJOR (dev); + minor = MINOR (dev); count = bh->b_size >> 9; sector = bh->b_rsector; @@ -464,6 +499,7 @@ if (buffer_uptodate(bh)) /* Hmmph! Already have it */ goto end_io; kstat.pgpgin++; + drive_pg_stat_acct(rw, major, minor); max_req = NR_REQUEST; /* reads take precedence */ break; case WRITEA: @@ -478,6 +514,7 @@ * requests are only for reads. */ kstat.pgpgout++; + drive_pg_stat_acct(rw, major, minor); max_req = (NR_REQUEST * 2) / 3; break; default: @@ -713,7 +750,7 @@ continue; } #endif - make_request(MAJOR(bh[i]->b_rdev), rw, bh[i]); + make_request(bh[i]->b_rdev, rw, bh[i]); } } return; Index: oldkernel/linux/fs/proc/array.c diff -u linux/fs/proc/array.c:1.3 linux/fs/proc/array.c:1.4 --- linux/fs/proc/array.c:1.3 Thu Jun 1 16:47:27 2000 +++ linux/fs/proc/array.c Thu Jun 1 17:02:44 2000 @@ -275,6 +275,8 @@ "disk_wio %u %u %u %u\n" "disk_rblk %u %u %u %u\n" "disk_wblk %u %u %u %u\n" + "disk_pgin %u %u %u %u\n" + "disk_pgout %u %u %u %u\n" "page %u %u\n" "swap %u %u\n" "intr %u", @@ -286,6 +288,8 @@ "disk_wio %u %u %u %u\n" "disk_rblk %u %u %u %u\n" "disk_wblk %u %u %u %u\n" + "disk_pgin %u %u %u %u\n" + "disk_pgout %u %u %u %u\n" "page %u %u\n" "swap %u %u\n" "intr %u", @@ -304,6 +308,10 @@ kstat.dk_drive_rblk[2], kstat.dk_drive_rblk[3], kstat.dk_drive_wblk[0], kstat.dk_drive_wblk[1], kstat.dk_drive_wblk[2], kstat.dk_drive_wblk[3], + kstat.dk_drive_pgin[0], kstat.dk_drive_pgin[1], + kstat.dk_drive_pgin[2], kstat.dk_drive_pgin[3], + kstat.dk_drive_pgout[0], kstat.dk_drive_pgout[1], + kstat.dk_drive_pgout[2], kstat.dk_drive_pgout[3], kstat.pgpgin, kstat.pgpgout, kstat.pswpin, Index: oldkernel/linux/include/linux/blkdev.h diff -u linux/include/linux/blkdev.h:1.2 linux/include/linux/blkdev.h:1.3 --- linux/include/linux/blkdev.h:1.2 Thu Jun 1 14:51:29 2000 +++ linux/include/linux/blkdev.h Thu Jun 1 17:02:44 2000 @@ -59,7 +59,7 @@ extern struct wait_queue * wait_for_request; extern void resetup_one_dev(struct gendisk *dev, int drive); extern void unplug_device(void * data); -extern void make_request(int major,int rw, struct buffer_head * bh); +extern void make_request(kdev_t dev, int rw, struct buffer_head * bh); /* md needs this function to remap requests */ extern int md_map (kdev_t dev, kdev_t *rdev, Index: oldkernel/linux/include/linux/kernel_stat.h diff -u linux/include/linux/kernel_stat.h:1.1.1.1 linux/include/linux/kernel_stat.h:1.2 --- linux/include/linux/kernel_stat.h:1.1.1.1 Wed May 31 12:33:49 2000 +++ linux/include/linux/kernel_stat.h Thu Jun 1 17:02:44 2000 @@ -23,6 +23,8 @@ unsigned int dk_drive_wio[DK_NDRIVE]; unsigned int dk_drive_rblk[DK_NDRIVE]; unsigned int dk_drive_wblk[DK_NDRIVE]; + unsigned int dk_drive_pgin[DK_NDRIVE]; + unsigned int dk_drive_pgout[DK_NDRIVE]; unsigned int pgpgin, pgpgout; unsigned int pswpin, pswpout; unsigned int irqs[NR_CPUS][NR_IRQS];