* [PATCH] Rework of /proc/stat
@ 2002-03-06 17:43 Jean-Eric Cuendet
2002-03-06 20:08 ` James Stevenson
2002-03-06 22:42 ` Alan Cox
0 siblings, 2 replies; 20+ messages in thread
From: Jean-Eric Cuendet @ 2002-03-06 17:43 UTC (permalink / raw)
To: Jean-Eric Cuendet, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 220 bytes --]
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.
[-- Attachment #2: proc_stat.patch --]
[-- Type: text/plain, Size: 7074 bytes --]
--- /tmp/linux-2.4.18-vanilla/include/linux/kernel_stat.h Thu Nov 22 20:46:19 2001
+++ /toc/linux-2.4.18-reempt/include/linux/kernel_stat.h Wed Mar 6 18:02:57 2002
@@ -12,18 +12,37 @@
* used by rstatd/perfmeter
*/
-#define DK_MAX_MAJOR 16
-#define DK_MAX_DISK 16
+#define DK_MAX_DEVICES 64
+#define DK_BUCKETS 256
+
+
+struct _kstat_block_io
+{
+ struct _kstat_block_io* next;
+
+ unsigned int major;
+ unsigned int minor;
+
+ unsigned int io;
+ unsigned int rio;
+ unsigned int wio;
+ unsigned int rblk;
+ unsigned int wblk;
+};
+typedef struct _kstat_block_io kstat_block_io;
+
+
+/* static array of IO stats */
+extern unsigned int kstat_devices_current_index;
+extern kstat_block_io kstat_devices_array[DK_MAX_DEVICES];
+
+
struct kernel_stat {
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];
+ kstat_block_io* io_stat_tbl[DK_BUCKETS];
unsigned int pgpgin, pgpgout;
unsigned int pswpin, pswpout;
#if !defined(CONFIG_ARCH_S390)
@@ -37,6 +56,103 @@
extern struct kernel_stat kstat;
+
+
+/* Size of the table */
+extern const unsigned int kstat_block_io_tbl_size;
+
+/* hash function */
+static inline unsigned kstat_block_io_hash(unsigned int major, unsigned int minor)
+{
+ return major * 1999 ^ minor;
+}
+
+
+/* add an IO stat */
+static inline kstat_block_io* kstat_block_io_add(unsigned int major, unsigned int minor)
+{
+ unsigned int i;
+ kstat_block_io* p;
+ kstat_block_io* pstat;
+
+ if (kstat_devices_current_index >= DK_MAX_DEVICES)
+ {
+ printk("ERROR: kstat: No more slot for device IO stats. Try extending DK_MAX_DEVICES\n");
+ return 0;
+ }
+
+ pstat = &kstat_devices_array[kstat_devices_current_index];
+ kstat_devices_current_index++;
+ pstat->next = 0;
+ pstat->major = major;
+ pstat->minor = minor;
+ pstat->io = 0;
+ pstat->rio = 0;
+ pstat->wio = 0;
+ pstat->rblk = 0;
+ pstat->wblk = 0;
+
+ i = kstat_block_io_hash(major, minor) % kstat_block_io_tbl_size;
+ p = kstat.io_stat_tbl[i];
+ if (p == 0)
+ {
+ kstat.io_stat_tbl[i] = pstat;
+ }
+ else
+ {
+ printk("WARNING: kstat: Collision found in IO stat accounting table (add). Try extending DK_BUCKETS\n");
+ while (p->next != 0)
+ {
+ p = p->next;
+ }
+ p->next = pstat;
+ }
+ return pstat;
+}
+
+/* lookup an IO stat */
+static inline kstat_block_io* kstat_block_io_lookup(unsigned major, unsigned minor)
+{
+ unsigned int i = kstat_block_io_hash(major, minor) % kstat_block_io_tbl_size;
+ kstat_block_io* p = kstat.io_stat_tbl[i];
+ while (p && p->major != major && p->minor != minor)
+ {
+ printk("WARNING: kstat: Collision found in IO stat accounting table (lookup). Try extending DK_BUCKETS\n");
+ p = p->next;
+ }
+ if (p == 0)
+ {
+ p = kstat_block_io_add(major, minor);
+ if (p == 0)
+ {
+ return 0;
+ }
+ }
+ return p;
+}
+
+/* This is used by MD to see if IDLE */
+static inline unsigned long kstat_get_rwblk(unsigned int major, unsigned int minor)
+{
+ kstat_block_io* stat = kstat_block_io_lookup(major, minor);
+ if (stat == 0)
+ {
+ printk("ERROR: kstat: No IO stat found for (%d/%d)\n", major, minor);
+ return 0;
+ }
+ return stat->rblk + stat->wblk;
+}
+
+
+
+
+
+
+
+
+
+
+
#if !defined(CONFIG_ARCH_S390)
/*
* Number of interrupts per specific IRQ source, since bootup
--- /tmp/linux-2.4.18-vanilla/drivers/md/md.c Mon Feb 25 20:37:58 2002
+++ /toc/linux-2.4.18-reempt/drivers/md/md.c Wed Mar 6 16:46:56 2002
@@ -3284,6 +3284,9 @@
return NULL;
}
+/* MD devices are major=9 and minor=1-31 */
+#define DK_MAX_MAJOR 16
+#define DK_MAX_DISK 32
static unsigned int sync_io[DK_MAX_MAJOR][DK_MAX_DISK];
void md_sync_acct(kdev_t dev, unsigned long nr_sectors)
{
@@ -3305,15 +3308,12 @@
unsigned long curr_events;
idle = 1;
- ITERATE_RDEV(mddev,rdev,tmp) {
+ ITERATE_RDEV(mddev,rdev,tmp)
+ {
int major = MAJOR(rdev->dev);
int idx = disk_index(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] ;
+ curr_events = kstat_get_rwblk(major, idx);
curr_events -= sync_io[major][idx];
if ((curr_events - rdev->last_events) > 32) {
rdev->last_events = curr_events;
--- /tmp/linux-2.4.18-vanilla/drivers/block/ll_rw_blk.c Mon Feb 25 20:37:57 2002
+++ /toc/linux-2.4.18-reempt/drivers/block/ll_rw_blk.c Wed Mar 6 18:12:03 2002
@@ -501,19 +501,22 @@
unsigned long nr_sectors, int new_io)
{
unsigned int major = MAJOR(dev);
- unsigned int index;
+ unsigned int minor = MINOR(dev);
+ kstat_block_io* stat = kstat_block_io_lookup(major, minor);
- index = disk_index(dev);
- if ((index >= DK_MAX_DISK) || (major >= DK_MAX_MAJOR))
- return;
+ if (stat == 0)
+ {
+ printk("ERROR: kstat: Haven't found an IO stat struct for major=%d / minor=%d\n", major, minor);
+ return;
+ }
- kstat.dk_drive[major][index] += new_io;
+ stat->io += new_io;
if (rw == READ) {
- kstat.dk_drive_rio[major][index] += new_io;
- kstat.dk_drive_rblk[major][index] += nr_sectors;
+ stat->rio += new_io;
+ stat->rblk += nr_sectors;
} else if (rw == WRITE) {
- kstat.dk_drive_wio[major][index] += new_io;
- kstat.dk_drive_wblk[major][index] += nr_sectors;
+ stat->wio += new_io;
+ stat->wblk += nr_sectors;
} else
printk(KERN_ERR "drive_stat_acct: cmd not R/W?\n");
}
--- /tmp/linux-2.4.18-vanilla/fs/proc/proc_misc.c Wed Nov 21 06:29:09 2001
+++ /toc/linux-2.4.18-reempt/fs/proc/proc_misc.c Wed Mar 6 17:41:28 2002
@@ -282,25 +282,19 @@
len += sprintf(page + len, " %u", kstat_irqs(i));
#endif
- len += sprintf(page + len, "\ndisk_io: ");
+ 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 (i = 0; i < kstat_devices_current_index; i++)
+ {
+ kstat_block_io* stat = &kstat_devices_array[i];
+ len += sprintf( page + len, "(%u,%u):(%u,%u,%u,%u,%u) ",
+ stat->major, stat->minor,
+ stat->io,
+ stat->rio,
+ stat->wio,
+ stat->rblk,
+ stat->wblk );
+ }
len += sprintf(page + len,
"\nctxt %u\n"
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH] Rework of /proc/stat 2002-03-06 17:43 [PATCH] Rework of /proc/stat Jean-Eric Cuendet @ 2002-03-06 20:08 ` James Stevenson 2002-03-06 22:42 ` Alan Cox 1 sibling, 0 replies; 20+ messages in thread From: James Stevenson @ 2002-03-06 20:08 UTC (permalink / raw) To: Jean-Eric Cuendet, linux-kernel 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 <linux/init.h> #include <linux/smp_lock.h> #include <linux/seq_file.h> +#include <linux/blkdev.h> #include <asm/uaccess.h> #include <asm/pgtable.h> #include <asm/io.h> - #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<<hd->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<R]B;&]C:R]L;%]R=U]B;&LN8PID:69F("UU M('8R+C0O9')I=F5R<R]B;&]C:R]L;%]R=U]B;&LN8SHQ+C$N,2XR('8R+C0O M9')I=F5R<R]B;&]C:R]L;%]R=U]B;&LN8SHQ+C$N,2XR+C(N,0HM+2T@=C(N M-"]D<FEV97)S+V)L;V-K+VQL7W)W7V)L:RYC.C$N,2XQ+C()36]N($9E8B R M-2 R,3HU-#HT-2 R,# R"BLK*R!V,BXT+V1R:79E<G,O8FQO8VLO;&Q?<G=? M8FQK+F,)36]N($9E8B R-2 R,CHU,SHQ," R,# R"D! ("TQ.#,L-R K,3@S M+#$Q($! "B *( EI9B H8V]U;G0I"B )"7!R:6YT:R@B8FQK7V-L96%N=7!? M<75E=64Z(&QE86ME9"!R97%U97-T<R H)60I7&XB+"!C;W5N="D["BT**PDO M*@HK"2 J(&9R964@<W1A=&ES=&EC<R!S=')U8W1U<F4**PD@*B\**PEK9G)E M92AQ+3YD:U]S=&%T*3L**PD*( EM96US970H<2P@,"P@<VEZ96]F*"IQ*2D[ M"B!]"B *0$ @+3,Y,RPV("LS.3<L."! 0 H@("HJ+PH@=F]I9"!B;&M?:6YI M=%]Q=65U92AR97%U97-T7W%U975E7W0@*B!Q+"!R97%U97-T7V9N7W!R;V,@ M*B!R9FXI"B!["BL)<W1R=6-T(&1I<VM?<W1A=" J(&YE=SL)"BL*( E)3DE4 M7TQ)4U1?2$5!1"@F<2T^<75E=65?:&5A9"D["B )96QE=F%T;W)?:6YI="@F M<2T^96QE=F%T;W(L($5,159!5$]27TQ)3E53*3L*( EB;&M?:6YI=%]F<F5E M7VQI<W0H<2D["D! ("TT,3,L-B K-#$Y+#$U($! "B )("HO"B )<2T^<&QU M9U]D979I8V5?9FX@"3T@9V5N97)I8U]P;'5G7V1E=FEC93L*( EQ+3YH96%D M7V%C=&EV92 @(" )/2 Q.PHK"2\J( HK"2 J($%T(&QA<W0L(&%L;&]C871E M(&%N9"!I;FET:6%L:7IE('1H92!S=&%T:7-T:6-S( HK"2 J+PHK"6YE=R ] M(&MM86QL;V,H<VEZ96]F*'-T<G5C="!D:7-K7W-T870I+"!'1E!?2T523D5, M*3L**PEI9B H;F5W(#T]($Y53$PI"BL)"7!R:6YT:RA+15).7T524B B8FQK M7VEN:71?<75E=64Z97)R;W(@86QL;V-A=&EN9R!S=&%T:7-I=&-S7&XB*3L* M*PEE;'-E"BL)"6UE;7-E="AN97<L(# L('-I>F5O9BAS=')U8W0@9&ES:U]S M=&%T*2D["BL)<2T^9&M?<W1A=" ](&YE=SL*('T*( H@(V1E9FEN92!B;&MD M979?9G)E95]R<2AL:7-T*2!L:7-T7V5N=')Y*"AL:7-T*2T^;F5X="P@<W1R M=6-T(')E<75E<W0L('%U975E*3L*0$ @+30Y-RPR,R K-3$R+#$X($! "B ) M96QS92!R;U]B:71S6VUA:F]R75MM:6YO<B ^/B U72 F/2!^*#$@/#P@*&UI M;F]R("8@,S$I*3L*('T*( HM:6YL:6YE('9O:60@9')I=F5?<W1A=%]A8V-T M("AK9&5V7W0@9&5V+"!I;G0@<G<L"BMI;FQI;F4@=F]I9"!D<FEV95]S=&%T M7V%C8W0@*'-T<G5C="!D:7-K7W-T870@*B!D<RP@:6YT(')W+ H@"0D)"75N M<VEG;F5D(&QO;F<@;G)?<V5C=&]R<RP@:6YT(&YE=U]I;RD*('L*+0EU;G-I M9VYE9"!I;G0@;6%J;W(@/2!-04I/4BAD978I.PHM"75N<VEG;F5D(&EN="!I M;F1E>#L*+0HM"6EN9&5X(#T@9&ES:U]I;F1E>"AD978I.PHM"6EF("@H:6YD M97@@/CT@1$M?34%87T1)4TLI('Q\("AM86IO<B ^/2!$2U]-05A?34%*3U(I M*0HK"6EF("AD<R ]/2!.54Q,*0H@"0ER971U<FX["B *+0EK<W1A="YD:U]D M<FEV95MM86IO<EU;:6YD97A=("L](&YE=U]I;SL*( EI9B H<G<@/3T@4D5! M1"D@>PHM"0EK<W1A="YD:U]D<FEV95]R:6];;6%J;W)=6VEN9&5X72 K/2!N M97=?:6\["BT)"6MS=&%T+F1K7V1R:79E7W)B;&M;;6%J;W)=6VEN9&5X72 K M/2!N<E]S96-T;W)S.PHK"0ED<RT^9&M?9')I=F5?<FEO("L](&YE=U]I;SL* M*PD)9',M/F1K7V1R:79E7W)B;&L@*ST@;G)?<V5C=&]R<SL*( E](&5L<V4@ M:68@*')W(#T](%=2251%*2:W-T870N9&M?9')I=F5?=V)L:UMM M86IO<EU;:6YD97A=("L](&YR7W-E8W1O<G,["BL)"61S+3YD:U]D<FEV95]W M:6\@*ST@;F5W7VEO.PHK"0ED<RT^9&M?9')I=F5?=V)L:R K/2!N<E]S96-T M;W)S.PH@"7T@96QS90H@"0EP<FEN=&LH2T523E]%4E(@(F1R:79E7W-T871? M86-C=#H@8VUD(&YO="!2+U<_7&XB*3L*('T*0$ @+34R.2PW("LU,SDL-R! M0 H@<W1A=&EC(&EN;&EN92!V;VED(&%D9%]R97%U97-T*')E<75E<W1?<75E M=65?=" J('$L('-T<G5C="!R97%U97-T("H@<F5Q+ H@"0D)(" @(" @('-T M<G5C="!L:7-T7VAE860@*FEN<V5R=%]H97)E*0H@>PHM"61R:79E7W-T871? M86-C="AR97$M/G)Q7V1E=BP@<F5Q+3YC;60L(')E<2T^;G)?<V5C=&]R<RP@ M,2D["BL)9')I=F5?<W1A=%]A8V-T*'$M/F1K7W-T870L(')E<2T^8VUD+"!R M97$M/FYR7W-E8W1O<G,L(#$I.PH@"B ):68@*"%Q+3YP;'5G9V5D("8F('$M M/FAE861?86-T:79E("8F(&EN<V5R=%]H97)E(#T]("9Q+3YQ=65U95]H96%D M*2!["B )"7-P:6Y?=6YL;V-K7VER<2@F:6]?<F5Q=65S=%]L;V-K*3L*0$ @ M+3<P,RPW("LW,3,L-R! 0 H@"0D)<F5Q+3YB:'1A:6P@/2!B:#L*( D)"7)E M<2T^;G)?<V5C=&]R<R ](')E<2T^:&%R9%]N<E]S96-T;W)S("L](&-O=6YT M.PH@"0D)8FQK7W-T87)T961?:6\H8V]U;G0I.PHM"0D)9')I=F5?<W1A=%]A M8V-T*')E<2T^<G%?9&5V+"!R97$M/F-M9"P@8V]U;G0L(# I.PHK"0D)9')I M=F5?<W1A=%]A8V-T*'$M/F1K7W-T870L(')E<2T^8VUD+"!C;W5N="P@,"D[ M"B )"0EA='1E;7!T7V)A8VM?;65R9V4H<2P@<F5Q+"!M87A?<V5C=&]R<RP@ M;6%X7W-E9VUE;G1S*3L*( D)"6=O=&\@;W5T.PH@"D! ("TW,C L-R K-S,P M+#<@0$ *( D)"7)E<2T^<V5C=&]R(#T@<F5Q+3YH87)D7W-E8W1O<B ]('-E M8W1O<CL*( D)"7)E<2T^;G)?<V5C=&]R<R ](')E<2T^:&%R9%]N<E]S96-T M;W)S("L](&-O=6YT.PH@"0D)8FQK7W-T87)T961?:6\H8V]U;G0I.PHM"0D) M9')I=F5?<W1A=%]A8V-T*')E<2T^<G%?9&5V+"!R97$M/F-M9"P@8V]U;G0L M(# I.PHK"0D)9')I=F5?<W1A=%]A8V-T*'$M/F1K7W-T870L(')E<2T^8VUD M+"!C;W5N="P@,"D["B )"0EA='1E;7!T7V9R;VYT7VUE<F=E*'$L(&AE860L M(')E<2P@;6%X7W-E8W1O<G,L(&UA>%]S96=M96YT<RD["B )"0EG;W1O(&]U M=#L*( I);F1E>#H@=C(N-"]D<FEV97)S+VED92]I9&4N8PID:69F("UU('8R M+C0O9')I=F5R<R]I9&4O:61E+F,Z,2XQ+C$N,B!V,BXT+V1R:79E<G,O:61E M+VED92YC.C$N,2XQ+C(N,BXQ"BTM+2!V,BXT+V1R:79E<G,O:61E+VED92YC M.C$N,2XQ+C()36]N($9E8B R-2 R,3HU-3HU,B R,# R"BLK*R!V,BXT+V1R M:79E<G,O:61E+VED92YC"4UO;B!&96(@,C4@,C(Z-3,Z,3 @,C P,@I 0" M M,30U-"PX("LQ-#4T+#$P($! "B!R97%U97-T7W%U975E7W0@*FED95]G971? M<75E=64@*&MD979?="!D978I"B<F5T M=7)N("9H=VEF+3YD<FEV97-;1$5624-%7TY2*&1E=BD@)B Q72YQ=65U93L* M*PEI9B H1$5624-%7TY2*&1E=BD@/CT@34%87T12259%4RD**PD)(')E='5R M;B!.54Q,.PHK"65L<V4@"BL)"7)E='5R;B F:'=I9BT^9')I=F5S6T1%5DE# M15].4BAD978I72YQ=65U93L*('T*( H@+RH*26YD97@Z('8R+C0O9')I=F5R M<R]M9"]M9"YC"F1I9F8@+74@=C(N-"]D<FEV97)S+VUD+VUD+F,Z,2XQ+C$N M,B!V,BXT+V1R:79E<G,O;60O;60N8SHQ+C$N,2XR+C(N,0HM+2T@=C(N-"]D M<FEV97)S+VUD+VUD+F,Z,2XQ+C$N,@E-;VX@1F5B(#(U(#(Q.C4U.C4U(#(P M,#(**RLK('8R+C0O9')I=F5R<R]M9"]M9"YC"4UO;B!&96(@,C4@,C(Z-3,Z M,3 @,C P,@I 0" M,S,P."PQ,B K,S,P."PQ-2! 0 H@"4E415)!5$5?4D1% M5BAM9&1E=BQR9&5V+'1M<"D@>PH@"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<W1?<75E=65?=" J(')Q(#T@8FQK7V=E=%]Q=65U92AR9&5V M+3YD978I.PHK"0D*( D):68@*"AI9'@@/CT@1$M?34%87T1)4TLI('Q\("AM M86IO<B ^/2!$2U]-05A?34%*3U(I*0H@"0D)8V]N=&EN=64["BT*+0D)8W5R M<E]E=F5N=',@/2!K<W1A="YD:U]D<FEV95]R8FQK6VUA:F]R75MI9'A=("L* M+0D)"0D)"6MS=&%T+F1K7V1R:79E7W=B;&M;;6%J;W)=6VED>%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<G)?979E;G1S(#T@<G$M/F1K7W-T870M/F1K M7V1R:79E7W)B;&L@*R **PD)"7)Q+3YD:U]S=&%T+3YD:U]D<FEV95]W8FQK M(#L*( D)8W5R<E]E=F5N=',@+3T@<WEN8U]I;UMM86IO<EU;:61X73L*( D) M:68@*"AC=7)R7V5V96YT<R M(')D978M/FQA<W1?979E;G1S*2 ^(#,R*2?979E;G1S.PI);F1E>#H@ M=C(N-"]F<R]P<F]C+W!R;V-?;6ES8RYC"F1I9F8@+74@=C(N-"]F<R]P<F]C M+W!R;V-?;6ES8RYC.C$N,2XQ+C$@=C(N-"]F<R]P<F]C+W!R;V-?;6ES8RYC M.C$N,2XQ+C$N-"XQ"BTM+2!V,BXT+V9S+W!R;V,O<')O8U]M:7-C+F,Z,2XQ M+C$N,0E3=6X@2F%N(#$S(#$U.C4P.C(P(#(P,#(**RLK('8R+C0O9G,O<')O M8R]P<F]C7VUI<V,N8PE-;VX@1F5B(#(U(#(R.C4S.C$P(#(P,#(*0$ @+3,V M+#$R("LS-BPQ,B! 0 H@(VEN8VQU9&4@/&QI;G5X+VEN:70N:#X*("-I;F-L M=61E(#QL:6YU>"]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<VTO=6%C8V5S<RYH/@H@(VEN8VQU9&4@/&%S;2]P9W1A8FQE+F@^"B C M:6YC;'5D92 \87-M+VEO+F@^"B *+0H@(V1E9FEN92!,3T%$7TE.5"AX*2 H M*'@I(#X^($932$E&5"D*("-D969I;F4@3$]!1%]&4D%#*'@I($Q/041?24Y4 M*"@H>"D@)B H1DE8141?,2TQ*2D@*B Q,# I"B O*@I 0" M,C,T+#<@*S(S M-"PR,R! 0 H@"7)E;&5A<V4Z"7-E<5]R96QE87-E+ H@?3L*("-E;F1I9@HM M"BMS=&%T:6,@:6YT('-H;W=?9&ES:U]S=&%T*&-H87(@*B!P86=E+"!I;G0@ M;&5N+"!S=')U8W0@9&ES:U]S=&%T("H@9',L"BL)"0D)"6EN="!M86IO<BP@ M:6YT(&1I<VLI"BM["BL):6YT(&%C=&EV92 ](&1S+3YD:U]D<FEV95]R:6\@ M*R!D<RT^9&M?9')I=F5?=VEO("L**PD)(&1S+3YD:U]D<FEV95]R8FQK("L@ M9',M/F1K7V1R:79E7W=B;&L["BL):68@*&%C=&EV92D**PD);&5N("L]('-P M<FEN=&8H<&%G92 K(&QE;BP**PD)"2(H)74L)74I.B@E=2PE=2PE=2PE=2PE M=2D@(BP**PD)"6UA:F]R+"!D:7-K+ HK"0D)9',M/F1K7V1R:79E7W)I;R K M(&1S+3YD:U]D<FEV95]W:6\L"BL)"0ED<RT^9&M?9')I=F5?<FEO+ HK"0D) M9',M/F1K7V1R:79E7W)B;&LL"BL)"0ED<RT^9&M?9')I=F5?=VEO+ HK"0D) M9',M/F1K7V1R:79E7W=B;&L**PD)*3L**PER971U<FX@;&5N.PHK?0H@<W1A M=&EC(&EN="!K<W1A=%]R96%D7W!R;V,H8VAA<B J<&%G92P@8VAA<B J*G-T M87)T+"!O9F9?="!O9F8L"B )"0D)(&EN="!C;W5N="P@:6YT("IE;V8L('9O M:60@*F1A=&$I"B!["D! ("TR.#0L,C$@*S,P,"PS,"! 0 H@"B );&5N("L] M('-P<FEN=&8H<&%G92 K(&QE;BP@(EQN9&ES:U]I;SH@(BD["B *+0EF;W(@ M*&UA:F]R(#T@,#L@;6%J;W(@/"!$2U]-05A?34%*3U([(&UA:F]R*RLI('L* M+0D)9F]R("AD:7-K(#T@,#L@9&ES:R \($1+7TU!6%]$25-+.R!D:7-K*RLI M('L*+0D)"6EN="!A8W1I=F4@/2!K<W1A="YD:U]D<FEV95MM86IO<EU;9&ES M:UT@*PHM"0D)"6MS=&%T+F1K7V1R:79E7W)B;&M;;6%J;W)=6V1I<VM=("L* M+0D)"0EK<W1A="YD:U]D<FEV95]W8FQK6VUA:F]R75MD:7-K73L*+0D)"6EF M("AA8W1I=F4I"BT)"0D);&5N("L]('-P<FEN=&8H<&%G92 K(&QE;BP*+0D) M"0D)(B@E=2PE=2DZ*"5U+"5U+"5U+"5U+"5U*2 B+ HM"0D)"0EM86IO<BP@ M9&ES:RP*+0D)"0D):W-T870N9&M?9')I=F5;;6%J;W)=6V1I<VM=+ HM"0D) M"0EK<W1A="YD:U]D<FEV95]R:6];;6%J;W)=6V1I<VM=+ HM"0D)"0EK<W1A M="YD:U]D<FEV95]R8FQK6VUA:F]R75MD:7-K72P*+0D)"0D):W-T870N9&M? M9')I=F5?=VEO6VUA:F]R75MD:7-K72P*+0D)"0D):W-T870N9&M?9')I=F5? M=V)L:UMM86IO<EU;9&ES:UT*+0D)"2D["BL)9F]R("AM86IO<B ](# [(&UA M:F]R(#P@34%87T),2T1%5CL@;6%J;W(K*RD@>PHK"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?<W1A M=#L**PD)"6EF("AD<RD**PD)"0EL96X@/2!S:&]W7V1I<VM?<W1A="AP86=E M+"!L96XL(&1S+"!M86IO<BP@,"D["BL)"7UE;'-E('L**PD)"7)E<75E<W1? M<75E=65?=" J('$["BL)"0ES=')U8W0@9V5N9&ES:R J(&AD(#T@9V5T7V=E M;F1I<VLH34M$158H;6%J;W(L,"DI.PHK"0D):6YT(&UA>%]D:7-K.PHK"0D) M:68@*"%H9"D**PD)"0EC;VYT:6YU93L**PD)"6UA>%]D:7-K(#T@34E.3U)- M05-+/CYH9"T^;6EN;W)?<VAI9G0["BL**PD)"69O<B H9&ES:R ](# [(&1I M<VL@/#T@;6%X7V1I<VL[(&1I<VLK*RD@>PHK"0D)"7$@/2!B;&M?9V5T7W%U M975E*$U+1$56*&UA:F]R+&1I<VL\/&AD+3YM:6YO<E]S:&EF="DI.PHK"0D) M"6EF("@A<2D@"BL)"0D)"6-O;G1I;G5E.PHK"0D)"61S(#T@<2T^9&M?<W1A M=#L**PD)"0EI9B H(61S*0HK"0D)"0EC;VYT:6YU93L**PD)"0EL96X@/2!S M:&]W7V1I<VM?<W1A="AP86=E+"!L96XL(&1S+"!M86IO<BQD:7-K*3L**PD) M"7T*( D)?0H@"7T*( I);F1E>#H@=C(N-"]I;F-L=61E+VQI;G5X+V)L:V1E M=BYH"F1I9F8@+74@=C(N-"]I;F-L=61E+VQI;G5X+V)L:V1E=BYH.C$N,2XQ M+C$@=C(N-"]I;F-L=61E+VQI;G5X+V)L:V1E=BYH.C$N,2XQ+C$N-"XQ"BTM M+2!V,BXT+VEN8VQU9&4O;&EN=7@O8FQK9&5V+F@Z,2XQ+C$N,0E3=6X@2F%N M(#$S(#$U.C4P.C(T(#(P,#(**RLK('8R+C0O:6YC;'5D92]L:6YU>"]B;&MD M978N: E-;VX@1F5B(#(U(#(R.C4S.C$P(#(P,#(*0$ @+3<Q+#8@*S<Q+#$S M($! "B )<W1R=6-T(&QI<W1?:&5A9"!F<F5E.PH@?3L*( HK<W1R=6-T(&1I M<VM?<W1A='L**PEU;G-I9VYE9"!I;G0@9&M?9')I=F5?<FEO.PHK"75N<VEG M;F5D(&EN="!D:U]D<FEV95]W:6\["BL)=6YS:6=N960@:6YT(&1K7V1R:79E M7W)B;&L["BL)=6YS:6=N960@:6YT(&1K7V1R:79E7W=B;&L["BM].PHK"B!S M=')U8W0@<F5Q=65S=%]Q=65U90H@>PH@"2\J"D! ("TQ,C(L-B K,3(Y+#$P M($! "B )("H@5&%S:W,@=V%I="!H97)E(&9O<B!F<F5E(')E<75E<W0*( D@ M*B\*( EW86ET7W%U975E7VAE861?= EW86ET7V9O<E]R97%U97-T.PHK"2\J M"BL)("H@<W1A=&ES=&EC<PHK"2 J+PHK"7-T<G5C="!D:7-K7W-T870@*B!D M:U]S=&%T.PH@?3L*( H@<W1R=6-T(&)L:U]D979?<W1R=6-T('L*0$ @+3$X M-BPW("LQ.3<L-R! 0 H@(V1E9FEN92!B;&MD979?;F5X=%]R97%U97-T*')E M<2D@8FQK9&5V7V5N=')Y7W1O7W)E<75E<W0H*')E<2DM/G%U975E+FYE>'0I M"B C9&5F:6YE(&)L:V1E=E]P<F5V7W)E<75E<W0H<F5Q*2!B;&MD979?96YT M<GE?=&]?<F5Q=65S="@H<F5Q*2T^<75E=64N<')E=BD*( HM97AT97)N('9O M:60@9')I=F5?<W1A=%]A8V-T("AK9&5V7W0@9&5V+"!I;G0@<G<L"BME>'1E M<FX@=F]I9"!D<FEV95]S=&%T7V%C8W0@*'-T<G5C="!D:7-K7W-T870@*BP@ M:6YT(')W+ H@"0D)"0EU;G-I9VYE9"!L;VYG(&YR7W-E8W1O<G,L(&EN="!N M97=?:6\I.PH@"B!S=&%T:6,@:6YL:6YE(&EN="!G971?:&%R9'-E8W1?<VEZ M92AK9&5V7W0@9&5V*0I);F1E>#H@=C(N-"]I;F-L=61E+VQI;G5X+VME<FYE M;%]S=&%T+F@*9&EF9B M=2!V,BXT+VEN8VQU9&4O;&EN=7@O:V5R;F5L7W-T M870N:#HQ+C$N,2XQ('8R+C0O:6YC;'5D92]L:6YU>"]K97)N96Q?<W1A="YH M.C$N,2XQ+C$N-"XQ"BTM+2!V,BXT+VEN8VQU9&4O;&EN=7@O:V5R;F5L7W-T M870N:#HQ+C$N,2XQ"5-U;B!*86X@,3,@,34Z-3 Z,C0@,C P,@HK*RL@=C(N M-"]I;F-L=61E+VQI;G5X+VME<FYE;%]S=&%T+F@)36]N($9E8B R-2 R,CHU M,SHQ," R,# R"D! ("TQ.2PQ,2 K,3DL-B! 0 H@"75N<VEG;F5D(&EN="!P M97)?8W!U7W5S97);3E)?0U!54UTL"B )(" @(" @(" @(" @('!E<E]C<'5? M;FEC95M.4E]#4%5372P*( D@(" @(" @(" @(" @<&5R7V-P=5]S>7-T96U; M3E)?0U!54UT["BT)=6YS:6=N960@:6YT(&1K7V1R:79E6T1+7TU!6%]-04I/ M4EU;1$M?34%87T1)4TM=.PHM"75N<VEG;F5D(&EN="!D:U]D<FEV95]R:6]; M1$M?34%87TU!2D]275M$2U]-05A?1$E32UT["BT)=6YS:6=N960@:6YT(&1K M7V1R:79E7W=I;UM$2U]-05A?34%*3U)=6T1+7TU!6%]$25-+73L*+0EU;G-I M9VYE9"!I;G0@9&M?9')I=F5?<F)L:UM$2U]-05A?34%*3U)=6T1+7TU!6%]$ M25-+73L*+0EU;G-I9VYE9"!I;G0@9&M?9')I=F5?=V)L:UM$2U]-05A?34%* M3U)=6T1+7TU!6%]$25-+73L*( EU;G-I9VYE9"!I;G0@<&=P9VEN+"!P9W!G M;W5T.PH@"75N<VEG;F5D(&EN="!P<W=P:6XL('!S=W!O=70["B C:68@(61E 89FEN960H0T].1DE'7T%20TA?4S,Y,"D* ` end ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] Rework of /proc/stat 2002-03-06 17:43 [PATCH] Rework of /proc/stat Jean-Eric Cuendet 2002-03-06 20:08 ` James Stevenson @ 2002-03-06 22:42 ` Alan Cox 2002-03-07 1:13 ` mingming cao ` (2 more replies) 1 sibling, 3 replies; 20+ messages in thread From: Alan Cox @ 2002-03-06 22:42 UTC (permalink / raw) To: Jean-Eric Cuendet; +Cc: Jean-Eric Cuendet, linux-kernel > 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. Any reason for preferring this over the sard patches in -ac ? ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] Rework of /proc/stat 2002-03-06 22:42 ` Alan Cox @ 2002-03-07 1:13 ` mingming cao 2002-03-07 11:16 ` Jean-Eric Cuendet ` (2 more replies) 2002-03-07 11:11 ` Jean-Eric Cuendet 2002-03-07 11:40 ` Jean-Eric Cuendet 2 siblings, 3 replies; 20+ messages in thread From: mingming cao @ 2002-03-07 1:13 UTC (permalink / raw) To: Alan Cox; +Cc: Jean-Eric Cuendet, linux-kernel Alan Cox wrote: >>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. >> > > Any reason for preferring this over the sard patches in -ac ? > Basically, statistic data are moved from the global kstat structure to the request_queue structures, and it is allocated/freed when the request queue is initialized and freed. This way it is 1)self-controlled; 2)avoid the lookup step before the accounting, so it should be faster; 3)statistics implementation is not affected by the major/minor numbers; 4)able to gathering statistics for all disks while keep the memory needs minimized. ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] Rework of /proc/stat 2002-03-07 1:13 ` mingming cao @ 2002-03-07 11:16 ` Jean-Eric Cuendet 2002-03-07 11:48 ` Christoph Hellwig 2002-03-07 13:50 ` Alan Cox 2 siblings, 0 replies; 20+ messages in thread From: Jean-Eric Cuendet @ 2002-03-07 11:16 UTC (permalink / raw) To: mingming cao; +Cc: linux-kernel > Basically, statistic data are moved from the global kstat structure to > the request_queue structures, and it is allocated/freed when the > request queue is initialized and freed. This way it is > Why do you dynamically allocate the stat structure? Wouldn't it be better static in the request struct? You don't win anything with that since is you create the queue, it's to be accessed, so the struct will be allocated ASAP. No? -- Jean-Eric Cuendet Linkvest SA Av des Baumettes 19, 1020 Renens Switzerland Tel +41 21 632 9043 Fax +41 21 632 9090 E-mail: jean-eric.cuendet@linkvest.com http://www.linkvest.com -------------------------------------------------------- ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] Rework of /proc/stat 2002-03-07 1:13 ` mingming cao 2002-03-07 11:16 ` Jean-Eric Cuendet @ 2002-03-07 11:48 ` Christoph Hellwig 2002-03-07 13:50 ` Alan Cox 2 siblings, 0 replies; 20+ messages in thread From: Christoph Hellwig @ 2002-03-07 11:48 UTC (permalink / raw) To: mingming cao; +Cc: Jean-Eric Cuendet, linux-kernel, Alan Cox In article <3C86BEB0.4090203@us.ibm.com> you wrote: >> Any reason for preferring this over the sard patches in -ac ? >> > Basically, statistic data are moved from the global kstat structure Why do you think sard uses kstat? > to > the request_queue structures, and it is allocated/freed when the request > queue is initialized and freed. This way it is > 1)self-controlled; > 2)avoid the lookup step before the accounting, so it should be faster; in 2.4.18+ get_gendisk is O(1) - the lookup is not costly at all. > 3)statistics implementation is not affected by the major/minor numbers; Gendisks currently are per-major, which is a disadvantage, but the sard code itself is not affected by that. > 4)able to gathering statistics for all disks while keep the memory needs > minimized. The same is true for sard. Somehow I think you haven't actually looked at the sard code in -ac.. ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] Rework of /proc/stat 2002-03-07 1:13 ` mingming cao 2002-03-07 11:16 ` Jean-Eric Cuendet 2002-03-07 11:48 ` Christoph Hellwig @ 2002-03-07 13:50 ` Alan Cox 2002-03-07 13:53 ` Jean-Eric Cuendet 2 siblings, 1 reply; 20+ messages in thread From: Alan Cox @ 2002-03-07 13:50 UTC (permalink / raw) To: mingming cao; +Cc: Alan Cox, Jean-Eric Cuendet, linux-kernel > > Any reason for preferring this over the sard patches in -ac ? > > Basically, statistic data are moved from the global kstat structure to > the request_queue structures, and it is allocated/freed when the request > queue is initialized and freed. This way it is So does sard ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] Rework of /proc/stat 2002-03-07 13:50 ` Alan Cox @ 2002-03-07 13:53 ` Jean-Eric Cuendet 2002-03-07 14:17 ` Alan Cox 0 siblings, 1 reply; 20+ messages in thread From: Jean-Eric Cuendet @ 2002-03-07 13:53 UTC (permalink / raw) To: linux-kernel So, what could be said is that the sard (which IS in 2.4.19-per1-ac2) has features: - all devices available (not only major < 16) - stat struct is in the request_queue, not in kstat anymore - All structs are dynamic, no static allocation of per-device structs. So, it's all we need. The only drawback is: - infos are in /proc/partitions not in /proc/stat (some apps get infos there...) Right? -jec PS: When will it be in official tree? An idea? Alan Cox wrote: >>>Any reason for preferring this over the sard patches in -ac ? >>> >>Basically, statistic data are moved from the global kstat structure to >>the request_queue structures, and it is allocated/freed when the request >>queue is initialized and freed. This way it is >> > >So does sard > -- Jean-Eric Cuendet Linkvest SA Av des Baumettes 19, 1020 Renens Switzerland Tel +41 21 632 9043 Fax +41 21 632 9090 E-mail: jean-eric.cuendet@linkvest.com http://www.linkvest.com -------------------------------------------------------- ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] Rework of /proc/stat 2002-03-07 13:53 ` Jean-Eric Cuendet @ 2002-03-07 14:17 ` Alan Cox 0 siblings, 0 replies; 20+ messages in thread From: Alan Cox @ 2002-03-07 14:17 UTC (permalink / raw) To: Jean-Eric Cuendet; +Cc: linux-kernel > The only drawback is: > - infos are in /proc/partitions not in /proc/stat (some apps get infos > there...) > Right? Yes - proc/stat doesn't have the fields to provide enough (and per partition) info. > PS: When will it be in official tree? An idea? I hope to feed it to Marcelo for 2.4.19 ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] Rework of /proc/stat 2002-03-06 22:42 ` Alan Cox 2002-03-07 1:13 ` mingming cao @ 2002-03-07 11:11 ` Jean-Eric Cuendet 2002-03-07 11:48 ` Arjan van de Ven 2002-03-07 12:48 ` Alan Cox 2002-03-07 11:40 ` Jean-Eric Cuendet 2 siblings, 2 replies; 20+ messages in thread From: Jean-Eric Cuendet @ 2002-03-07 11:11 UTC (permalink / raw) To: linux-kernel Alan Cox wrote: > >Any reason for preferring this over the sard patches in -ac ? > What does the sard patches? What I need is to be able to get IO stats to pass them (through a home made script) to SNMP which have no IO stats available. Is it possible to get SARD values through /proc ? Or at least in a simple shell script? Thanks -jec -- Jean-Eric Cuendet Linkvest SA Av des Baumettes 19, 1020 Renens Switzerland Tel +41 21 632 9043 Fax +41 21 632 9090 E-mail: jean-eric.cuendet@linkvest.com http://www.linkvest.com -------------------------------------------------------- ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] Rework of /proc/stat 2002-03-07 11:11 ` Jean-Eric Cuendet @ 2002-03-07 11:48 ` Arjan van de Ven 2002-03-07 12:48 ` Alan Cox 1 sibling, 0 replies; 20+ messages in thread From: Arjan van de Ven @ 2002-03-07 11:48 UTC (permalink / raw) To: Jean-Eric Cuendet; +Cc: linux-kernel Jean-Eric Cuendet wrote: > > Alan Cox wrote: > > > > >Any reason for preferring this over the sard patches in -ac ? > > > What does the sard patches? > What I need is to be able to get IO stats to pass them (through a home > made script) to SNMP which have no IO stats available. > Is it possible to get SARD values through /proc ? Or at least in a > simple shell script? yes. man iostat ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] Rework of /proc/stat 2002-03-07 11:11 ` Jean-Eric Cuendet 2002-03-07 11:48 ` Arjan van de Ven @ 2002-03-07 12:48 ` Alan Cox 1 sibling, 0 replies; 20+ messages in thread From: Alan Cox @ 2002-03-07 12:48 UTC (permalink / raw) To: Jean-Eric Cuendet; +Cc: linux-kernel > What does the sard patches? They collect I/O data > What I need is to be able to get IO stats to pass them (through a home > made script) to SNMP which have no IO stats available. > Is it possible to get SARD values through /proc ? Or at least in a > simple shell script? Yes - it puts it in /proc/partitions ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] Rework of /proc/stat 2002-03-06 22:42 ` Alan Cox 2002-03-07 1:13 ` mingming cao 2002-03-07 11:11 ` Jean-Eric Cuendet @ 2002-03-07 11:40 ` Jean-Eric Cuendet 2002-03-07 12:51 ` Alan Cox 2 siblings, 1 reply; 20+ messages in thread From: Jean-Eric Cuendet @ 2002-03-07 11:40 UTC (permalink / raw) To: linux-kernel > > >Any reason for preferring this over the sard patches in -ac ? > I just compiled 2.4.18-ac2 but there is nothing new in /proc/stat nor in /proc/partitions... Where is this stuff? -- Jean-Eric Cuendet Linkvest SA Av des Baumettes 19, 1020 Renens Switzerland Tel +41 21 632 9043 Fax +41 21 632 9090 E-mail: jean-eric.cuendet@linkvest.com http://www.linkvest.com -------------------------------------------------------- ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] Rework of /proc/stat 2002-03-07 11:40 ` Jean-Eric Cuendet @ 2002-03-07 12:51 ` Alan Cox 0 siblings, 0 replies; 20+ messages in thread From: Alan Cox @ 2002-03-07 12:51 UTC (permalink / raw) To: Jean-Eric Cuendet; +Cc: linux-kernel > I just compiled 2.4.18-ac2 but there is nothing new in /proc/stat nor in > /proc/partitions... > Where is this stuff? Any Red Hat or similar kernel since 2.4.9 or so 2.4.19pre2-ac1 or later with a merge of a somewhat cleaner patch where Christoph Hellwig uses the get/put stuff to tidy it up major minor #blocks name rio rmerge rsect ruse wio wmerge wsect wuse running use aveq 3 0 5004720 hda 2619 4862 59722 50020 1390 2051 27568 66420 -1 125780 42915852 3 1 718168 hda1 4 12 32 60 0 0 0 0 0 60 60 3 2 4021920 hda2 2612 4847 59666 49890 1390 2051 27568 66420 0 43890 116310 3 3 264600 hda3 2 0 16 30 0 0 0 0 0 30 30 [Patch sent off list] ^ permalink raw reply [flat|nested] 20+ messages in thread
[parent not found: <E16lBe4-0006ly-00@the-village.bc.nu>]
* Re: [PATCH] Rework of /proc/stat [not found] <E16lBe4-0006ly-00@the-village.bc.nu> @ 2002-03-13 16:41 ` Jean-Eric Cuendet 0 siblings, 0 replies; 20+ messages in thread From: Jean-Eric Cuendet @ 2002-03-13 16:41 UTC (permalink / raw) To: linux-kernel Alan Cox wrote: >Normal for md (/proc/mdstat). Interesting question whether they should be >there - see what Ingo thinks > Ingo? What do you think? When I cat /proc/partitions, all partitions are there with IO stats but MD or LVM have no IO stats. Shouldn't it be there? -- Jean-Eric Cuendet Linkvest SA Av des Baumettes 19, 1020 Renens Switzerland Tel +41 21 632 9043 Fax +41 21 632 9090 E-mail: jean-eric.cuendet@linkvest.com http://www.linkvest.com -------------------------------------------------------- ^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH] Rework of /proc/stat
@ 2002-03-06 17:16 Jean-Eric Cuendet
2002-03-06 17:25 ` Russell King
` (2 more replies)
0 siblings, 3 replies; 20+ messages in thread
From: Jean-Eric Cuendet @ 2002-03-06 17:16 UTC (permalink / raw)
To: Jean-Eric Cuendet, linux-kernel
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.
Could someone test it, please?
Feedback welcome.
Bye
-jec
--- /tmp/linux-2.4.18-vanilla/include/linux/kernel_stat.h Thu Nov 22 20:46:19 2001
+++ /toc/linux-2.4.18-reempt/include/linux/kernel_stat.h Wed Mar 6 18:02:57 2002
@@ -12,18 +12,37 @@
* used by rstatd/perfmeter
*/
-#define DK_MAX_MAJOR 16
-#define DK_MAX_DISK 16
+#define DK_MAX_DEVICES 64
+#define DK_BUCKETS 256
+
+
+struct _kstat_block_io
+{
+ struct _kstat_block_io* next;
+
+
unsigned int major;
+ unsigned int minor;
+
+
unsigned int io;
+ unsigned int rio;
+ unsigned int wio;
+ unsigned int rblk;
+ unsigned int wblk;
+};
+typedef struct _kstat_block_io kstat_block_io;
+
+
+/* static array of IO stats */
+extern unsigned int kstat_devices_current_index;
+extern kstat_block_io kstat_devices_array[DK_MAX_DEVICES];
+
+
struct kernel_stat {
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];
+ kstat_block_io* io_stat_tbl[DK_BUCKETS];
unsigned int pgpgin, pgpgout;
unsigned int pswpin, pswpout;
#if !defined(CONFIG_ARCH_S390)
@@ -37,6 +56,103 @@
extern struct kernel_stat kstat;
+
+
+/* Size of the table */
+extern const unsigned int kstat_block_io_tbl_size;
+
+/* hash function */
+static inline unsigned kstat_block_io_hash(unsigned int major, unsigned
int minor)
+{
+ return major * 1999 ^ minor;
+}
+
+
+/* add an IO stat */
+static inline kstat_block_io* kstat_block_io_add(unsigned int major,
unsigned int minor)
+{
+ unsigned int i;
+
kstat_block_io* p;
+ kstat_block_io* pstat;
+
+
if (kstat_devices_current_index >= DK_MAX_DEVICES)
+
{
+
printk("ERROR: kstat: No more slot for device IO stats. Try
extending DK_MAX_DEVICES\n");
+
return 0;
+
}
+
+ pstat = &kstat_devices_array[kstat_devices_current_index];
+
kstat_devices_current_index++;
+ pstat->next = 0;
+ pstat->major = major;
+ pstat->minor = minor;
+ pstat->io = 0;
+ pstat->rio = 0;
+ pstat->wio = 0;
+ pstat->rblk = 0;
+ pstat->wblk = 0;
+
+ i = kstat_block_io_hash(major, minor) % kstat_block_io_tbl_size;
+ p = kstat.io_stat_tbl[i];
+
if (p == 0)
+
{
+
kstat.io_stat_tbl[i] = pstat;
+
}
+
else
+
{
+
printk("WARNING: kstat: Collision found in IO stat accounting table
(add). Try extending DK_BUCKETS\n");
+ while (p->next != 0)
+
{
+ p = p->next;
+
}
+
p->next = pstat;
+
}
+
return pstat;
+}
+
+/* lookup an IO stat */
+static inline kstat_block_io* kstat_block_io_lookup(unsigned major,
unsigned minor)
+{
+
unsigned int i = kstat_block_io_hash(major, minor) %
kstat_block_io_tbl_size;
+
kstat_block_io* p = kstat.io_stat_tbl[i];
+
while (p && p->major != major && p->minor != minor)
+
{
+
printk("WARNING: kstat: Collision found in IO stat accounting table
(lookup). Try extending DK_BUCKETS\n");
+
p = p->next;
+
}
+
if (p == 0)
+
{
+
p = kstat_block_io_add(major, minor);
+
if (p == 0)
+
{
+
return 0;
+
}
+
}
+
return p;
+}
+
+/* This is used by MD to see if IDLE */
+static inline unsigned long kstat_get_rwblk(unsigned int major,
unsigned int minor)
+{
+ kstat_block_io* stat = kstat_block_io_lookup(major, minor);
+ if (stat == 0)
+
{
+
printk("ERROR: kstat: No IO stat found for (%d/%d)\n", major, minor);
+ return 0;
+
}
+ return stat->rblk + stat->wblk;
+}
+
+
+
+
+
+
+
+
+
+
+
#if !defined(CONFIG_ARCH_S390)
/*
* Number of interrupts per specific IRQ source, since bootup
--- /tmp/linux-2.4.18-vanilla/drivers/md/md.c Mon Feb 25 20:37:58 2002
+++ /toc/linux-2.4.18-reempt/drivers/md/md.c Wed Mar 6 16:46:56 2002
@@ -3284,6 +3284,9 @@
return NULL;
}
+/* MD devices are major=9 and minor=1-31 */
+#define DK_MAX_MAJOR 16
+#define DK_MAX_DISK 32
static unsigned int sync_io[DK_MAX_MAJOR][DK_MAX_DISK];
void md_sync_acct(kdev_t dev, unsigned long nr_sectors)
{
@@ -3305,15 +3308,12 @@
unsigned long curr_events;
idle = 1;
-
ITERATE_RDEV(mddev,rdev,tmp) {
+
ITERATE_RDEV(mddev,rdev,tmp)
+
{
int major = MAJOR(rdev->dev);
int idx = disk_index(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] ;
+ curr_events = kstat_get_rwblk(major, idx);
curr_events -= sync_io[major][idx];
if ((curr_events - rdev->last_events) > 32) {
rdev->last_events = curr_events;
--- /tmp/linux-2.4.18-vanilla/drivers/block/ll_rw_blk.c Mon Feb 25 20:37:57 2002
+++ /toc/linux-2.4.18-reempt/drivers/block/ll_rw_blk.c Wed Mar 6 18:12:03 2002
@@ -501,19 +501,22 @@
unsigned long nr_sectors, int new_io)
{
unsigned int major = MAJOR(dev);
-
unsigned int index;
+
unsigned int minor = MINOR(dev);
+ kstat_block_io* stat = kstat_block_io_lookup(major, minor);
-
index = disk_index(dev);
-
if ((index >= DK_MAX_DISK) || (major >= DK_MAX_MAJOR))
-
return;
+ if (stat == 0)
+ {
+
printk("ERROR: kstat: Haven't found an IO stat struct for major=%d
/ minor=%d\n", major, minor);
+ return;
+
}
-
kstat.dk_drive[major][index] += new_io;
+
stat->io += new_io;
if (rw == READ) {
-
kstat.dk_drive_rio[major][index] += new_io;
-
kstat.dk_drive_rblk[major][index] += nr_sectors;
+
stat->rio += new_io;
+
stat->rblk += nr_sectors;
} else if (rw == WRITE) {
-
kstat.dk_drive_wio[major][index] += new_io;
-
kstat.dk_drive_wblk[major][index] += nr_sectors;
+
stat->wio += new_io;
+
stat->wblk += nr_sectors;
} else
printk(KERN_ERR "drive_stat_acct: cmd not R/W?\n");
}
--- /tmp/linux-2.4.18-vanilla/fs/proc/proc_misc.c Wed Nov 21 06:29:09 2001
+++ /toc/linux-2.4.18-reempt/fs/proc/proc_misc.c Wed Mar 6 17:41:28 2002
@@ -282,25 +282,19 @@
len += sprintf(page + len, " %u", kstat_irqs(i));
#endif
-
len += sprintf(page + len, "\ndisk_io: ");
+ 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 (i = 0; i < kstat_devices_current_index; i++)
+ {
+ kstat_block_io* stat = &kstat_devices_array[i];
+ len += sprintf( page + len, "(%u,%u):(%u,%u,%u,%u,%u) ",
+ stat->major, stat->minor,
+ stat->io,
+ stat->rio,
+ stat->wio,
+ stat->rblk,
+ stat->wblk );
+ }
len += sprintf(page + len,
"\nctxt %u\n"
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH] Rework of /proc/stat 2002-03-06 17:16 Jean-Eric Cuendet @ 2002-03-06 17:25 ` Russell King 2002-03-06 19:48 ` Dominik Kubla 2002-03-07 1:07 ` mingming cao 2 siblings, 0 replies; 20+ messages in thread From: Russell King @ 2002-03-06 17:25 UTC (permalink / raw) To: Jean-Eric Cuendet; +Cc: linux-kernel On Wed, Mar 06, 2002 at 06:16:55PM +0100, Jean-Eric Cuendet wrote: > 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. > Could someone test it, please? > Feedback welcome. Your mailer was hungry and ate the patch (small examples): > + > + > unsigned int major; > + unsigned int minor; > + > + > unsigned int io; > + unsigned int rio; > + unsigned int wio; ... > + > if (p == 0) > + > { > + > kstat.io_stat_tbl[i] = pstat; > + > } > + -- Russell King (rmk@arm.linux.org.uk) The developer of ARM Linux http://www.arm.linux.org.uk/personal/aboutme.html ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] Rework of /proc/stat 2002-03-06 17:16 Jean-Eric Cuendet 2002-03-06 17:25 ` Russell King @ 2002-03-06 19:48 ` Dominik Kubla 2002-03-07 11:12 ` Jean-Eric Cuendet 2002-03-07 1:07 ` mingming cao 2 siblings, 1 reply; 20+ messages in thread From: Dominik Kubla @ 2002-03-06 19:48 UTC (permalink / raw) To: Jean-Eric Cuendet; +Cc: linux-kernel On Wed, Mar 06, 2002 at 06:16:55PM +0100, Jean-Eric Cuendet wrote: [...] > 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 (i = 0; i < kstat_devices_current_index; i++) > + { > + kstat_block_io* stat = &kstat_devices_array[i]; > + len += sprintf( page + len, "(%u,%u):(%u,%u,%u,%u,%u) ", > + stat->major, stat->minor, > + stat->io, > + stat->rio, > + stat->wio, > + stat->rblk, > + stat->wblk ); > + } > > len += sprintf(page + len, > > "\nctxt %u\n" You are changing the order of the fields in /proc/stat. That breaks compatibility. Dominik Kubla -- ScioByte GmbH Zum Schiersteiner Grund 2 55127 Mainz (Germany) Phone: +49 700 724 629 83 Fax: +49 700 724 629 84 1024D/717F16BB A384 F5F1 F566 5716 5485 27EF 3B00 C007 717F 16BB ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] Rework of /proc/stat 2002-03-06 19:48 ` Dominik Kubla @ 2002-03-07 11:12 ` Jean-Eric Cuendet 0 siblings, 0 replies; 20+ messages in thread From: Jean-Eric Cuendet @ 2002-03-07 11:12 UTC (permalink / raw) To: Dominik Kubla; +Cc: linux-kernel >>+ len += sprintf( page + len, "(%u,%u):(%u,%u,%u,%u,%u) ", >>+ stat->major, stat->minor, >>+ stat->io, >>+ stat->rio, >>+ stat->wio, >>+ stat->rblk, >>+ stat->wblk ); >>+ } >> >You are changing the order of the fields in /proc/stat. That breaks >compatibility. > Thanks, you are right. I'll change that. -jec ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] Rework of /proc/stat 2002-03-06 17:16 Jean-Eric Cuendet 2002-03-06 17:25 ` Russell King 2002-03-06 19:48 ` Dominik Kubla @ 2002-03-07 1:07 ` mingming cao 2 siblings, 0 replies; 20+ messages in thread From: mingming cao @ 2002-03-07 1:07 UTC (permalink / raw) To: Jean-Eric Cuendet; +Cc: linux-kernel Jean-Eric Cuendet wrote: > > 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. > Could someone test it, please? > Feedback welcome. > Bye > -jec Thank for your attention and help on updating my disk io patch. Here is the link to the original patch http://marc.theaimsgroup.com/?l=linux-kernel&m=100570447604813&w=2. I re-submitted it a while ago against 2.4 kernels and 2.5.2 kernel. You can find patches related to disk io statistics at http://lse.sourceforge.net/resource/diskio/diskio.html ^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2002-03-13 16:41 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-03-06 17:43 [PATCH] Rework of /proc/stat Jean-Eric Cuendet
2002-03-06 20:08 ` James Stevenson
2002-03-06 22:42 ` Alan Cox
2002-03-07 1:13 ` mingming cao
2002-03-07 11:16 ` Jean-Eric Cuendet
2002-03-07 11:48 ` Christoph Hellwig
2002-03-07 13:50 ` Alan Cox
2002-03-07 13:53 ` Jean-Eric Cuendet
2002-03-07 14:17 ` Alan Cox
2002-03-07 11:11 ` Jean-Eric Cuendet
2002-03-07 11:48 ` Arjan van de Ven
2002-03-07 12:48 ` Alan Cox
2002-03-07 11:40 ` Jean-Eric Cuendet
2002-03-07 12:51 ` Alan Cox
[not found] <E16lBe4-0006ly-00@the-village.bc.nu>
2002-03-13 16:41 ` Jean-Eric Cuendet
-- strict thread matches above, loose matches on Subject: below --
2002-03-06 17:16 Jean-Eric Cuendet
2002-03-06 17:25 ` Russell King
2002-03-06 19:48 ` Dominik Kubla
2002-03-07 11:12 ` Jean-Eric Cuendet
2002-03-07 1:07 ` mingming cao
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox