54#include <sys/malloc.h>
57#include <sys/resourcevar.h>
61#include <sys/sysctl.h>
83#define TESTAB(a, b) ((a)<<1 | (b))
97 FOREACH_THREAD_IN_PROC(p, td) {
124 runa = TD_IS_RUNNING(td) || TD_ON_RUNQ(td);
125 slpa = td->td_flags & TDF_SINTR;
129 runb = TD_IS_RUNNING(td2) || TD_ON_RUNQ(td2);
131 slpb = td2->td_flags & TDF_SINTR;
136 switch (
TESTAB(runa, runb)) {
154 switch (
TESTAB(slpa, slpb)) {
190 switch (
TESTAB(runa, runb)) {
208 switch (
TESTAB(p1->p_state == PRS_ZOMBIE, p2->p_state == PRS_ZOMBIE)) {
217 return (p2->p_pid > p1->p_pid);
232 if (tp != NULL && !KERNEL_PANICKED()) {
242static int tty_info_kstacks = STACK_SBUF_FMT_COMPACT;
245sysctl_tty_info_kstacks(SYSCTL_HANDLER_ARGS)
247 enum stack_sbuf_fmt val;
250 val = tty_info_kstacks;
252 if (error != 0 || req->newptr == NULL)
256 case STACK_SBUF_FMT_NONE:
257 case STACK_SBUF_FMT_LONG:
258 case STACK_SBUF_FMT_COMPACT:
259 tty_info_kstacks = val;
268 CTLFLAG_RWTUN | CTLFLAG_MPSAFE | CTLTYPE_INT, NULL, 0,
269 sysctl_tty_info_kstacks,
"I",
270 "Adjust format of kernel stack(9) traces on ^T (tty info): "
271 "0 - disabled; 1 - long; 2 - compact");
280 struct timeval rtime, utime, stime;
283 int sterr, kstacks_val;
286 struct proc *p, *ppick;
287 struct thread *td, *tdpick;
288 const char *stateprefix, *state;
293 char comm[MAXCOMLEN + 1];
296 tty_assert_locked(tp);
301 (void)
sbuf_new(&sb, tp->t_prbuf, tp->t_prbufsz, SBUF_FIXEDLEN);
305 load = (
averunnable.ldavg[0] * 100 + FSCALE / 2) >> FSHIFT;
306 sbuf_printf(&sb,
"%sload: %d.%02d ", tp->t_column == 0 ?
"" :
"\n",
307 load / 100, load % 100);
309 if (tp->t_session == NULL) {
313 if (tp->t_pgrp == NULL) {
317 PGRP_LOCK(tp->t_pgrp);
318 if (LIST_EMPTY(&tp->t_pgrp->pg_members)) {
319 PGRP_UNLOCK(tp->t_pgrp);
320 sbuf_printf(&sb,
"empty foreground process group\n");
332 LIST_FOREACH(ppick, &tp->t_pgrp->pg_members, p_pglist)
337 PGRP_UNLOCK(tp->t_pgrp);
339 FOREACH_THREAD_IN_PROC(p, tdpick)
344 if (TD_IS_RUNNING(td))
346 else if (TD_ON_RUNQ(td) || TD_CAN_RUN(td))
348 else if (TD_IS_SLEEPING(td)) {
350 if (TD_ON_SLEEPQ(td))
351 state = td->td_wmesg;
353 state =
"sleeping without queue";
354 }
else if (TD_ON_LOCK(td)) {
355 state = td->td_lockname;
357 }
else if (TD_IS_SUSPENDED(td))
359 else if (TD_AWAITING_INTR(td))
361 else if (p->p_state == PRS_ZOMBIE)
365 pctcpu = (
sched_pctcpu(td) * 10000 + FSCALE / 2) >> FSHIFT;
367 kstacks_val = atomic_load_int(&tty_info_kstacks);
368 print_kstacks = (kstacks_val != STACK_SBUF_FMT_NONE);
371 if (TD_IS_SWAPPED(td))
374 sterr = stack_save_td(&stack, td);
378 if (p->p_state == PRS_NEW || p->p_state == PRS_ZOMBIE)
381 rss = pgtok(vmspace_resident_count(p->p_vmspace));
386 strlcpy(comm, p->p_comm,
sizeof comm);
391 " cmd: %s %d [%s%s] %ld.%02ldr %ld.%02ldu %ld.%02lds %d%% %ldk\n",
392 comm, pid, stateprefix, state,
393 (
long)rtime.tv_sec, rtime.tv_usec / 10000,
394 (
long)utime.tv_sec, utime.tv_usec / 10000,
395 (
long)stime.tv_sec, stime.tv_usec / 10000,
399 if (print_kstacks && sterr == 0)
SYSCTL_PROC(_kern_binmisc, OID_AUTO, add, CTLFLAG_MPSAFE|CTLTYPE_STRUCT|CTLFLAG_WR, NULL, IBC_ADD, sysctl_kern_binmisc, "S,ximgact_binmisc_entry", "Add an activator entry")
void cnputsn(const char *p, size_t n)
void rufetchcalc(struct proc *p, struct rusage *ru, struct timeval *up, struct timeval *sp)
struct loadavg averunnable
int sysctl_handle_int(SYSCTL_HANDLER_ARGS)
void microuptime(struct timeval *tvp)
void timevalsub(struct timeval *t1, const struct timeval *t2)
fixpt_t sched_pctcpu(struct thread *td)
u_char __read_frequently kdb_active
int sbuf_finish(struct sbuf *s)
void sbuf_delete(struct sbuf *s)
int sbuf_printf(struct sbuf *s, const char *fmt,...)
void sbuf_set_drain(struct sbuf *s, sbuf_drain_func *func, void *ctx)
struct sbuf * sbuf_new(struct sbuf *s, char *buf, int length, int flags)
int stack_sbuf_print_flags(struct sbuf *sb, const struct stack *st, int flags, enum stack_sbuf_fmt format)
int tty_checkoutq(struct tty *tp)
static int proc_compare(struct proc *p1, struct proc *p2)
static int thread_compare(struct thread *td, struct thread *td2)
void tty_info(struct tty *tp)
static int proc_sum(struct proc *p, fixpt_t *estcpup)
static int sbuf_tty_drain(void *a, const char *d, int len)
int tty_putstrn(struct tty *tp, const char *p, size_t n)