Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id ; Wed, 6 Mar 2002 15:14:51 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id ; Wed, 6 Mar 2002 15:14:44 -0500 Received: from cmailg7.svr.pol.co.uk ([195.92.195.177]:9265 "EHLO cmailg7.svr.pol.co.uk") by vger.kernel.org with ESMTP id ; Wed, 6 Mar 2002 15:14:30 -0500 Message-ID: <035101c1c54a$a00b6e40$0501a8c0@Stev.org> From: "James Stevenson" To: "Jean-Eric Cuendet" , In-Reply-To: <3C86553E.3070608@linkvest.com> Subject: Re: [PATCH] Rework of /proc/stat Date: Wed, 6 Mar 2002 20:08:04 -0000 X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 5.50.4807.1700 X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4807.1700 Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Hi would a patch like this not make more sense i picked it up on this list a while ago i cannot remember who wrote it fixed it a bit and it does much the same except it alows you to have any number of block devices though it does not work with scsi properly yet. diff against 2.4.18 > > Hi, > I've made a new version of IO statistics in kstat that remove the > previous limitations of MAX_MAJOR. I've made tests on my machine only, so could someone test it, please? > Feedback welcome. > Bye > -jec > > Patch attached. > Index: v2.4/drivers/block/ll_rw_blk.c diff -u v2.4/drivers/block/ll_rw_blk.c:1.1.1.2 v2.4/drivers/block/ll_rw_blk.c:1.1.1.2.2.1 --- v2.4/drivers/block/ll_rw_blk.c:1.1.1.2 Mon Feb 25 21:54:45 2002 +++ v2.4/drivers/block/ll_rw_blk.c Mon Feb 25 22:53:10 2002 @@ -183,7 +183,11 @@ if (count) printk("blk_cleanup_queue: leaked requests (%d)\n", count); - + /* + * free statistics structure + */ + kfree(q->dk_stat); + memset(q, 0, sizeof(*q)); } @@ -393,6 +397,8 @@ **/ void blk_init_queue(request_queue_t * q, request_fn_proc * rfn) { + struct disk_stat * new; + INIT_LIST_HEAD(&q->queue_head); elevator_init(&q->elevator, ELEVATOR_LINUS); blk_init_free_list(q); @@ -413,6 +419,15 @@ */ q->plug_device_fn = generic_plug_device; q->head_active = 1; + /* + * At last, allocate and initialize the statistics + */ + new = kmalloc(sizeof(struct disk_stat), GFP_KERNEL); + if (new == NULL) + printk(KERN_ERR "blk_init_queue:error allocating statisitcs\n"); + else + memset(new, 0, sizeof(struct disk_stat)); + q->dk_stat = new; } #define blkdev_free_rq(list) list_entry((list)->next, struct request, queue); @@ -497,23 +512,18 @@ else ro_bits[major][minor >> 5] &= ~(1 << (minor & 31)); } -inline void drive_stat_acct (kdev_t dev, int rw, +inline void drive_stat_acct (struct disk_stat * ds, int rw, unsigned long nr_sectors, int new_io) { - unsigned int major = MAJOR(dev); - unsigned int index; - - index = disk_index(dev); - if ((index >= DK_MAX_DISK) || (major >= DK_MAX_MAJOR)) + if (ds == NULL) return; - kstat.dk_drive[major][index] += new_io; if (rw == READ) { - kstat.dk_drive_rio[major][index] += new_io; - kstat.dk_drive_rblk[major][index] += nr_sectors; + ds->dk_drive_rio += new_io; + ds->dk_drive_rblk += nr_sectors; } else if (rw == WRITE) { - kstat.dk_drive_wio[major][index] += new_io; - kstat.dk_drive_wblk[major][index] += nr_sectors; + ds->dk_drive_wio += new_io; + ds->dk_drive_wblk += nr_sectors; } else printk(KERN_ERR "drive_stat_acct: cmd not R/W?\n"); } @@ -529,7 +539,7 @@ static inline void add_request(request_queue_t * q, struct request * req, struct list_head *insert_here) { - drive_stat_acct(req->rq_dev, req->cmd, req->nr_sectors, 1); + drive_stat_acct(q->dk_stat, req->cmd, req->nr_sectors, 1); if (!q->plugged && q->head_active && insert_here == &q->queue_head) { spin_unlock_irq(&io_request_lock); @@ -703,7 +713,7 @@ req->bhtail = bh; req->nr_sectors = req->hard_nr_sectors += count; blk_started_io(count); - drive_stat_acct(req->rq_dev, req->cmd, count, 0); + drive_stat_acct(q->dk_stat, req->cmd, count, 0); attempt_back_merge(q, req, max_sectors, max_segments); goto out; @@ -720,7 +730,7 @@ req->sector = req->hard_sector = sector; req->nr_sectors = req->hard_nr_sectors += count; blk_started_io(count); - drive_stat_acct(req->rq_dev, req->cmd, count, 0); + drive_stat_acct(q->dk_stat, req->cmd, count, 0); attempt_front_merge(q, head, req, max_sectors, max_segments); goto out; Index: v2.4/drivers/ide/ide.c diff -u v2.4/drivers/ide/ide.c:1.1.1.2 v2.4/drivers/ide/ide.c:1.1.1.2.2.1 --- v2.4/drivers/ide/ide.c:1.1.1.2 Mon Feb 25 21:55:52 2002 +++ v2.4/drivers/ide/ide.c Mon Feb 25 22:53:10 2002 @@ -1454,8 +1454,10 @@ request_queue_t *ide_get_queue (kdev_t dev) { ide_hwif_t *hwif = (ide_hwif_t *)blk_dev[MAJOR(dev)].data; - - return &hwif->drives[DEVICE_NR(dev) & 1].queue; + if (DEVICE_NR(dev) >= MAX_DRIVES) + return NULL; + else + return &hwif->drives[DEVICE_NR(dev)].queue; } /* Index: v2.4/drivers/md/md.c diff -u v2.4/drivers/md/md.c:1.1.1.2 v2.4/drivers/md/md.c:1.1.1.2.2.1 --- v2.4/drivers/md/md.c:1.1.1.2 Mon Feb 25 21:55:55 2002 +++ v2.4/drivers/md/md.c Mon Feb 25 22:53:10 2002 @@ -3308,12 +3308,15 @@ ITERATE_RDEV(mddev,rdev,tmp) { int major = MAJOR(rdev->dev); int idx = disk_index(rdev->dev); - + request_queue_t * rq = blk_get_queue(rdev->dev); + 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 (rq == NULL || (rq->dk_stat == NULL)) + continue; + curr_events = rq->dk_stat->dk_drive_rblk + + rq->dk_stat->dk_drive_wblk ; curr_events -= sync_io[major][idx]; if ((curr_events - rdev->last_events) > 32) { rdev->last_events = curr_events; Index: v2.4/fs/proc/proc_misc.c diff -u v2.4/fs/proc/proc_misc.c:1.1.1.1 v2.4/fs/proc/proc_misc.c:1.1.1.1.4.1 --- v2.4/fs/proc/proc_misc.c:1.1.1.1 Sun Jan 13 15:50:20 2002 +++ v2.4/fs/proc/proc_misc.c Mon Feb 25 22:53:10 2002 @@ -36,12 +36,12 @@ #include #include #include +#include #include #include #include - #define LOAD_INT(x) ((x) >> FSHIFT) #define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100) /* @@ -234,7 +234,23 @@ release: seq_release, }; #endif - +static int show_disk_stat(char * page, int len, struct disk_stat * ds, + int major, int disk) +{ + int active = ds->dk_drive_rio + ds->dk_drive_wio + + ds->dk_drive_rblk + ds->dk_drive_wblk; + if (active) + len += sprintf(page + len, + "(%u,%u):(%u,%u,%u,%u,%u) ", + major, disk, + ds->dk_drive_rio + ds->dk_drive_wio, + ds->dk_drive_rio, + ds->dk_drive_rblk, + ds->dk_drive_wio, + ds->dk_drive_wblk + ); + return len; +} static int kstat_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data) { @@ -284,21 +300,30 @@ len += sprintf(page + len, "\ndisk_io: "); - for (major = 0; major < DK_MAX_MAJOR; major++) { - for (disk = 0; disk < DK_MAX_DISK; disk++) { - int active = kstat.dk_drive[major][disk] + - kstat.dk_drive_rblk[major][disk] + - kstat.dk_drive_wblk[major][disk]; - if (active) - len += sprintf(page + len, - "(%u,%u):(%u,%u,%u,%u,%u) ", - major, disk, - kstat.dk_drive[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] - ); + for (major = 0; major < MAX_BLKDEV; major++) { + struct disk_stat * ds; + + if (!(blk_dev[major].queue)){ + ds = (BLK_DEFAULT_QUEUE(major))->dk_stat; + if (ds) + len = show_disk_stat(page, len, ds, major, 0); + }else { + request_queue_t * q; + struct gendisk * hd = get_gendisk(MKDEV(major,0)); + int max_disk; + if (!hd) + continue; + max_disk = MINORMASK>>hd->minor_shift; + + for (disk = 0; disk <= max_disk; disk++) { + q = blk_get_queue(MKDEV(major,disk<minor_shift)); + if (!q) + continue; + ds = q->dk_stat; + if (!ds) + continue; + len = show_disk_stat(page, len, ds, major,disk); + } } } Index: v2.4/include/linux/blkdev.h diff -u v2.4/include/linux/blkdev.h:1.1.1.1 v2.4/include/linux/blkdev.h:1.1.1.1.4.1 --- v2.4/include/linux/blkdev.h:1.1.1.1 Sun Jan 13 15:50:24 2002 +++ v2.4/include/linux/blkdev.h Mon Feb 25 22:53:10 2002 @@ -71,6 +71,13 @@ struct list_head free; }; +struct disk_stat{ + unsigned int dk_drive_rio; + unsigned int dk_drive_wio; + unsigned int dk_drive_rblk; + unsigned int dk_drive_wblk; +}; + struct request_queue { /* @@ -122,6 +129,10 @@ * Tasks wait here for free request */ wait_queue_head_t wait_for_request; + /* + * statistics + */ + struct disk_stat * dk_stat; }; struct blk_dev_struct { @@ -186,7 +197,7 @@ #define blkdev_next_request(req) blkdev_entry_to_request((req)->queue.next) #define blkdev_prev_request(req) blkdev_entry_to_request((req)->queue.prev) -extern void drive_stat_acct (kdev_t dev, int rw, +extern void drive_stat_acct (struct disk_stat *, int rw, unsigned long nr_sectors, int new_io); static inline int get_hardsect_size(kdev_t dev) Index: v2.4/include/linux/kernel_stat.h diff -u v2.4/include/linux/kernel_stat.h:1.1.1.1 v2.4/include/linux/kernel_stat.h:1.1.1.1.4.1 --- v2.4/include/linux/kernel_stat.h:1.1.1.1 Sun Jan 13 15:50:24 2002 +++ v2.4/include/linux/kernel_stat.h Mon Feb 25 22:53:10 2002 @@ -19,11 +19,6 @@ unsigned int per_cpu_user[NR_CPUS], per_cpu_nice[NR_CPUS], per_cpu_system[NR_CPUS]; - 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]; - unsigned int dk_drive_rblk[DK_MAX_MAJOR][DK_MAX_DISK]; - unsigned int dk_drive_wblk[DK_MAX_MAJOR][DK_MAX_DISK]; unsigned int pgpgin, pgpgout; unsigned int pswpin, pswpout; #if !defined(CONFIG_ARCH_S390) begin 666 disk_io-stats.dat M26YD97@Z('8R+C0O9')I=F5R"AD978I.PHM"6EF("@H:6YD M97@@/CT@1$M?34%87T1)4TLI('Q\("AM86IOPHM"0EK%]S96=M96YT#H@=C(N-"]DPH@"0EI;G0@;6%J;W(@/2!-04I/4BAR9&5V M+3YD978I.PH@"0EI;G0@:61X(#T@9&ES:U]I;F1E>"AR9&5V+3YD978I.PHM M"BL)"7)E<75E%T@.PHK"0D* M*PD):68@*')Q(#T]($Y53$P@?'P@*')Q+3YD:U]S=&%T(#T]($Y53$PI*0HK M"0D)8V]N=&EN=64["BL)"6-U#H@ M=C(N-"]F"]S;7!?;&]C:RYH/@H@(VEN8VQU9&4@/&QI;G5X+W-E<5]F M:6QE+F@^"BLC:6YC;'5D92 \;&EN=7@O8FQK9&5V+F@^"B *("-I;F-L=61E M(#QA"D@)B H1DE8141?,2TQ*2D@*B Q,# I"B O*@I 0" M,C,T+#<@*S(S M-"PR,R! 0 H@"7)E;&5APHK"0ES=')U8W0@9&ES:U]S M=&%T("H@9',["BL)"0HK"0EI9B H(2AB;&M?9&5V6VUA:F]R72YQ=65U92DI M>PHK"0D)9',@/2 H0DQ+7T1%1D%53%1?455%544H;6%J;W(I*2T^9&M?"]B;&MD M978N: E-;VX@1F5B(#(U(#(R.C4S.C$P(#(P,#(*0$ @+3'0I M"B C9&5F:6YE(&)L:V1E=E]P'1E M#H@=C(N-"]I;F-L=61E+VQI;G5X+VME"]K97)N96Q?7-T96U; M3E)?0U!54UT["BT)=6YS:6=N960@:6YT(&1K7V1R:79E6T1+7TU!6%]-04I/ M4EU;1$M?34%87T1)4TM=.PHM"75N