John Baldwin wrote:
On Monday 02 February 2009 7:33:08 am Nikola Knežević wrote:
On 30 Jan 2009, at 18:11 , Nikola Knežević wrote:

This is the message buffer:
Unread portion of the kernel message buffer:
panic: blockable sleep lock (sleep mutex) 16 @ /usr/src/sys/vm/ uma_core.c:1834
Any hints where I should search for the cause?

Ok, I solved this problem. I had a critical_enter/exit surrounding code which was calling a lot of mallocs. Now, I'm getting another message, which doesn't make any sense:

---8<---
--- trap 0, rip = 0, rsp = 0xffffffff87834d30, rbp = 0 ---
uma_zalloc_arg: zone "256" with the following non-sleepable locks held:
exclusive sleep mutex click_instance r = 0 (0xffffff00051b4540) locked @ sched.cc:441
--->8---

It says "non-sleepable locks", yet it classifies click_instance as sleep mutex. I think witness code should emit messages which are more clear.

It is confusing, but you can't do an M_WAITOK malloc while holding a mutex. Basically, sleeping actually means calling "*sleep() (such as mtx_sleep()) or cv_*wait*()". Blocking on a mutex is not sleeping, it's "blocking". Some locks (such as sx(9)) do "sleep" when you contest them. In the scheduler, sleeping and blocking are actually quite different (blocking uses turnstiles that handle priority inversions via priority propagation, sleeping uses sleep queues which do not do any of that). The underyling idea is that mutexes should be held for "short" periods of time, and that any sleeps are potentially unbounded. Holding a mutex while sleeping could result in a mutex being held for a long time.



the locking overview page
man 9 locking
tries to explain this..
I've been pestering John to proofread it and make suggestiosn for a while now.

(nag nag)


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

Reply via email to