- Introduce a blessed list for sxlocks that prevents the deadlkres to

panic on those ones. [0]
- Fix ticks counter wrap-up

Sponsored by:		Sandvine Incorporated
[0] Reported by:	jilles
[0] Tested by:		jilles
MFC:			1 week
This commit is contained in:
Attilio Rao 2010-04-11 16:06:09 +00:00
parent becba438d2
commit 36e51f655d
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=206482

View File

@ -162,6 +162,11 @@ SYSCTL_PROC(_kern, OID_AUTO, cp_times, CTLTYPE_LONG|CTLFLAG_RD|CTLFLAG_MPSAFE,
0,0, sysctl_kern_cp_times, "LU", "per-CPU time statistics");
#ifdef DEADLKRES
static const char *blessed[] = {
"so_snd_sx",
"so_rcv_sx",
NULL
};
static int slptime_threshold = 1800;
static int blktime_threshold = 900;
static int sleepfreq = 3;
@ -172,7 +177,7 @@ deadlkres(void)
struct proc *p;
struct thread *td;
void *wchan;
int blkticks, slpticks, slptype, tryl, tticks;
int blkticks, i, slpticks, slptype, tryl, tticks;
tryl = 0;
for (;;) {
@ -205,6 +210,10 @@ deadlkres(void)
* turnstile channel is in good state.
*/
MPASS(td->td_blocked != NULL);
/* Handle ticks wrap-up. */
if (ticks < td->td_blktick)
continue;
tticks = ticks - td->td_blktick;
thread_unlock(td);
if (tticks > blkticks) {
@ -222,6 +231,10 @@ deadlkres(void)
}
} else if (TD_IS_SLEEPING(td)) {
/* Handle ticks wrap-up. */
if (ticks < td->td_blktick)
continue;
/*
* Check if the thread is sleeping on a
* lock, otherwise skip the check.
@ -242,7 +255,24 @@ deadlkres(void)
* thresholds, this thread is
* stuck for too long on a
* sleepqueue.
* However, being on a
* sleepqueue, we might still
* check for the blessed
* list.
*/
tryl = 0;
for (i = 0; blessed[i] != NULL;
i++) {
if (!strcmp(blessed[i],
td->td_wmesg)) {
tryl = 1;
break;
}
}
if (tryl != 0) {
tryl = 0;
continue;
}
PROC_UNLOCK(p);
sx_sunlock(&allproc_lock);
panic("%s: possible deadlock detected for %p, blocked for %d ticks\n",