Deleted Added
full compact
procstat_cs.c (279842) procstat_cs.c (287486)
1/*-
2 * Copyright (c) 2007 Robert N. M. Watson
1/*-
2 * Copyright (c) 2007 Robert N. M. Watson
3 * Copyright (c) 2015 Allan Jude <allanjude@freebsd.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright

--- 7 unchanged lines hidden (view full) ---

18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright

--- 7 unchanged lines hidden (view full) ---

19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 *
26 * $FreeBSD: head/usr.bin/procstat/procstat_cs.c 279842 2015-03-10 09:41:48Z scottl $
27 * $FreeBSD: head/usr.bin/procstat/procstat_cs.c 287486 2015-09-05 17:02:01Z allanjude $
27 */
28
29#include <sys/param.h>
30#include <sys/cpuset.h>
28 */
29
30#include <sys/param.h>
31#include <sys/cpuset.h>
32#include <sys/sbuf.h>
31#include <sys/sysctl.h>
32#include <sys/user.h>
33
34#include <err.h>
35#include <errno.h>
36#include <libprocstat.h>
37#include <stdio.h>
38#include <stdlib.h>
39#include <string.h>
40
41#include "procstat.h"
42
43void
44procstat_cs(struct procstat *procstat, struct kinfo_proc *kipp)
45{
46 cpusetid_t cs;
47 cpuset_t mask;
48 struct kinfo_proc *kip;
33#include <sys/sysctl.h>
34#include <sys/user.h>
35
36#include <err.h>
37#include <errno.h>
38#include <libprocstat.h>
39#include <stdio.h>
40#include <stdlib.h>
41#include <string.h>
42
43#include "procstat.h"
44
45void
46procstat_cs(struct procstat *procstat, struct kinfo_proc *kipp)
47{
48 cpusetid_t cs;
49 cpuset_t mask;
50 struct kinfo_proc *kip;
51 struct sbuf *cpusetbuf;
49 unsigned int count, i;
50 int once, twice, lastcpu, cpu;
51
52 if (!hflag)
52 unsigned int count, i;
53 int once, twice, lastcpu, cpu;
54
55 if (!hflag)
53 printf("%5s %6s %-16s %-16s %2s %4s %-7s\n", "PID",
56 xo_emit("{T:/%5s %6s %-16s %-16s %2s %4s %-7s}\n", "PID",
54 "TID", "COMM", "TDNAME", "CPU", "CSID", "CPU MASK");
55
56 kip = procstat_getprocs(procstat, KERN_PROC_PID | KERN_PROC_INC_THREAD,
57 kipp->ki_pid, &count);
58 if (kip == NULL)
59 return;
60 kinfo_proc_sort(kip, count);
61 for (i = 0; i < count; i++) {
62 kipp = &kip[i];
57 "TID", "COMM", "TDNAME", "CPU", "CSID", "CPU MASK");
58
59 kip = procstat_getprocs(procstat, KERN_PROC_PID | KERN_PROC_INC_THREAD,
60 kipp->ki_pid, &count);
61 if (kip == NULL)
62 return;
63 kinfo_proc_sort(kip, count);
64 for (i = 0; i < count; i++) {
65 kipp = &kip[i];
63 printf("%5d ", kipp->ki_pid);
64 printf("%6d ", kipp->ki_tid);
65 printf("%-16s ", strlen(kipp->ki_comm) ?
66 xo_emit("{k:process_id/%5d/%d} ", kipp->ki_pid);
67 xo_emit("{:thread_id/%6d/%d} ", kipp->ki_tid);
68 xo_emit("{:command/%-16s/%s} ", strlen(kipp->ki_comm) ?
66 kipp->ki_comm : "-");
69 kipp->ki_comm : "-");
67 printf("%-16s ", (strlen(kipp->ki_tdname) &&
70 xo_emit("{:thread_name/%-16s/%s} ", (strlen(kipp->ki_tdname) &&
68 (strcmp(kipp->ki_comm, kipp->ki_tdname) != 0)) ?
69 kipp->ki_tdname : "-");
70 if (kipp->ki_oncpu != 255)
71 (strcmp(kipp->ki_comm, kipp->ki_tdname) != 0)) ?
72 kipp->ki_tdname : "-");
73 if (kipp->ki_oncpu != 255)
71 printf("%3d ", kipp->ki_oncpu);
74 xo_emit("{:cpu/%3d/%d} ", kipp->ki_oncpu);
72 else if (kipp->ki_lastcpu != 255)
75 else if (kipp->ki_lastcpu != 255)
73 printf("%3d ", kipp->ki_lastcpu);
76 xo_emit("{:cpu/%3d/%d} ", kipp->ki_lastcpu);
74 else
77 else
75 printf("%3s ", "-");
78 xo_emit("{:cpu/%3s/%s} ", "-");
76 if (cpuset_getid(CPU_LEVEL_CPUSET, CPU_WHICH_TID,
77 kipp->ki_tid, &cs) != 0) {
78 cs = CPUSET_INVALID;
79 }
79 if (cpuset_getid(CPU_LEVEL_CPUSET, CPU_WHICH_TID,
80 kipp->ki_tid, &cs) != 0) {
81 cs = CPUSET_INVALID;
82 }
80 printf("%4d ", cs);
83 xo_emit("{:cpu_set_id/%4d/%d} ", cs);
81 if ((cs != CPUSET_INVALID) &&
82 (cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID,
83 kipp->ki_tid, sizeof(mask), &mask) == 0)) {
84 lastcpu = -1;
85 once = 0;
86 twice = 0;
84 if ((cs != CPUSET_INVALID) &&
85 (cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID,
86 kipp->ki_tid, sizeof(mask), &mask) == 0)) {
87 lastcpu = -1;
88 once = 0;
89 twice = 0;
90 cpusetbuf = sbuf_new_auto();
87 for (cpu = 0; cpu < CPU_SETSIZE; cpu++) {
88 if (CPU_ISSET(cpu, &mask)) {
89 if (once == 0) {
91 for (cpu = 0; cpu < CPU_SETSIZE; cpu++) {
92 if (CPU_ISSET(cpu, &mask)) {
93 if (once == 0) {
90 printf("%d", cpu);
94 sbuf_printf(cpusetbuf, "%d",
95 cpu);
91 once = 1;
92 } else if (cpu == lastcpu + 1) {
93 twice = 1;
94 } else if (twice == 1) {
96 once = 1;
97 } else if (cpu == lastcpu + 1) {
98 twice = 1;
99 } else if (twice == 1) {
95 printf("-%d,%d", lastcpu, cpu);
100 sbuf_printf(cpusetbuf, "-%d,%d",
101 lastcpu, cpu);
96 twice = 0;
97 } else
102 twice = 0;
103 } else
98 printf(",%d", cpu);
104 sbuf_printf(cpusetbuf, ",%d",
105 cpu);
99 lastcpu = cpu;
100 }
101 }
102 if (once && twice)
106 lastcpu = cpu;
107 }
108 }
109 if (once && twice)
103 printf("-%d", lastcpu);
110 sbuf_printf(cpusetbuf, "-%d", lastcpu);
111 if (sbuf_finish(cpusetbuf) != 0)
112 xo_err(1, "Could not generate output");
113 xo_emit("{:cpu_set/%s}", sbuf_data(cpusetbuf));
114 sbuf_delete(cpusetbuf);
104 }
115 }
105 printf("\n");
116 xo_emit("\n");
106 }
107 procstat_freeprocs(procstat, kip);
108}
117 }
118 procstat_freeprocs(procstat, kip);
119}