]> granicus.if.org Git - procps-ng/commitdiff
got most of procps-3.1.11ff2.diff
authoralbert <>
Sun, 10 Aug 2003 23:40:41 +0000 (23:40 +0000)
committeralbert <>
Sun, 10 Aug 2003 23:40:41 +0000 (23:40 +0000)
proc/ksym.c
proc/library.map
proc/sysinfo.c
proc/sysinfo.h
procps.spec
vmstat.8
vmstat.c

index dd4d52e12413fdf2f1f35585f7cbc2dce8d960e5..bf1d6358296d26a58d3c12fc2262885ac7feb93f 100644 (file)
@@ -607,6 +607,8 @@ const char * wchan(unsigned KLONG address, unsigned pid) {
 
   /* good_symb->name has the data, but needs to be trimmed */
   ret = good_symb->name;
+  // lame ppc64 has a '.' in front of every name
+  if(*ret=='.') ret++;
   switch(*ret){
     case 's': if(!strncmp(ret, "sys_", 4)) ret += 4;   break;
     case 'd': if(!strncmp(ret, "do_",  3)) ret += 3;   break;
index 557d5ac8dda6d7257e993803c58435e44ed527b4..52ebcc28f0d3d666136c17c3775607589324c7df 100644 (file)
@@ -10,7 +10,7 @@ global:
   Hertz; smp_num_cpus;
   sprint_uptime; uptime; user_from_uid; print_uptime; loadavg;
   pretty_print_signals; print_given_signals; unix_print_signals; signal_name_to_number; signal_number_to_name;
-  meminfo; vminfo; getstat; getdiskstat; getslabinfo; get_pid_digits;
+  meminfo; vminfo; getstat; getdiskstat; getpartitions_num; getslabinfo; get_pid_digits;
   kb_active; kb_inactive; kb_main_buffers; kb_main_cached;
   kb_main_free; kb_main_total; kb_main_used; kb_swap_free;
   kb_swap_total; kb_swap_used; kb_main_shared;
index e2a5b7ac17d4d0320a805ef7c52a7014817f6040..02b58a516cd72c43ce549697a4eba3e4665b41f0 100644 (file)
@@ -671,6 +671,21 @@ static unsigned int getFileLines(const char* szFile){
   return lines;
 }
 
+/////////////////////////////////////////////////////////////////////////////
+
+unsigned int getpartitions_num(struct disk_stat *disks, int ndisks){
+  int i=0;
+  int partitions=0;
+
+  for (i=0;i<ndisks;i++){
+       partitions+=disks[i].partitions;
+  }
+  return partitions;
+
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
 unsigned int getdiskstat(struct disk_stat **disks, struct partition_stat **partitions){
   FILE* fd;
   int units,
@@ -711,6 +726,7 @@ unsigned int getdiskstat(struct disk_stat **disks, struct partition_stat **parti
         &(*disks)[cDisk].milli_spent_IO,
         &(*disks)[cDisk].weighted_milli_spent_IO
       );
+        (*disks)[cDisk].partitions=0;
       cDisk++;
     }else{
       (*partitions) = realloc(*partitions, (cPartition+1)*sizeof(struct partition_stat));
@@ -725,6 +741,7 @@ unsigned int getdiskstat(struct disk_stat **disks, struct partition_stat **parti
         &(*partitions)[cPartition].requested_writes
       );
       (*partitions)[cPartition++].parent_disk = &((*disks)[cDisk-1]);
+      (*disks)[cDisk-1].partitions++;  
     }
   }
   fclose(fd);
index e34712b1e2ff56a10aafa945d82c7f206dcc5776..0930bfd294ebf76a4fb78bdc744027f812a34210 100644 (file)
@@ -102,6 +102,7 @@ typedef struct disk_stat{
        unsigned           inprogress_IO;
        unsigned           milli_spent_IO;
        unsigned           weighted_milli_spent_IO;
+       unsigned           partitions;
 }disk_stat;
 
 typedef struct partition_stat{
@@ -115,6 +116,7 @@ typedef struct partition_stat{
        unsigned           requested_writes;
 }partition_stat;
 
+extern unsigned int getpartitions_num(struct disk_stat *disks, int ndisks);
 extern unsigned int getdiskstat (struct disk_stat**,struct partition_stat**);
 
 typedef struct slab_cache{
index 57cc7078ed3d8a17e5b80b157dbeb6b2e2675202..ce9cf431640239018e3d476bdaf7e634fc46934b 100644 (file)
@@ -26,7 +26,7 @@ make SKIP="/bin/kill /usr/share/man/man1/kill.1" CC="gcc $RPM_OPT_FLAGS" LDFLAGS
 
 %install
 rm -rf $RPM_BUILD_ROOT
-make SKIP="/bin/kill /usr/share/man/man1/kill.1" DESTDIR=$RPM_BUILD_ROOT ldconfig=echo install="install -D" install
+make SKIP="/bin/kill /usr/share/man/man1/kill.1" DESTDIR=$RPM_BUILD_ROOT ldconfig=echo install="install -D" lib="$RPM_BUILD_ROOT/%{_lib}" install
 
 %clean
 rm -rf $RPM_BUILD_ROOT
index 7a7c27373c8ff27ed36e9512eccd7d3f7092ac4e..65ff7c1aaec2c827f49e198e3829964b659e1624 100644 (file)
--- a/vmstat.8
+++ b/vmstat.8
@@ -22,6 +22,9 @@ vmstat \- Report virtual memory statistics
 .RB [ "\-d"]
 .br
 .B vmstat
+.RB [ "\-p disk partition"]
+.br
+.B vmstat
 .RB [ "\-V" ]
 .SH DESCRIPTION
 \fBvmstat\fP reports information about processes, memory, paging,
@@ -57,6 +60,8 @@ defined, \fIcount\fP defaults to infinity.
 .PP
 The \fB-d\fP reports disk statistics (2.5.70 or above required) 
 .PP
+The \fB-p\fP followed by some partition name for detailed statistics (2.5.70 or above required) 
+.PP
 The \fB-S\fP followed by k or K or m or M switches outputs between 1000, 1024, 1000000, or 1048576 bytes 
 .PP
 The \fB-V\fP switch results in displaying version information.
@@ -137,6 +142,15 @@ cur: I/O in progress
 s: seconds spent for I/O
 .fi
 
+.PP
+.SH FIELD DESCRIPTION FOR DISK PARTITION MODE
+.nf
+reads: Total number of reads issued to this partition
+read sectors: Total read sectors for partition
+writes : Total number of writes issued to this partition
+requested writes: Total number of write requests made for partition
+
+.fi
 
 .PP
 .SH FIELD DESCRIPTION FOR SLAB MODE 
@@ -180,4 +194,4 @@ Does not tabulate the block io per device or count the number of system calls.
 .SH AUTHORS
 .nf
 Written by Henry Ware <al172@yfn.ysu.edu>. 
-Diskstat,slab mode and some improvements by Fabian Frederick <fabian.frederick@gmx.fr>
+Fabian Fr\('ed\('erick <ffrederick@users.sourceforge.net> (diskstat, slab, partitions...)
index d7a13c168c6492d009471205b8f47d564918fe5f..4a6ecc785f45f68b9148572464919d8e95138bc4 100644 (file)
--- a/vmstat.c
+++ b/vmstat.c
@@ -1,12 +1,16 @@
 // old: "Copyright 1994 by Henry Ware <al172@yfn.ysu.edu>. Copyleft same year."
 // most code copyright 2002 Albert Cahalan
-// 27/05/2003 (Fabian) : Add unit conversion + interface
+// 
+// 27/05/2003 (Fabian Frederick) : Add unit conversion + interface
 //                      Export proc/stat access to libproc
 //                      Adapt vmstat helpfile
 // 31/05/2003 (Fabian) : Add diskstat support (/libproc)
 // June 2003 (Fabian) : -S <x> -s & -s -S <x> patch
 // June 2003 (Fabian) : -Adding diskstat against 3.1.9, slabinfo
 //                      -patching 'header' in disk & slab
+// July 2003 (Fabian) : -Adding disk partition output
+//                     -Adding disk table
+//                     -Syncing help / usage
 
 #include <stdio.h>
 #include <stdlib.h>
 
 static unsigned long dataUnit=1024;
 static char szDataUnit [16];
-#define UNIT_B 1
-#define UNIT_k 1000
-#define UNIT_K  1024
-#define UNIT_m 1000000
-#define UNIT_M  1048576
-
-#define VMSTAT 0
-#define DISKSTAT 0x00000001
-#define VMSUMSTAT 0x00000002
-#define SLABSTAT 0x00000004
+#define UNIT_B        1
+#define UNIT_k        1000
+#define UNIT_K        1024
+#define UNIT_m        1000000
+#define UNIT_M        1048576
+
+#define VMSTAT        0
+#define DISKSTAT      0x00000001
+#define VMSUMSTAT     0x00000002
+#define SLABSTAT      0x00000004
+#define PARTITIONSTAT 0x00000008
+#define DISKSUMSTAT   0x00000010
 
 static int statMode=VMSTAT;
 
@@ -60,6 +66,9 @@ static void usage(void) {
   fprintf(stderr,"              -n causes the headers not to be reprinted regularly.\n");
   fprintf(stderr,"              -a print inactive/active page stats.\n");
   fprintf(stderr,"              -d prints disk statistics\n");
+  fprintf(stderr,"              -D prints disk table\n");
+  fprintf(stderr,"              -p prints disk partition statistics\n");
+  fprintf(stderr,"              -s prints vm table\n");
   fprintf(stderr,"              -m prints slabinfo\n");
   fprintf(stderr,"              -S unit size\n");
   fprintf(stderr,"              delay is the delay between updates in seconds. \n");
@@ -137,6 +146,8 @@ static int format_1000(unsigned long long val64, char *restrict dst){
 }
 #endif
 
+////////////////////////////////////////////////////////////////////////////
+
 static void new_header(void){
   printf("procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----\n");
   printf(
@@ -161,11 +172,16 @@ static void new_diskheader(void){
 
 ////////////////////////////////////////////////////////////////////////////
 
+static void new_diskpartition_header(const char *partition_name){
+  printf("%-10s %10s %10s %10s %10s\n",partition_name, "reads  ", "read sectors", "writes   ", "requested writes");
+}
+
+////////////////////////////////////////////////////////////////////////////
+
 static void new_slabheader(void){
   printf("%-24s %6s %6s %6s %6s\n","Cache","Num", "Total", "Size", "Pages");
 }
 
-
 ////////////////////////////////////////////////////////////////////////////
 
 static unsigned long unitConvert(unsigned int size){
@@ -274,6 +290,59 @@ static void new_format(void) {
 
 ////////////////////////////////////////////////////////////////////////////
 
+static int new_diskpartition_format(const char* partition_name){
+  FILE *fDiskstat;
+  struct disk_stat *disks;
+  struct partition_stat *partitions, *current_partition=NULL;
+  unsigned long ndisks,i,j,k,npartitions;
+  const char format[]="%20u %10llu %10u %10u\n";
+
+  if ((fDiskstat=fopen("/proc/diskstats", "rb"))){
+    fclose(fDiskstat);
+    ndisks=getdiskstat(&disks,&partitions);
+    npartitions=getpartitions_num(disks, ndisks);
+    for(k=0; k<npartitions; k++){
+       if(!strcmp(partition_name, partitions[k].partition_name)){
+                current_partition=&(partitions[k]); 
+       }       
+    }
+    if(!current_partition){
+         return -1;
+    }
+    new_diskpartition_header(partition_name);
+    printf (format,
+       current_partition->reads,current_partition->reads_sectors,current_partition->writes,current_partition->requested_writes);
+    fflush(stdout);
+    free(disks);
+    free(partitions);
+    for(j=1; j<num_updates; j++){ 
+        if (moreheaders && ((j%height)==0)) new_diskpartition_header(partition_name);
+        sleep(sleep_time);
+        ndisks=getdiskstat(&disks,&partitions);
+        npartitions=getpartitions_num(disks, ndisks);
+       current_partition=NULL;
+        for(k=0; k<npartitions; k++){
+          if(!strcmp(partition_name, partitions[k].partition_name)){
+                  current_partition=&(partitions[k]); 
+          }    
+        }
+        if(!current_partition){
+           return -1;
+        }
+        printf (format,
+        current_partition->reads,current_partition->reads_sectors,current_partition->writes,current_partition->requested_writes);
+        fflush(stdout);
+        free(disks);
+        free(partitions);
+    }
+ }else{
+    fprintf(stderr, "Your kernel doesn't support diskstat (2.5.70 or above required)"); 
+    exit(0);
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////
+
 static void new_diskformat(void){
   FILE *fDiskstat;
   struct disk_stat *disks;
@@ -366,6 +435,57 @@ static void new_slabformat (void){
 
 ////////////////////////////////////////////////////////////////////////////
 
+static void disksum_format(void) {
+
+  FILE *fDiskstat;
+  struct disk_stat *disks;
+  struct partition_stat *partitions;
+  int ndisks, i;
+  unsigned long reads, merged_reads, read_sectors, milli_reading, writes,
+                merged_writes, written_sectors, milli_writing, inprogress_IO,
+                milli_spent_IO, weighted_milli_spent_IO;
+
+  reads=merged_reads=read_sectors=milli_reading=writes=merged_writes= \
+  written_sectors=milli_writing=inprogress_IO=milli_spent_IO= \
+  weighted_milli_spent_IO=0;
+
+  if ((fDiskstat=fopen("/proc/diskstats", "rb"))){
+    fclose(fDiskstat);
+    ndisks=getdiskstat(&disks, &partitions);
+    printf("%13d disks \n", ndisks);
+    printf("%13d partitions \n", getpartitions_num(disks, ndisks));
+
+    for(i=0; i<ndisks; i++){
+         reads+=disks[i].reads;
+         merged_reads+=disks[i].merged_reads;
+         read_sectors+=disks[i].reads_sectors;
+         milli_reading+=disks[i].milli_reading;
+         writes+=disks[i].writes;
+         merged_writes+=disks[i].merged_writes;
+         written_sectors+=disks[i].written_sectors;
+         milli_writing+=disks[i].milli_writing;
+         inprogress_IO+=disks[i].inprogress_IO?disks[i].inprogress_IO/1000:0;
+         milli_spent_IO+=disks[i].milli_spent_IO?disks[i].milli_spent_IO/1000:0;
+      }
+
+    printf("%13lu total reads\n",reads);
+    printf("%13lu merged reads\n",merged_reads);
+    printf("%13lu read sectors\n",read_sectors);
+    printf("%13lu milli reading\n",milli_reading);
+    printf("%13lu writes\n",writes);
+    printf("%13lu merged writes\n",merged_writes);
+    printf("%13lu written sectors\n",written_sectors);
+    printf("%13lu milli writing\n",milli_writing);
+    printf("%13lu inprogress IO\n",inprogress_IO);
+    printf("%13lu milli spent IO\n",milli_spent_IO);
+
+    free(disks);
+    free(partitions);
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////
+
 static void sum_format(void) {
   unsigned int running, blocked, btime, processes;
   jiff cpu_use, cpu_nic, cpu_sys, cpu_idl, cpu_iow;
@@ -437,6 +557,7 @@ static int winhi(void) {
 ////////////////////////////////////////////////////////////////////////////
 
 int main(int argc, char *argv[]) {
+  char partition[16];
   argc=0; /* redefined as number of integer arguments */
   for (argv++;*argv;argv++) {
     if ('-' ==(**argv)) {
@@ -459,10 +580,22 @@ int main(int argc, char *argv[]) {
       case 'm':
         statMode |= SLABSTAT;  
        break;
+      case 'D':
+        statMode |= DISKSUMSTAT;       
+       break;
       case 'n':
        /* print only one header */
        moreheaders=FALSE;
         break;
+      case 'p':
+        statMode |= PARTITIONSTAT;
+       if (argv[1]){
+                  ++argv;
+                  sprintf(partition, "%s", *argv);
+        }else{fprintf(stderr, "-p requires an argument\n");
+               exit(EXIT_FAILURE);
+       }
+        break;
       case 'S':
        if (argv[1]){
              ++argv;
@@ -507,16 +640,21 @@ int main(int argc, char *argv[]) {
   }    
   setlinebuf(stdout);
   switch(statMode){
-       case(VMSTAT):   new_format();
-                       break;
-       case(VMSUMSTAT):sum_format();
-                       break;
-       case(DISKSTAT): new_diskformat();
-                       break;
-       case(SLABSTAT): new_slabformat();
-                       break;
-       default:        usage();
-                       break;
+       case(VMSTAT):        new_format();
+                            break;
+       case(VMSUMSTAT):     sum_format();
+                            break;
+       case(DISKSTAT):      new_diskformat();
+                            break;
+       case(PARTITIONSTAT): if(new_diskpartition_format(partition)==-1)
+                                  printf("Partition was not found\n");
+                            break;     
+       case(SLABSTAT):      new_slabformat();
+                            break;
+       case(DISKSUMSTAT):   disksum_format();  
+                            break;     
+       default:             usage();
+                            break;
   }
   return 0;
 }