procstat_cs.c revision 280344
178977Sroam/*-
278977Sroam * Copyright (c) 2007 Robert N. M. Watson
378977Sroam * All rights reserved.
478977Sroam *
578977Sroam * Redistribution and use in source and binary forms, with or without
678977Sroam * modification, are permitted provided that the following conditions
778977Sroam * are met:
878977Sroam * 1. Redistributions of source code must retain the above copyright
978977Sroam *    notice, this list of conditions and the following disclaimer.
1078977Sroam * 2. Redistributions in binary form must reproduce the above copyright
1178977Sroam *    notice, this list of conditions and the following disclaimer in the
1278977Sroam *    documentation and/or other materials provided with the distribution.
1378977Sroam *
1478977Sroam * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1578977Sroam * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1678977Sroam * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1778977Sroam * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1878977Sroam * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1978977Sroam * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2078977Sroam * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2178977Sroam * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2278977Sroam * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2378977Sroam * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2478977Sroam * SUCH DAMAGE.
2578977Sroam *
2678977Sroam * $FreeBSD: stable/10/usr.bin/procstat/procstat_cs.c 280344 2015-03-22 12:49:57Z scottl $
2778977Sroam */
2878977Sroam
2978977Sroam#include <sys/param.h>
3078977Sroam#include <sys/cpuset.h>
3178977Sroam#include <sys/sysctl.h>
3278977Sroam#include <sys/user.h>
3378977Sroam
3478977Sroam#include <err.h>
3578977Sroam#include <errno.h>
3678977Sroam#include <libprocstat.h>
37141611Sru#include <stdio.h>
3878977Sroam#include <stdlib.h>
3978977Sroam#include <string.h>
4078977Sroam
4178977Sroam#include "procstat.h"
4299501Scharnier
4378977Sroamvoid
4499501Scharnierprocstat_cs(struct procstat *procstat, struct kinfo_proc *kipp)
4578977Sroam{
4678977Sroam	cpusetid_t cs;
4778977Sroam	cpuset_t mask;
4878977Sroam	struct kinfo_proc *kip;
4978977Sroam	unsigned int count, i;
5078977Sroam	int once, twice, lastcpu, cpu;
5178977Sroam
5278977Sroam	if (!hflag)
5378977Sroam		printf("%5s %6s %-16s %-16s %2s %4s %-7s\n", "PID",
5478977Sroam		    "TID", "COMM", "TDNAME", "CPU", "CSID", "CPU MASK");
5578977Sroam
5678977Sroam	kip = procstat_getprocs(procstat, KERN_PROC_PID | KERN_PROC_INC_THREAD,
5778977Sroam	    kipp->ki_pid, &count);
5878977Sroam	if (kip == NULL)
5978977Sroam		return;
6078977Sroam	kinfo_proc_sort(kip, count);
61102231Strhodes	for (i = 0; i < count; i++) {
6278977Sroam		kipp = &kip[i];
6378977Sroam		printf("%5d ", kipp->ki_pid);
6478977Sroam		printf("%6d ", kipp->ki_tid);
6578977Sroam		printf("%-16s ", strlen(kipp->ki_comm) ?
6678977Sroam		    kipp->ki_comm : "-");
6778977Sroam		printf("%-16s ", (strlen(kipp->ki_tdname) &&
6878977Sroam		    (strcmp(kipp->ki_comm, kipp->ki_tdname) != 0)) ?
6978977Sroam		    kipp->ki_tdname : "-");
7078977Sroam		if (kipp->ki_oncpu != 255)
7178977Sroam			printf("%3d ", kipp->ki_oncpu);
7278977Sroam		else if (kipp->ki_lastcpu != 255)
7378977Sroam			printf("%3d ", kipp->ki_lastcpu);
7478977Sroam		else
7578977Sroam			printf("%3s ", "-");
76141611Sru		if (cpuset_getid(CPU_LEVEL_CPUSET, CPU_WHICH_TID,
7778977Sroam		    kipp->ki_tid, &cs) != 0) {
7878977Sroam			cs = CPUSET_INVALID;
7978977Sroam		}
8078977Sroam		printf("%4d ", cs);
8178977Sroam		if ((cs != CPUSET_INVALID) &&
8278977Sroam		    (cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID,
8378977Sroam		    kipp->ki_tid, sizeof(mask), &mask) == 0)) {
8478977Sroam			lastcpu = -1;
8578977Sroam			once = 0;
8678977Sroam			twice = 0;
8778977Sroam			for (cpu = 0; cpu < CPU_SETSIZE; cpu++) {
8878977Sroam				if (CPU_ISSET(cpu, &mask)) {
8978977Sroam					if (once == 0) {
9078977Sroam						printf("%d", cpu);
9178977Sroam						once = 1;
9278977Sroam					} else if (cpu == lastcpu + 1) {
9379351Sru						twice = 1;
9478977Sroam					} else if (twice == 1) {
9578977Sroam						printf("-%d,%d", lastcpu, cpu);
96140368Sru						twice = 0;
97140368Sru					} else
9878977Sroam						printf(",%d", cpu);
9978977Sroam					lastcpu = cpu;
10078977Sroam				}
10178977Sroam			}
10278977Sroam			if (once && twice)
10378977Sroam				printf("-%d", lastcpu);
10478977Sroam		}
10578977Sroam		printf("\n");
10680836Sobrien	}
10778977Sroam	procstat_freeprocs(procstat, kip);
10878977Sroam}
109