summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS3
-rw-r--r--doc/index.html4
-rw-r--r--doc/s6-ps.html4
-rw-r--r--doc/upgrade.html2
-rw-r--r--package/info2
-rw-r--r--src/include-local/s6ps.h14
-rw-r--r--src/libs6ps/s6ps_pfield.c36
-rw-r--r--src/libs6ps/s6ps_statparse.c8
-rw-r--r--src/s6-linux-utils/s6-ps.c120
9 files changed, 127 insertions, 66 deletions
diff --git a/NEWS b/NEWS
index 7761b50..2ec2bf4 100644
--- a/NEWS
+++ b/NEWS
@@ -1,9 +1,10 @@
Changelog for s6-linux-utils.
-In 2.6.1.3
+In 2.6.2.0
----------
- Bugfixes.
+ - s6-ps now supports minflt, cminflt, majflt, cmajflt.
In 2.6.1.2
diff --git a/doc/index.html b/doc/index.html
index 3c59b96..5ea0813 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -47,7 +47,7 @@ on the wrong page. I apologize for the confusion.
The Linux kernel must be 3.5 or later. </li>
<li> GNU make, version 3.81 or later </li>
<li> <a href="//skarnet.org/software/skalibs/">skalibs</a> version
-2.13.1.0 or later. It's a build-time requirement. It's also a run-time
+2.13.2.0 or later. It's a build-time requirement. It's also a run-time
requirement if you link against the shared version of the skalibs
library. </li>
</ul>
@@ -63,7 +63,7 @@ library. </li>
<ul>
<li> The current released version of s6-linux-utils is
-<a href="s6-linux-utils-2.6.1.3.tar.gz">2.6.1.3</a>. </li>
+<a href="s6-linux-utils-2.6.2.0.tar.gz">2.6.2.0</a>. </li>
<li> Alternatively, you can checkout a copy of the
<a href="//git.skarnet.org/cgi-bin/cgit.cgi/s6-linux-utils/">s6-linux-utils
git repository</a>:
diff --git a/doc/s6-ps.html b/doc/s6-ps.html
index 12a986c..09d6a1d 100644
--- a/doc/s6-ps.html
+++ b/doc/s6-ps.html
@@ -81,6 +81,10 @@ cannot tell whether a process has locked memory pages or not. </li>
<li> <tt>sess</tt>&nbsp;: the session leader's pid. </li>
<li> <tt>tty</tt>&nbsp;: the name of the process's controlling terminal.</li>
<li> <tt>tpgid</tt>&nbsp;: the pid of the foreground process group. </li>
+ <li> <tt>minflt</tt>&nbsp;: the number of minor page fault the process has encountered. </li>
+ <li> <tt>cminflt</tt>&nbsp;: the cumulative number of minor page fault the process and its dead children have encountered. </li>
+ <li> <tt>majflt</tt>&nbsp;: the number of major page fault the process has encountered. </li>
+ <li> <tt>cmajflt</tt>&nbsp;: the cumulative number of major page fault the process and its dead children have encountered. </li>
<li> <tt>utime</tt>&nbsp;: the time the process spent in user mode. </li>
<li> <tt>stime</tt>&nbsp;: the time the process spent in kernel mode. </li>
<li> <tt>cutime</tt>&nbsp;: the time spent in user mode by the process <em>and</em>
diff --git a/doc/upgrade.html b/doc/upgrade.html
index 62c0aa6..34b2cb4 100644
--- a/doc/upgrade.html
+++ b/doc/upgrade.html
@@ -18,7 +18,7 @@
<h1> What has changed in s6-linux-utils </h1>
-<h2> in 2.6.1.3 </h2>
+<h2> in 2.6.2.0 </h2>
<ul>
<li> <a href="//skarnet.org/software/skalibs/">skalibs</a>
diff --git a/package/info b/package/info
index 6d82570..cb03f7a 100644
--- a/package/info
+++ b/package/info
@@ -1,4 +1,4 @@
package=s6-linux-utils
-version=2.6.1.3
+version=2.6.2.0
category=admin
package_macro_name=S6_LINUX_UTILS
diff --git a/src/include-local/s6ps.h b/src/include-local/s6ps.h
index 951cc3a..ca33a73 100644
--- a/src/include-local/s6ps.h
+++ b/src/include-local/s6ps.h
@@ -23,7 +23,11 @@ enum pfield_e
PFIELD_PGRP,
PFIELD_SESSION,
PFIELD_TTY,
- PFIELD_TPGID,
+ PFIELD_TPGID,
+ PFIELD_MINFLT,
+ PFIELD_CMINFLT,
+ PFIELD_MAJFLT,
+ PFIELD_CMAJFLT,
PFIELD_UTIME,
PFIELD_STIME,
PFIELD_CUTIME,
@@ -70,6 +74,10 @@ struct pscan_s
pid_t session ;
dev_t ttynr ;
pid_t tpgid ;
+ uint64_t minflt ;
+ uint64_t cminflt ;
+ uint64_t majflt ;
+ uint64_t cmajflt ;
uint64_t utime ;
uint64_t stime ;
uint64_t cutime ;
@@ -104,6 +112,10 @@ struct pscan_s
.session = 0, \
.ttynr = 0, \
.tpgid = -1, \
+ .minflt = 0, \
+ .cminflt = 0, \
+ .majflt = 0, \
+ .cmajflt = 0, \
.utime = 0, \
.stime = 0, \
.cutime = 0, \
diff --git a/src/libs6ps/s6ps_pfield.c b/src/libs6ps/s6ps_pfield.c
index 6d84ea0..ae589aa 100644
--- a/src/libs6ps/s6ps_pfield.c
+++ b/src/libs6ps/s6ps_pfield.c
@@ -25,6 +25,10 @@ static char const *const fieldheaders[PFIELD_PHAIL] =
"SESSION",
"TTY",
"TPGID",
+ "MINFLT",
+ "CMINFLT",
+ "MAJFLT",
+ "CMAJFLT",
"UTIME",
"STIME",
"CUTIME",
@@ -64,6 +68,10 @@ static char const *const opttable[PFIELD_PHAIL] =
"sess",
"tty",
"tpgid",
+ "minflt",
+ "cminflt",
+ "majflt",
+ "cmajflt",
"utime",
"stime",
"cutime",
@@ -257,6 +265,30 @@ static int fmt_jiffies (s6ps_auxinfo_t *aux, pscan_t *p, size_t *pos, size_t *le
return 1 ;
}
+static int fmt_minflt (s6ps_auxinfo_t *aux, pscan_t *p, size_t *pos, size_t *len)
+{
+ (void)aux ;
+ return fmt_64(p, pos, len, p->minflt) ;
+}
+
+static int fmt_cminflt (s6ps_auxinfo_t *aux, pscan_t *p, size_t *pos, size_t *len)
+{
+ (void)aux ;
+ return fmt_64(p, pos, len, p->cminflt) ;
+}
+
+static int fmt_majflt (s6ps_auxinfo_t *aux, pscan_t *p, size_t *pos, size_t *len)
+{
+ (void)aux ;
+ return fmt_64(p, pos, len, p->majflt) ;
+}
+
+static int fmt_cmajflt (s6ps_auxinfo_t *aux, pscan_t *p, size_t *pos, size_t *len)
+{
+ (void)aux ;
+ return fmt_64(p, pos, len, p->cmajflt) ;
+}
+
static int fmt_utime (s6ps_auxinfo_t *aux, pscan_t *p, size_t *pos, size_t *len)
{
return fmt_jiffies(aux, p, pos, len, p->utime) ;
@@ -545,6 +577,10 @@ static pfieldfmt_func_ref const pfieldfmt_table[PFIELD_PHAIL] =
&fmt_session,
&fmt_ttynr,
&fmt_tpgid,
+ &fmt_minflt,
+ &fmt_cminflt,
+ &fmt_majflt,
+ &fmt_cmajflt,
&fmt_utime,
&fmt_stime,
&fmt_cutime,
diff --git a/src/libs6ps/s6ps_statparse.c b/src/libs6ps/s6ps_statparse.c
index 8cc5a93..601e14a 100644
--- a/src/libs6ps/s6ps_statparse.c
+++ b/src/libs6ps/s6ps_statparse.c
@@ -116,10 +116,10 @@ int s6ps_statparse (pscan_t *p)
&p->ttynr,
&p->tpgid,
&dummy64,
- &dummy64,
- &dummy64,
- &dummy64,
- &dummy64,
+ &p->minflt,
+ &p->cminflt,
+ &p->majflt,
+ &p->cmajflt,
&p->utime,
&p->stime,
&p->cutime,
diff --git a/src/s6-linux-utils/s6-ps.c b/src/s6-linux-utils/s6-ps.c
index 255b195..49cb4fb 100644
--- a/src/s6-linux-utils/s6-ps.c
+++ b/src/s6-linux-utils/s6-ps.c
@@ -32,22 +32,26 @@
#define USAGE "s6-ps [ -H ] [ -w spacing ] [ -W wchanfile ] [ -l | -o field,field... ]"
#define RIGHTFORMATTED ( \
- (1 << PFIELD_PID) | \
- (1 << PFIELD_PPID) | \
- (1 << PFIELD_PGRP) | \
- (1 << PFIELD_SESSION) | \
- (1 << PFIELD_TPGID) | \
- (1 << PFIELD_PRIO) | \
- (1 << PFIELD_NICE) | \
- (1 << PFIELD_THREADS) | \
- (1 << PFIELD_VSIZE) | \
- (1 << PFIELD_RSS) | \
- (1 << PFIELD_RSSLIM) | \
- (1 << PFIELD_CPUNO) | \
- (1 << PFIELD_RTPRIO) | \
- (1 << PFIELD_PMEM) | \
- (1 << PFIELD_PCPU) | \
- ((uint64_t)1 << PFIELD_CPCPU))
+ (1ULL << PFIELD_PID) | \
+ (1ULL << PFIELD_PPID) | \
+ (1ULL << PFIELD_PGRP) | \
+ (1ULL << PFIELD_SESSION) | \
+ (1ULL << PFIELD_TPGID) | \
+ (1ULL << PFIELD_MINFLT) | \
+ (1ULL << PFIELD_CMINFLT) | \
+ (1ULL << PFIELD_MAJFLT) | \
+ (1ULL << PFIELD_CMAJFLT) | \
+ (1ULL << PFIELD_PRIO) | \
+ (1ULL << PFIELD_NICE) | \
+ (1ULL << PFIELD_THREADS) | \
+ (1ULL << PFIELD_VSIZE) | \
+ (1ULL << PFIELD_RSS) | \
+ (1ULL << PFIELD_RSSLIM) | \
+ (1ULL << PFIELD_CPUNO) | \
+ (1ULL << PFIELD_RTPRIO) | \
+ (1ULL << PFIELD_PMEM) | \
+ (1ULL << PFIELD_PCPU) | \
+ (1ULL << PFIELD_CPCPU))
static void *pid_dtok (unsigned int d, void *x)
{
@@ -81,7 +85,7 @@ static inline unsigned int ps_fieldscan (char const *s, pfield_t *list, uint64_t
for (; i < PFIELD_PHAIL ; i++) if (!strcmp(tmp, s6ps_opttable[i])) break ;
if (i >= PFIELD_PHAIL)
strerr_dief4x(100, "invalid", " field for -o option", ": ", tmp) ;
- if (bits & ((uint64_t)1 << i))
+ if (bits & (1ULL << i))
strerr_dief4x(100, "duplicate", " field for -o option", ": ", tmp) ;
}
s += len + 1 ;
@@ -130,7 +134,7 @@ int main (int argc, char const *const *argv)
case 'l' :
{
nfields = 11 ;
- fbf = (1 << PFIELD_USER) | (1 << PFIELD_PID) | ((uint64_t)1 << PFIELD_CPCPU) | (1 << PFIELD_PMEM) | (1 << PFIELD_VSIZE) | (1 << PFIELD_RSS) | (1 << PFIELD_TTY) | (1 << PFIELD_STATE) | (1 << PFIELD_START) | (1 << PFIELD_CTTIME) | (1 << PFIELD_ARGS) ;
+ fbf = (1ULL << PFIELD_USER) | (1ULL << PFIELD_PID) | (1ULL << PFIELD_CPCPU) | (1ULL << PFIELD_PMEM) | (1ULL << PFIELD_VSIZE) | (1ULL << PFIELD_RSS) | (1ULL << PFIELD_TTY) | (1ULL << PFIELD_STATE) | (1ULL << PFIELD_START) | (1ULL << PFIELD_CTTIME) | (1ULL << PFIELD_ARGS) ;
fieldlist[0] = PFIELD_USER ;
fieldlist[1] = PFIELD_PID ;
fieldlist[2] = PFIELD_CPCPU ;
@@ -165,35 +169,39 @@ int main (int argc, char const *const *argv)
if (spacing > 256) spacing = 256 ;
needstat = flagtree || !!(fbf & (
- (1 << PFIELD_PID) |
- (1 << PFIELD_COMM) |
- (1 << PFIELD_STATE) |
- (1 << PFIELD_PPID) |
- (1 << PFIELD_PGRP) |
- (1 << PFIELD_SESSION) |
- (1 << PFIELD_TTY) |
- (1 << PFIELD_TPGID) |
- (1 << PFIELD_UTIME) |
- (1 << PFIELD_STIME) |
- (1 << PFIELD_CUTIME) |
- (1 << PFIELD_CSTIME) |
- (1 << PFIELD_PRIO) |
- (1 << PFIELD_NICE) |
- (1 << PFIELD_THREADS) |
- (1 << PFIELD_START) |
- (1 << PFIELD_VSIZE) |
- (1 << PFIELD_RSS) |
- (1 << PFIELD_RSSLIM) |
- (1 << PFIELD_CPUNO) |
- (1 << PFIELD_RTPRIO) |
- (1 << PFIELD_RTPOLICY) |
- (1 << PFIELD_PMEM) |
- (1 << PFIELD_WCHAN) |
- (1 << PFIELD_PCPU) |
- (1 << PFIELD_TTIME) |
- (1 << PFIELD_CTTIME) |
- ((uint64_t)1 << PFIELD_TSTART) |
- ((uint64_t)1 << PFIELD_CPCPU))) ;
+ (1ULL << PFIELD_PID) |
+ (1ULL << PFIELD_COMM) |
+ (1ULL << PFIELD_STATE) |
+ (1ULL << PFIELD_PPID) |
+ (1ULL << PFIELD_PGRP) |
+ (1ULL << PFIELD_SESSION) |
+ (1ULL << PFIELD_TTY) |
+ (1ULL << PFIELD_TPGID) |
+ (1ULL << PFIELD_MINFLT) |
+ (1ULL << PFIELD_CMINFLT) |
+ (1ULL << PFIELD_MAJFLT) |
+ (1ULL << PFIELD_CMAJFLT) |
+ (1ULL << PFIELD_UTIME) |
+ (1ULL << PFIELD_STIME) |
+ (1ULL << PFIELD_CUTIME) |
+ (1ULL << PFIELD_CSTIME) |
+ (1ULL << PFIELD_PRIO) |
+ (1ULL << PFIELD_NICE) |
+ (1ULL << PFIELD_THREADS) |
+ (1ULL << PFIELD_START) |
+ (1ULL << PFIELD_VSIZE) |
+ (1ULL << PFIELD_RSS) |
+ (1ULL << PFIELD_RSSLIM) |
+ (1ULL << PFIELD_CPUNO) |
+ (1ULL << PFIELD_RTPRIO) |
+ (1ULL << PFIELD_RTPOLICY) |
+ (1ULL << PFIELD_PMEM) |
+ (1ULL << PFIELD_WCHAN) |
+ (1ULL << PFIELD_PCPU) |
+ (1ULL << PFIELD_TTIME) |
+ (1ULL << PFIELD_CTTIME) |
+ (1ULL << PFIELD_TSTART) |
+ (1ULL << PFIELD_CPCPU))) ;
/* Scan /proc */
@@ -293,18 +301,18 @@ int main (int argc, char const *const *argv)
/* Format, compute length, output */
- if (fbf & ((1 << PFIELD_START) | ((uint64_t)1 << PFIELD_TSTART) | (1 << PFIELD_PCPU) | ((uint64_t)1 << PFIELD_CPCPU)))
+ if (fbf & ((1ULL << PFIELD_START) | (1ULL << PFIELD_TSTART) | (1ULL << PFIELD_PCPU) | (1ULL << PFIELD_CPCPU)))
{
tain_wallclock_read_g() ;
s6ps_compute_boottime(&aux, p, mypos) ;
}
- if (fbf & (1 << PFIELD_USER) && !s6ps_cache_init(&aux.caches[0]))
+ if (fbf & (1ULL << PFIELD_USER) && !s6ps_cache_init(&aux.caches[0]))
strerr_diefu1sys(111, "init user name cache") ;
- if (fbf & (1 << PFIELD_GROUP) && !s6ps_cache_init(&aux.caches[1]))
+ if (fbf & (1ULL << PFIELD_GROUP) && !s6ps_cache_init(&aux.caches[1]))
strerr_diefu1sys(111, "init group name cache") ;
- if (fbf & (1 << PFIELD_TTY) && !s6ps_cache_init(&aux.caches[2]))
+ if (fbf & (1ULL << PFIELD_TTY) && !s6ps_cache_init(&aux.caches[2]))
strerr_diefu1sys(111, "init tty name cache") ;
- if (fbf & (1 << PFIELD_WCHAN) && !s6ps_wchan_init(&aux.wchan, wchanfile))
+ if (fbf & (1ULL << PFIELD_WCHAN) && !s6ps_wchan_init(&aux.wchan, wchanfile))
{
if (wchanfile) strerr_warnwu2sys("init wchan file ", wchanfile) ;
else strerr_warnwu1sys("init wchan") ;
@@ -329,10 +337,10 @@ int main (int argc, char const *const *argv)
for (i = 0 ; i < nfields ; i++)
if (maxlen[i] > maxspaces) maxspaces = maxlen[i] ;
maxspaces += spacing ;
- if (fbf & (1 << PFIELD_USER)) s6ps_cache_finish(&aux.caches[0]) ;
- if (fbf & (1 << PFIELD_GROUP)) s6ps_cache_finish(&aux.caches[1]) ;
- if (fbf & (1 << PFIELD_TTY)) s6ps_cache_finish(&aux.caches[2]) ;
- if (fbf & (1 << PFIELD_WCHAN)) s6ps_wchan_finish(&aux.wchan) ;
+ if (fbf & (1ULL << PFIELD_USER)) s6ps_cache_finish(&aux.caches[0]) ;
+ if (fbf & (1ULL << PFIELD_GROUP)) s6ps_cache_finish(&aux.caches[1]) ;
+ if (fbf & (1ULL << PFIELD_TTY)) s6ps_cache_finish(&aux.caches[2]) ;
+ if (fbf & (1ULL << PFIELD_WCHAN)) s6ps_wchan_finish(&aux.wchan) ;
stralloc_free(&satmp) ;
{
char spaces[maxspaces] ;