xref: /dragonfly/sys/ddb/db_ps.c (revision 4864d54178795d61ee7c614a053728fc9f31de23)
1 /*-
2  * Copyright (c) 1993 The Regents of the University of California.
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
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the University nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  * $FreeBSD: src/sys/ddb/db_ps.c,v 1.20 1999/08/28 00:41:09 peter Exp $
30  */
31 #include <sys/param.h>
32 #include <sys/systm.h>
33 #include <sys/proc.h>
34 #include <sys/cons.h>
35 
36 #include <ddb/ddb.h>
37 
38 static void db_dump_td_tokens(thread_t td);
39 
40 void
db_ps(db_expr_t dummy1,boolean_t dummy2,db_expr_t dummy3,char * dummy4)41 db_ps(db_expr_t dummy1, boolean_t dummy2, db_expr_t dummy3, char *dummy4)
42 {
43           int np;
44           int cpuidx;
45           int nl = 0;
46 
47           np = nprocs;
48 
49 #if 0
50           if (allproc.lh_first != NULL)
51                     p = allproc.lh_first;
52           else
53                     p = &proc0;
54           lp = FIRST_LWP_IN_PROC(__DEVOLATILE(struct proc *, p));
55 
56           if (db_more(&nl) < 0)
57               return;
58           db_printf("  pid      lwp  uid  ppid  pgrp  pflags lflags stat  wmesg    wchan cmd\n");
59           for (;;) {
60                     while (lp == NULL) {
61                               --np;
62                               p = p->p_list.le_next;
63                               if (p == NULL && np > 0)
64                                         p = zombproc.lh_first;
65                               if (p == NULL)
66                                         break;
67                               lp = FIRST_LWP_IN_PROC(__DEVOLATILE(struct proc *, p));
68                     }
69                     /*
70                      * XXX just take 20 for now...
71                      */
72                     if (db_more(&nl) < 0)
73                               return;
74                     if (p == NULL) {
75                               kprintf("oops, ran out of processes early!\n");
76                               break;
77                     }
78                     pp = p->p_pptr;
79                     if (pp == NULL)
80                               pp = p;
81 
82                     db_printf("%5d %8p %4d %5d %5d %06x %06x  %d %d",
83                         p->p_pid, (volatile void *)lp,
84                         p->p_ucred ? p->p_ucred->cr_ruid : 0, pp->p_pid,
85                         p->p_pgrp ? p->p_pgrp->pg_id : 0, p->p_flags,
86                         lp->lwp_flags, p->p_stat, lp->lwp_stat);
87                     if (lp->lwp_wchan) {
88                               db_printf(" %6s %8p",
89                                         (lp->lwp_wmesg ? lp->lwp_wmesg : "?"),
90                                         lp->lwp_wchan);
91                     } else {
92                               db_printf("                 ");
93                     }
94                     db_printf(" %s\n", p->p_comm ? p->p_comm : "");
95                     db_dump_td_tokens(lp->lwp_thread);
96 
97                     lp = lwp_rb_tree_RB_NEXT(lp);
98           }
99 #endif
100 
101           /*
102            * Dump running threads
103            */
104           for (cpuidx = 0; cpuidx < ncpus; ++cpuidx) {
105               struct globaldata *gd = globaldata_find(cpuidx);
106               thread_t td;
107               int j;
108 
109               if (db_more(&nl) < 0)
110                     return;
111               db_printf("cpu %d curthread %p reqflags %04x\n",
112                         gd->gd_cpuid, gd->gd_curthread, gd->gd_reqflags);
113               if (gd->gd_curthread && gd->gd_curthread->td_preempted) {
114                         db_printf("       PREEMPTING THREAD %p\n",
115                                         gd->gd_curthread->td_preempted);
116               }
117 
118               if (db_more(&nl) < 0)
119                     return;
120               db_printf("      INCOMING IPIQS:");
121               for (j = 0; j < ncpus; ++j) {
122                     lwkt_ipiq_t ip = globaldata_find(j)->gd_ipiq;
123                     if (ip != NULL) {
124                         ip = &ip[cpuidx];
125                         if (ip->ip_windex != ip->ip_rindex)
126                               db_printf(" cpu%d:%d", j, ip->ip_windex - ip->ip_rindex);
127                     }
128               }
129               db_printf("\n");
130 
131               if (db_more(&nl) < 0)
132                     return;
133               db_printf("  tdq     thread pid    flags pri/cs/mp        sp    wmesg wchan comm\n");
134               TAILQ_FOREACH(td, &gd->gd_tdrunq, td_threadq) {
135                     if (db_more(&nl) < 0)
136                         return;
137                     db_printf("  %p %3d %08x %2d/%02d %p %8.8s %p %s\n",
138                         td,
139                         (td->td_proc ? td->td_proc->p_pid : -1),
140                         td->td_flags,
141                         td->td_pri,
142                         td->td_critcount,
143                         td->td_sp,
144                         td->td_wmesg ? td->td_wmesg : "-",
145                         td->td_wchan,
146                         td->td_proc ? td->td_proc->p_comm : td->td_comm);
147                     if (td->td_preempted)
148                         db_printf("  PREEMPTING THREAD %p\n", td->td_preempted);
149                     db_dump_td_tokens(td);
150               }
151               if (db_more(&nl) < 0)
152                     return;
153               db_printf("\n");
154               if (db_more(&nl) < 0)
155                     return;
156               db_printf("  tdq     thread pid    flags pri/cs/mp        sp    wmesg wchan comm\n");
157               TAILQ_FOREACH(td, &gd->gd_tdallq, td_allq) {
158                     if (td->td_flags & TDF_MARKER)
159                         continue;
160                     if (db_more(&nl) < 0)
161                         return;
162                     db_printf("  %3d %p %3d %08x %2d/%02d %p %8.8s %p %s\n",
163                         np, td,
164                         (td->td_proc ? td->td_proc->p_pid : -1),
165                         td->td_flags,
166                         td->td_pri,
167                         td->td_critcount,
168                         td->td_sp,
169                         td->td_wmesg ? td->td_wmesg : "-",
170                         td->td_wchan,
171                         td->td_proc ? td->td_proc->p_comm : td->td_comm);
172                     db_dump_td_tokens(td);
173               }
174           }
175           if (db_more(&nl) < 0)
176               return;
177           db_printf("CURCPU %d CURTHREAD %p (%d)\n",
178               mycpu->gd_cpuid,
179               curthread,
180               (curthread->td_proc ? curthread->td_proc->p_pid : -1));
181           db_dump_td_tokens(curthread);
182 }
183 
184 static void
db_dump_td_tokens(thread_t td)185 db_dump_td_tokens(thread_t td)
186 {
187           lwkt_tokref_t ref;
188           lwkt_token_t tok;
189 
190           if (TD_TOKS_NOT_HELD(td))
191                     return;
192           db_printf("    TOKENS:");
193           for (ref = &td->td_toks_base; ref < td->td_toks_stop; ++ref) {
194                     tok = ref->tr_tok;
195 
196                     db_printf(" %p[tok=%p", ref, ref->tr_tok);
197                     if (tok->t_ref && td == tok->t_ref->tr_owner)
198                         db_printf(",held");
199                     db_printf("]");
200           }
201           db_printf("\n");
202 }
203 
204