On Sat, 7 Mar 2009 07:44:23 +0100, Polytropon <free...@edvax.de> wrote:
> Hi list,
>
> in order to find out why Opera often keeps hanging (doing nothing),
> often for several minutes, I checked its top(1) output.
>
> Reading "man top", I found the following explaination:
>
>       [...] STATE is the current state (one of "START", "RUN"
>       (shown as "CPUn" on SMP systems), "SLEEP", "STOP", "ZOMB",
>       "WAIT", "LOCK"  or  the  event  on  which  the  process
>       waits) [...]
>
> When Opera just hangs(TM) :-), it is in one of the states "ucond"
> or "umtxn" - and sucking up to 100% WCPU.
>
> Here is my question: Is there an explainative list that gives a
> clue about what this state indicates? Where are these "event[s]
> on which the process waits" documented?
>
> When I could guess, then I'd say that "ucond" means "unconditioned",
> "in no condition" (which would be a very strage state - the absense of
> any state), and "umtxn"... um... USB mass storage transmit number?  No
> idea.
>
> Other states that I see have a more descriptive name, such as "pause",
> "select" or "getblk" and even "kqread".

"umtx lock", "umtx", "umtxn", "umtxpi" and "umtxpp" are internal kernel
strings that are used to identify particular locks and wait conditions
where a process may block while running inside the kernel.  A recent
FreeBSD 8.0-CURRENT kernel shows:

  keram...@kobe:/usr/src/sys$ fgrep -r '"umtx' .
  ./kern/kern_umtx.c:static MALLOC_DEFINE(M_UMTX, "umtx", "UMTX queue memory");
  ./kern/kern_umtx.c:SYSCTL_NODE(_debug, OID_AUTO, umtx, CTLFLAG_RW, 0, "umtx 
debug");
  ./kern/kern_umtx.c:     umtx_pi_zone = uma_zcreate("umtx pi", sizeof(struct 
umtx_pi),
  ./kern/kern_umtx.c:                     mtx_init(&umtxq_chains[i][j].uc_lock, 
"umtxql", NULL,
  ./kern/kern_umtx.c:     mtx_init(&umtx_lock, "umtx lock", NULL, MTX_SPIN);
  ./kern/kern_umtx.c:                     msleep(uc, &uc->uc_lock, 0, "umtxqb", 
0);
  ./kern/kern_umtx.c:                     error = umtxq_sleep(uq, "umtx", timo);
  ./kern/kern_umtx.c:                     error = umtxq_sleep(uq, "umtx", timo);
  ./kern/kern_umtx.c:                     error = umtxq_sleep(uq, "umtxn", 
timo);
  ./kern/kern_umtx.c:                              "umtxpi", timo);
  ./kern/kern_umtx.c:             error = umtxq_sleep(uq, "umtxpp", timo);
  ./kern/kern_umtx.c:             error = umtxq_sleep(uq, "umtxpp", 0);
  ./kern/subr_witness.c:  { "umtx lock", &lock_class_mtx_spin },
  keram...@kobe:/usr/src/sys$

AFAIK, there is no automated way of generating a list of kernel wait
states for all possible locks and wait conditions in the kernel, and
even if there was it would be a bit tricky to update the top(1) manpage
to automagically include all of them.  One of the reasons why this is a
relatively Sisyphean effort is that you can run often run an old top(1)
binary with both a matching kernel *and* a kernel that is a few
snapshots newer.  When this happens the new kernel may support wait
states that are not included in the top(1) manpage at all.

_______________________________________________
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to "freebsd-questions-unsubscr...@freebsd.org"

Reply via email to