Date: Wed, 9 May 2012 05:06:39 GMT From: Jinjun Gao <gjinjun@gmail.com> To: freebsd-gnats-submit@FreeBSD.org Subject: kern/167727: may missing PROC_UNLOCK() in kproc_suspend() of kern_kthread.c Message-ID: <201205090506.q4956dvV004766@red.freebsd.org> Resent-Message-ID: <201205090510.q495A7Kl099961@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 167727
>Category: kern
>Synopsis: may missing PROC_UNLOCK() in kproc_suspend() of kern_kthread.c
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Wed May 09 05:10:07 UTC 2012
>Closed-Date:
>Last-Modified:
>Originator: Jinjun Gao
>Release: 7-release
>Organization:
>Environment:
FreeBSD 7.0-RELEASE FreeBSD 7-RELEASE #0: Sun Feb 24 10:35:36 UTC 2008 root@driscoll.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64
>Description:
In kernel's thread suspend code, maybe miss PROC_UNLOCK call.
kernel code: sys/kern/kern_kthread.c
...
/*
* Advise a kernel process to suspend (or resume) in its main loop.
* Participation is voluntary.
*/
int
kproc_suspend(struct proc *p, int timo)
{
/*
* Make sure this is indeed a system process and we can safely
* use the p_siglist field.
*/
PROC_LOCK(p);
if ((p->p_flag & P_KTHREAD) == 0) {
PROC_UNLOCK(p);
return (EINVAL);
}
SIGADDSET(p->p_siglist, SIGSTOP);
wakeup(p);
return msleep(&p->p_siglist, &p->p_mtx, PPAUSE | PDROP, "suspkp", timo);
}
We should add PROC_UNLOCK(p) after SIGADDSET(p->p_siglist, SIGSTOP).
>How-To-Repeat:
You can find these code at kernel source code.
>Fix:
add PROC_UNLOCK(p) after SIGADDSET(p->p_siglist, SIGSTOP);
>Release-Note:
>Audit-Trail:
>Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201205090506.q4956dvV004766>
