ps(1): reuse keyword "cpu" to show CPU number

This flag will now show the processor number on which a process is running.

This change was inspired by PR129965. Initially I didn't think that the
patch attached to it was correct -- it sacrificed ki_estcpu use in "cpu"
for ki_lastcpu and I thought that the old functionality should be kept and
the new (cpu#) one added to it. But I've since discovered that ki_estcpu is
sched_4bsd-specific. What's worse, it represents the same thing as
ki_pctcpu, except ki_pctcpu is universal -- so "%cpu" has been using it
successfully. Therefore, I've decided to replace information based on
ki_estcpu with information based on ki_oncpu/ki_lastcpu.

Key parts of the code and manual changes were borrowed from top(1).

PR:		129965
Reported by:	Nikola Knežević
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D25377
This commit is contained in:
Piotr Pawel Stefaniak 2020-06-27 19:09:33 +00:00
parent 2dcf8c4593
commit 4f47f5111f
5 changed files with 37 additions and 5 deletions

View File

@ -41,13 +41,14 @@ extern fixpt_t ccpu;
extern int cflag, eval, fscale, nlistread, rawcpu;
extern unsigned long mempages;
extern time_t now;
extern int showthreads, sumrusage, termwidth;
extern int showthreads, sumrusage, termwidth, smp;
extern STAILQ_HEAD(velisthead, varent) varlist;
__BEGIN_DECLS
char *arguments(KINFO *, VARENT *);
char *command(KINFO *, VARENT *);
char *cputime(KINFO *, VARENT *);
char *cpunum(KINFO *, VARENT *);
int donlist(void);
char *elapsed(KINFO *, VARENT *);
char *elapseds(KINFO *, VARENT *);

View File

@ -83,8 +83,7 @@ static VAR var[] = {
CHAR, NULL, 0},
{"cow", "COW", NULL, "copy-on-write-faults", 0, kvar, KOFF(ki_cow),
UINT, "u", 0},
{"cpu", "CPU", NULL, "cpu-usage", 0, kvar, KOFF(ki_estcpu), UINT, "d",
0},
{"cpu", "C", NULL, "on-cpu", 0, cpunum, 0, CHAR, NULL, 0},
{"cputime", "", "time", NULL, 0, NULL, 0, CHAR, NULL, 0},
{"dsiz", "DSIZ", NULL, "data-size", 0, kvar, KOFF(ki_dsize), PGTOK,
"ld", 0},

View File

@ -550,6 +550,22 @@ cputime(KINFO *k, VARENT *ve)
return (printtime(k, ve, secs, psecs));
}
char *
cpunum(KINFO *k, VARENT *ve __unused)
{
char *cpu;
if (!smp)
return (NULL);
if (k->ki_p->ki_stat == SRUN && k->ki_p->ki_oncpu != NOCPU) {
asprintf(&cpu, "%d", k->ki_p->ki_oncpu);
} else {
asprintf(&cpu, "%d", k->ki_p->ki_lastcpu);
}
return (cpu);
}
char *
systime(KINFO *k, VARENT *ve)
{

View File

@ -29,7 +29,7 @@
.\" @(#)ps.1 8.3 (Berkeley) 4/18/94
.\" $FreeBSD$
.\"
.Dd October 31, 2018
.Dd June 27, 2020
.Dt PS 1
.Os
.Sh NAME
@ -545,7 +545,8 @@ command and arguments
.It Cm cow
number of copy-on-write faults
.It Cm cpu
short-term CPU usage factor (for scheduling)
The processor number on which the process is executing (visible only on SMP
systems).
.It Cm dsiz
data size (in Kbytes)
.It Cm emul

View File

@ -105,6 +105,7 @@ int rawcpu; /* -C */
int sumrusage; /* -S */
int termwidth; /* Width of the screen (0 == infinity). */
int showthreads; /* will threads be shown? */
int smp; /* multi-processor support */
struct velisthead varlist = STAILQ_HEAD_INITIALIZER(varlist);
@ -157,6 +158,7 @@ static void saveuser(KINFO *);
static void scanvars(void);
static void sizevars(void);
static void pidmax_init(void);
static void smp_init(void);
static void usage(void);
static char dfmt[] = "pid,tt,state,time,command";
@ -226,6 +228,7 @@ main(int argc, char *argv[])
argv[1] = kludge_oldps_options(PS_ARGS, argv[1], argv[2]);
pidmax_init();
smp_init();
all = descendancy = _fmt = nselectors = optfatal = 0;
prtheader = showthreads = wflag = xkeep_implied = 0;
@ -1456,6 +1459,18 @@ pidmax_init(void)
}
}
static void
smp_init(void)
{
size_t size;
size = sizeof(smp);
if ((sysctlbyname("machdep.smp_active", &smp, &size, NULL, 0) != 0 &&
sysctlbyname("kern.smp.active", &smp, &size, NULL, 0) != 0) ||
size != sizeof(smp))
smp = 0;
}
static void __dead2
usage(void)
{