make sure ps/top output what they claim: vsz, not rss ... down the line we should...
authorMike Frysinger <vapier@gentoo.org>
Thu, 8 Feb 2007 08:21:58 +0000 (08:21 -0000)
committerMike Frysinger <vapier@gentoo.org>
Thu, 8 Feb 2007 08:21:58 +0000 (08:21 -0000)
TODO
include/libbb.h
libbb/procps.c
procps/ps.c
procps/top.c

diff --git a/TODO b/TODO
index 78f48fc..79cea71 100644 (file)
--- a/TODO
+++ b/TODO
@@ -154,6 +154,10 @@ patch
   And while we're at it, a new patch filename quoting format is apparently
   coming soon:  http://marc.theaimsgroup.com/?l=git&m=112927316408690&w=2
 ---
+ps / top
+  Add support for both RSS and VSIZE rather than just one or the other.
+  Or make it a build option.
+---
 man
   It would be nice to have a man command.  Not one that handles troff or
   anything, just one that can handle preformatted ascii man pages, possibly
index 5b2f625..bb4a687 100644 (file)
@@ -668,7 +668,7 @@ typedef struct {
        DIR *dir;
 /* Fields are set to 0/NULL if failed to determine (or not requested) */
        char *cmd;
-       unsigned long rss;
+       unsigned long vsz;
        unsigned long stime, utime;
        unsigned pid;
        unsigned ppid;
@@ -691,13 +691,13 @@ enum {
        PSSCAN_COMM     = 1 << 5,
        PSSCAN_CMD      = 1 << 6,
        PSSCAN_STATE    = 1 << 7,
-       PSSCAN_RSS      = 1 << 8,
+       PSSCAN_VSZ      = 1 << 8,
        PSSCAN_STIME    = 1 << 9,
        PSSCAN_UTIME    = 1 << 10,
        /* These are all retrieved from proc/NN/stat in one go: */
        PSSCAN_STAT     = PSSCAN_PPID | PSSCAN_PGID | PSSCAN_SID
                        | PSSCAN_COMM | PSSCAN_STATE
-                       | PSSCAN_RSS | PSSCAN_STIME | PSSCAN_UTIME,
+                       | PSSCAN_VSZ | PSSCAN_STIME | PSSCAN_UTIME,
 };
 procps_status_t* alloc_procps_scan(int flags);
 void free_procps_scan(procps_status_t* sp);
index e7635e5..c9dcfde 100644 (file)
@@ -127,7 +127,7 @@ procps_status_t* procps_scan(procps_status_t* sp, int flags)
                 * ("continue" would mean that current /proc/NNN
                 * is not a valid process info) */
 
-               memset(&sp->rss, 0, sizeof(*sp) - offsetof(procps_status_t, rss));
+               memset(&sp->vsz, 0, sizeof(*sp) - offsetof(procps_status_t, vsz));
 
                sp->pid = pid;
                if (!(flags & ~PSSCAN_PID)) break;
@@ -164,17 +164,16 @@ procps_status_t* procps_scan(procps_status_t* sp, int flags)
                                "%*s %*s %*s "         /* cutime, cstime, priority */
                                "%ld "                 /* nice */
                                "%*s %*s %*s "         /* timeout, it_real_value, start_time */
-                               "%*s "                 /* vsize */
-                               "%lu",                 /* rss */
+                               "%lu ",                /* vsize */
                                sp->state, &sp->ppid,
                                &sp->pgid, &sp->sid,
                                &sp->utime, &sp->stime,
                                &tasknice,
-                               &sp->rss);
+                               &sp->vsz);
                        if (n != 8)
                                break;
 
-                       if (sp->rss == 0 && sp->state[0] != 'Z')
+                       if (sp->vsz == 0 && sp->state[0] != 'Z')
                                sp->state[1] = 'W';
                        else
                                sp->state[1] = ' ';
@@ -185,11 +184,7 @@ procps_status_t* procps_scan(procps_status_t* sp, int flags)
                        else
                                sp->state[2] = ' ';
 
-#ifdef PAGE_SHIFT
-                       sp->rss <<= (PAGE_SHIFT - 10);     /* 2**10 = 1kb */
-#else
-                       sp->rss *= (getpagesize() >> 10);     /* 2**10 = 1kb */
-#endif
+                       sp->vsz >>= 10; /* vsize is in bytes and we want kb */
                }
 
                if (flags & PSSCAN_CMD) {
@@ -230,7 +225,6 @@ procps_status_t* procps_scan(procps_status_t* sp, int flags)
                tty_pgrp,
                task->flags,
                min_flt,
-
                cmin_flt,
                maj_flt,
                cmaj_flt,
index f3d11b7..a9da807 100644 (file)
@@ -47,10 +47,10 @@ static void func_pgid(char *buf, int size, const procps_status_t *ps)
        snprintf(buf, size+1, "%*u", size, ps->pgid);
 }
 
-static void func_rss(char *buf, int size, const procps_status_t *ps)
+static void func_vsz(char *buf, int size, const procps_status_t *ps)
 {
        char buf5[5];
-       smart_ulltoa5( ((unsigned long long)ps->rss) << 10, buf5);
+       smart_ulltoa5( ((unsigned long long)ps->vsz) << 10, buf5);
        snprintf(buf, size+1, "%.*s", size, buf5);
 }
 
@@ -103,9 +103,9 @@ static const ps_out_t out_spec[] = {
 //     { "ruser" ,"RUSER"  ,func_ruser ,PSSCAN_UIDGID,sizeof("RUSER"  )-1 },
 //     { "time"  ,"TIME"   ,func_time  ,PSSCAN_      ,sizeof("TIME"   )-1 },
 //     { "tty"   ,"TT"     ,func_tty   ,PSSCAN_      ,sizeof("TT"     )-1 },
-//     { "vsz"   ,"VSZ"    ,func_vsz   ,PSSCAN_VSZ   ,4                   },
+       { "vsz"   ,"VSZ"    ,func_vsz   ,PSSCAN_VSZ   ,4                   },
 // Not mandated by POSIX:
-       { "rss"   ,"RSS"    ,func_rss   ,PSSCAN_RSS   ,4                   },
+//     { "rss"   ,"RSS"    ,func_rss   ,PSSCAN_RSS   ,4                   },
 };
 
 #define VEC_SIZE(v) ( sizeof(v) / sizeof((v)[0]) )
@@ -321,13 +321,13 @@ int ps_main(int argc, char **argv)
        if (use_selinux)
                puts("  PID Context                          Stat Command");
        else
-               puts("  PID  Uid     VmSize Stat Command");
+               puts("  PID  Uid        VSZ Stat Command");
 
        while ((p = procps_scan(p, 0
                        | PSSCAN_PID
                        | PSSCAN_UIDGID
                        | PSSCAN_STATE
-                       | PSSCAN_RSS
+                       | PSSCAN_VSZ
                        | PSSCAN_CMD
        ))) {
                char *namecmd = p->cmd;
@@ -355,12 +355,12 @@ int ps_main(int argc, char **argv)
 #endif
                {
                        const char *user = get_cached_username(p->uid);
-                       if (p->rss == 0)
+                       if (p->vsz == 0)
                                len = printf("%5u %-8s        %s ",
                                        p->pid, user, p->state);
                        else
                                len = printf("%5u %-8s %6ld %s ",
-                                       p->pid, user, p->rss, p->state);
+                                       p->pid, user, p->vsz, p->state);
                }
 
                i = terminal_width-len;
index 2681f97..ee6ee5d 100644 (file)
@@ -32,7 +32,7 @@
 
 
 typedef struct {
-       unsigned long rss;
+       unsigned long vsz;
 #if ENABLE_FEATURE_TOP_CPU_USAGE_PERCENTAGE
        unsigned long ticks;
        unsigned pcpu; /* delta of ticks */
@@ -55,7 +55,7 @@ static struct save_hist *prev_hist;
 static int prev_hist_count;
 /* static int hist_iterations; */
 static unsigned total_pcpu;
-/* static unsigned long total_rss; */
+/* static unsigned long total_vsz; */
 #endif
 
 #define OPT_BATCH_MODE (option_mask32 & 0x4)
@@ -72,8 +72,8 @@ static int pid_sort(top_status_t *P, top_status_t *Q)
 static int mem_sort(top_status_t *P, top_status_t *Q)
 {
        /* We want to avoid unsigned->signed and truncation errors */
-       if (Q->rss < P->rss) return -1;
-       return Q->rss != P->rss; /* 0 if ==, 1 if > */
+       if (Q->vsz < P->vsz) return -1;
+       return Q->vsz != P->vsz; /* 0 if ==, 1 if > */
 }
 
 
@@ -147,7 +147,7 @@ static void do_stats(void)
 
        get_jiffy_counts();
        total_pcpu = 0;
-       /* total_rss = 0; */
+       /* total_vsz = 0; */
        new_hist = xmalloc(sizeof(struct save_hist)*ntop);
        /*
         * Make a pass through the data to get stats.
@@ -179,7 +179,7 @@ static void do_stats(void)
                        i = (i+1) % prev_hist_count;
                        /* hist_iterations++; */
                } while (i != last_i);
-               /* total_rss += cur->rss; */
+               /* total_vsz += cur->vsz; */
        }
 
        /*
@@ -287,8 +287,8 @@ static void display_status(int count, int scr_width)
        };
 
        top_status_t *s = top;
-       char rss_str_buf[8];
-       unsigned long total_memory = display_generic(scr_width); /* or use total_rss? */
+       char vsz_str_buf[8];
+       unsigned long total_memory = display_generic(scr_width); /* or use total_vsz? */
        unsigned pmem_shift, pmem_scale;
 
 #if ENABLE_FEATURE_TOP_CPU_USAGE_PERCENTAGE
@@ -297,22 +297,22 @@ static void display_status(int count, int scr_width)
 
        /* what info of the processes is shown */
        printf(OPT_BATCH_MODE ? "%.*s" : "\e[7m%.*s\e[0m", scr_width,
-               "  PID USER     STATUS   RSS  PPID %CPU %MEM COMMAND");
+               "  PID USER     STATUS   VSZ  PPID %CPU %MEM COMMAND");
 #define MIN_WIDTH \
-       sizeof( "  PID USER     STATUS   RSS  PPID %CPU %MEM C")
+       sizeof( "  PID USER     STATUS   VSZ  PPID %CPU %MEM C")
 #else
        printf(OPT_BATCH_MODE ? "%.*s" : "\e[7m%.*s\e[0m", scr_width,
-               "  PID USER     STATUS   RSS  PPID %MEM COMMAND");
+               "  PID USER     STATUS   VSZ  PPID %MEM COMMAND");
 #define MIN_WIDTH \
-       sizeof( "  PID USER     STATUS   RSS  PPID %MEM C")
+       sizeof( "  PID USER     STATUS   VSZ  PPID %MEM C")
 #endif
 
        /*
-        * MEM% = s->rss/MemTotal
+        * MEM% = s->vsz/MemTotal
         */
        pmem_shift = bits_per_int-11;
        pmem_scale = 1000*(1U<<(bits_per_int-11)) / total_memory;
-       /* s->rss is in kb. we want (s->rss * pmem_scale) to never overflow */
+       /* s->vsz is in kb. we want (s->vsz * pmem_scale) to never overflow */
        while (pmem_scale >= 512) {
                pmem_scale /= 4;
                pmem_shift -= 2;
@@ -346,14 +346,14 @@ static void display_status(int count, int scr_width)
        /* printf(" pmem_scale=%u pcpu_scale=%u ", pmem_scale, pcpu_scale); */
 #endif
        while (count-- > 0) {
-               div_t pmem = div((s->rss*pmem_scale) >> pmem_shift, 10);
+               div_t pmem = div((s->vsz*pmem_scale) >> pmem_shift, 10);
                int col = scr_width+1;
                USE_FEATURE_TOP_CPU_USAGE_PERCENTAGE(div_t pcpu;)
 
-               if (s->rss >= 100*1024)
-                       sprintf(rss_str_buf, "%6ldM", s->rss/1024);
+               if (s->vsz >= 100*1024)
+                       sprintf(vsz_str_buf, "%6ldM", s->vsz/1024);
                else
-                       sprintf(rss_str_buf, "%7ld", s->rss);
+                       sprintf(vsz_str_buf, "%7ld", s->vsz);
                USE_FEATURE_TOP_CPU_USAGE_PERCENTAGE(
                pcpu = div((s->pcpu*pcpu_scale) >> pcpu_shift, 10);
                )
@@ -362,7 +362,7 @@ static void display_status(int count, int scr_width)
                                USE_FEATURE_TOP_CPU_USAGE_PERCENTAGE("%3u.%c")
                                "%3u.%c ",
                                s->pid, get_cached_username(s->uid), s->state,
-                               rss_str_buf, s->ppid,
+                               vsz_str_buf, s->ppid,
                                USE_FEATURE_TOP_CPU_USAGE_PERCENTAGE(pcpu.quot, '0'+pcpu.rem,)
                                pmem.quot, '0'+pmem.rem);
                if (col > 0)
@@ -474,7 +474,7 @@ int top_main(int argc, char **argv)
                while ((p = procps_scan(p, 0
                                | PSSCAN_PID
                                | PSSCAN_PPID
-                               | PSSCAN_RSS
+                               | PSSCAN_VSZ
                                | PSSCAN_STIME
                                | PSSCAN_UTIME
                                | PSSCAN_STATE
@@ -486,7 +486,7 @@ int top_main(int argc, char **argv)
                        top = xrealloc(top, (++ntop)*sizeof(top_status_t));
                        top[n].pid = p->pid;
                        top[n].ppid = p->ppid;
-                       top[n].rss = p->rss;
+                       top[n].vsz = p->vsz;
 #if ENABLE_FEATURE_TOP_CPU_USAGE_PERCENTAGE
                        top[n].ticks = p->stime + p->utime;
 #endif