1598585e8SMikolaj Golub /*- 24d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 31de7b4b8SPedro F. Giffuni * 4598585e8SMikolaj Golub * Copyright (c) 2011 Mikolaj Golub 5474b62b8SAllan Jude * Copyright (c) 2015 Allan Jude <allanjude@freebsd.org> 6598585e8SMikolaj Golub * All rights reserved. 7598585e8SMikolaj Golub * 8598585e8SMikolaj Golub * Redistribution and use in source and binary forms, with or without 9598585e8SMikolaj Golub * modification, are permitted provided that the following conditions 10598585e8SMikolaj Golub * are met: 11598585e8SMikolaj Golub * 1. Redistributions of source code must retain the above copyright 12598585e8SMikolaj Golub * notice, this list of conditions and the following disclaimer. 13598585e8SMikolaj Golub * 2. Redistributions in binary form must reproduce the above copyright 14598585e8SMikolaj Golub * notice, this list of conditions and the following disclaimer in the 15598585e8SMikolaj Golub * documentation and/or other materials provided with the distribution. 16598585e8SMikolaj Golub * 17598585e8SMikolaj Golub * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18598585e8SMikolaj Golub * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19598585e8SMikolaj Golub * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20598585e8SMikolaj Golub * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21598585e8SMikolaj Golub * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22598585e8SMikolaj Golub * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23598585e8SMikolaj Golub * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24598585e8SMikolaj Golub * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25598585e8SMikolaj Golub * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26598585e8SMikolaj Golub * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27598585e8SMikolaj Golub * SUCH DAMAGE. 28598585e8SMikolaj Golub */ 29598585e8SMikolaj Golub 30598585e8SMikolaj Golub #include <sys/param.h> 31598585e8SMikolaj Golub #include <sys/time.h> 3229bf090eSGleb Smirnoff #include <sys/resource.h> 33598585e8SMikolaj Golub #include <sys/sysctl.h> 34598585e8SMikolaj Golub #include <sys/user.h> 35598585e8SMikolaj Golub 36598585e8SMikolaj Golub #include <err.h> 37598585e8SMikolaj Golub #include <errno.h> 38598585e8SMikolaj Golub #include <libprocstat.h> 39de21500dSMikolaj Golub #include <libutil.h> 40598585e8SMikolaj Golub #include <limits.h> 41598585e8SMikolaj Golub #include <stdio.h> 42598585e8SMikolaj Golub #include <stdlib.h> 43598585e8SMikolaj Golub #include <string.h> 44598585e8SMikolaj Golub 45598585e8SMikolaj Golub #include "procstat.h" 46598585e8SMikolaj Golub 47de21500dSMikolaj Golub static struct { 48de21500dSMikolaj Golub const char *name; 49de21500dSMikolaj Golub const char *suffix; 50*e3b77753SKonstantin Belousov } rlimit_param[] = { 51de21500dSMikolaj Golub {"cputime", "sec"}, 52de21500dSMikolaj Golub {"filesize", "B "}, 53de21500dSMikolaj Golub {"datasize", "B "}, 54de21500dSMikolaj Golub {"stacksize", "B "}, 55de21500dSMikolaj Golub {"coredumpsize", "B "}, 56de21500dSMikolaj Golub {"memoryuse", "B "}, 57de21500dSMikolaj Golub {"memorylocked", "B "}, 58de21500dSMikolaj Golub {"maxprocesses", " "}, 59de21500dSMikolaj Golub {"openfiles", " "}, 60de21500dSMikolaj Golub {"sbsize", "B "}, 61de21500dSMikolaj Golub {"vmemoryuse", "B "}, 62de21500dSMikolaj Golub {"pseudo-terminals", " "}, 63de21500dSMikolaj Golub {"swapuse", "B "}, 6485a0ddfdSKonstantin Belousov {"kqueues", " "}, 651bdbd705SKonstantin Belousov {"umtxp", " "}, 66de21500dSMikolaj Golub }; 67de21500dSMikolaj Golub 68*e3b77753SKonstantin Belousov _Static_assert(nitems(rlimit_param) == RLIM_NLIMITS, 69*e3b77753SKonstantin Belousov "Resource limits have grown. Add new entries to rlimit_param[]."); 70de21500dSMikolaj Golub 71eaa769f5SMikolaj Golub static const char * 72eaa769f5SMikolaj Golub humanize_rlimit(int indx, rlim_t limit) 73de21500dSMikolaj Golub { 74de21500dSMikolaj Golub static char buf[14]; 75de21500dSMikolaj Golub int scale; 76de21500dSMikolaj Golub 77de21500dSMikolaj Golub if (limit == RLIM_INFINITY) 78de21500dSMikolaj Golub return ("infinity "); 79de21500dSMikolaj Golub 80de21500dSMikolaj Golub scale = humanize_number(buf, sizeof(buf) - 1, (int64_t)limit, 81de21500dSMikolaj Golub rlimit_param[indx].suffix, HN_AUTOSCALE | HN_GETSCALE, HN_DECIMAL); 82de21500dSMikolaj Golub (void)humanize_number(buf, sizeof(buf) - 1, (int64_t)limit, 83de21500dSMikolaj Golub rlimit_param[indx].suffix, HN_AUTOSCALE, HN_DECIMAL); 84de21500dSMikolaj Golub /* Pad with one space if there is no suffix prefix. */ 85de21500dSMikolaj Golub if (scale == 0) 86de21500dSMikolaj Golub sprintf(buf + strlen(buf), " "); 87de21500dSMikolaj Golub return (buf); 88de21500dSMikolaj Golub } 89de21500dSMikolaj Golub 90598585e8SMikolaj Golub void 9121b4f75aSMikolaj Golub procstat_rlimit(struct procstat *prstat, struct kinfo_proc *kipp) 92598585e8SMikolaj Golub { 9398623e8dSMikolaj Golub struct rlimit rlimit; 9421b4f75aSMikolaj Golub int i; 95598585e8SMikolaj Golub 962a243b95SBrooks Davis if ((procstat_opts & PS_OPT_NOHEADER) == 0) { 97474b62b8SAllan Jude xo_emit("{T:/%5s %-16s %-16s %16s %16s}\n", 98de21500dSMikolaj Golub "PID", "COMM", "RLIMIT", "SOFT ", "HARD "); 99de21500dSMikolaj Golub } 100474b62b8SAllan Jude xo_emit("{ek:process_id/%5d}{e:command/%-16s/%s}", kipp->ki_pid, 101474b62b8SAllan Jude kipp->ki_comm); 102c3c314f9SMikolaj Golub for (i = 0; i < RLIM_NLIMITS; i++) { 10321b4f75aSMikolaj Golub if (procstat_getrlimit(prstat, kipp, i, &rlimit) == -1) 104598585e8SMikolaj Golub return; 105474b62b8SAllan Jude xo_emit("{dk:process_id/%5d} {d:command/%-16s} " 106474b62b8SAllan Jude "{d:rlimit_param/%-16s} ", kipp->ki_pid, kipp->ki_comm, 107de21500dSMikolaj Golub rlimit_param[i].name); 108474b62b8SAllan Jude 109474b62b8SAllan Jude xo_open_container(rlimit_param[i].name); 110474b62b8SAllan Jude if (rlimit.rlim_cur == RLIM_INFINITY) 111474b62b8SAllan Jude xo_emit("{e:soft_limit/infinity}"); 112474b62b8SAllan Jude else 113474b62b8SAllan Jude xo_emit("{e:soft_limit/%U}", rlimit.rlim_cur); 114474b62b8SAllan Jude 115474b62b8SAllan Jude if (rlimit.rlim_max == RLIM_INFINITY) 116474b62b8SAllan Jude xo_emit("{e:hard_limit/infinity}"); 117474b62b8SAllan Jude else 118474b62b8SAllan Jude xo_emit("{e:hard_limit/%U}", rlimit.rlim_max); 119474b62b8SAllan Jude xo_close_container(rlimit_param[i].name); 120474b62b8SAllan Jude 121474b62b8SAllan Jude xo_emit("{d:rlim_cur/%16s} ", 122474b62b8SAllan Jude humanize_rlimit(i, rlimit.rlim_cur)); 123474b62b8SAllan Jude xo_emit("{d:rlim_max/%16s}\n", 124474b62b8SAllan Jude humanize_rlimit(i, rlimit.rlim_max)); 125598585e8SMikolaj Golub } 126598585e8SMikolaj Golub } 127