MFC r206482, r206879:
- Introduce a blessed list for sxlocks that prevents the deadlkres to panic on those ones. Populate this list with getblk and so_snd_sx and so_rcv_sx. - Fix ticks counter wrap-up Sponsored by: Sandvine Incorporated
This commit is contained in:
parent
2647f6f353
commit
cae97f8fd8
@ -162,6 +162,12 @@ 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[] = {
|
||||
"getblk",
|
||||
"so_snd_sx",
|
||||
"so_rcv_sx",
|
||||
NULL
|
||||
};
|
||||
static int slptime_threshold = 1800;
|
||||
static int blktime_threshold = 900;
|
||||
static int sleepfreq = 3;
|
||||
@ -172,7 +178,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 +211,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 +232,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 +256,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",
|
||||
|
Loading…
x
Reference in New Issue
Block a user