Bug #1996 » 0002-kernel-Replace-LW-P-HOLD-RELE-to-use-refcount-APIs.patch
| sys/kern/kern_exit.c | ||
|---|---|---|
|
* Nobody actually wakes us when the lock
|
||
|
* count reaches zero, so just wait one tick.
|
||
|
*/
|
||
|
while (lp->lwp_lock > 0)
|
||
|
tsleep(lp, 0, "lwpexit", 1);
|
||
|
LWPLOCKWAIT(lp, "lwpexit", 1);
|
||
|
/* Hand down resource usage to our proc */
|
||
|
ruadd(&p->p_ru, &lp->lwp_ru);
|
||
| ... | ... | |
|
KKASSERT(lwkt_preempted_proc() != lp);
|
||
|
while (lp->lwp_lock > 0)
|
||
|
tsleep(lp, 0, "lwpwait1", 1);
|
||
|
LWPLOCKWAIT(lp, "lwpwait1", 1);
|
||
|
lwkt_wait_free(td);
|
||
| ... | ... | |
|
* put a hold on the process for short periods of
|
||
|
* time.
|
||
|
*/
|
||
|
while (p->p_lock)
|
||
|
tsleep(p, 0, "reap3", hz);
|
||
|
PLOCKWAIT(p, "reap3", hz);
|
||
|
/* Take care of our return values. */
|
||
|
*res = p->p_pid;
|
||
| ... | ... | |
|
* inconsistent state for processes running down
|
||
|
* the zombie list.
|
||
|
*/
|
||
|
KKASSERT(p->p_lock == 0);
|
||
|
if (p->p_lock) {
|
||
|
kprintf("%s: pid %d is still held (%x)\n",
|
||
|
__func__, p->p_pid, p->p_lock);
|
||
|
}
|
||
|
proc_remove_zombie(p);
|
||
|
leavepgrp(p);
|
||
| sys/kern/kern_proc.c | ||
|---|---|---|
|
proc_move_allproc_zombie(struct proc *p)
|
||
|
{
|
||
|
lwkt_gettoken(&proc_token);
|
||
|
while (p->p_lock) {
|
||
|
tsleep(p, 0, "reap1", hz / 10);
|
||
|
}
|
||
|
PLOCKWAIT(p, "reap1", hz / 10);
|
||
|
LIST_REMOVE(p, p_list);
|
||
|
LIST_INSERT_HEAD(&zombproc, p, p_list);
|
||
|
LIST_REMOVE(p, p_hash);
|
||
| ... | ... | |
|
proc_remove_zombie(struct proc *p)
|
||
|
{
|
||
|
lwkt_gettoken(&proc_token);
|
||
|
while (p->p_lock) {
|
||
|
tsleep(p, 0, "reap1", hz / 10);
|
||
|
}
|
||
|
PLOCKWAIT(p, "reap1", hz / 10);
|
||
|
LIST_REMOVE(p, p_list); /* off zombproc */
|
||
|
LIST_REMOVE(p, p_sibling);
|
||
|
lwkt_reltoken(&proc_token);
|
||
| sys/platform/pc32/i386/pmap.c | ||
|---|---|---|
|
void
|
||
|
pmap_dispose_proc(struct proc *p)
|
||
|
{
|
||
|
KASSERT(p->p_lock == 0, ("attempt to dispose referenced proc! %p", p));
|
||
|
KASSERT(p->p_lock == 0,
|
||
|
("attempt to dispose referenced or waited for proc! %p", p));
|
||
|
}
|
||
|
/***************************************************
|
||
| sys/platform/pc64/x86_64/pmap.c | ||
|---|---|---|
|
void
|
||
|
pmap_dispose_proc(struct proc *p)
|
||
|
{
|
||
|
KASSERT(p->p_lock == 0, ("attempt to dispose referenced proc! %p", p));
|
||
|
KASSERT(p->p_lock == 0,
|
||
|
("attempt to dispose referenced or waited for proc! %p", p));
|
||
|
}
|
||
|
/***************************************************
|
||
| sys/platform/vkernel/platform/pmap.c | ||
|---|---|---|
|
void
|
||
|
pmap_dispose_proc(struct proc *p)
|
||
|
{
|
||
|
KASSERT(p->p_lock == 0, ("attempt to dispose referenced proc! %p", p));
|
||
|
KASSERT(p->p_lock == 0,
|
||
|
("attempt to dispose referenced or waited for proc! %p", p));
|
||
|
}
|
||
|
/*
|
||
| sys/platform/vkernel64/platform/pmap.c | ||
|---|---|---|
|
void
|
||
|
pmap_dispose_proc(struct proc *p)
|
||
|
{
|
||
|
KASSERT(p->p_lock == 0, ("attempt to dispose referenced proc! %p", p));
|
||
|
KASSERT(p->p_lock == 0,
|
||
|
("attempt to dispose referenced or waited for proc! %p", p));
|
||
|
}
|
||
|
/***************************************************
|
||
| sys/sys/proc.h | ||
|---|---|---|
|
#include <sys/rtprio.h> /* For struct rtprio. */
|
||
|
#include <sys/signal.h>
|
||
|
#include <sys/lock.h>
|
||
|
#include <sys/refcount.h>
|
||
|
#ifndef _KERNEL
|
||
|
#include <sys/time.h> /* For structs itimerval, timeval. */
|
||
|
#endif
|
||
| ... | ... | |
|
*
|
||
|
* MPSAFE
|
||
|
*/
|
||
|
#define PHOLD(p) atomic_add_int(&(p)->p_lock, 1)
|
||
|
#define PRELE(p) atomic_add_int(&(p)->p_lock, -1)
|
||
|
#define PHOLD(p) refcount_acquire(&(p)->p_lock)
|
||
|
#define PRELE(p) refcount_release_wakeup(&(p)->p_lock)
|
||
|
#define PLOCKWAIT(p, wmesg, timo) refcount_wait(&(p)->p_lock, wmesg)
|
||
|
/*
|
||
|
* Hold lwp in memory, don't destruct, normally for ptrace/procfs work
|
||
|
* atomic ops because they can occur from an IPI.
|
||
|
* MPSAFE
|
||
|
*/
|
||
|
#define LWPHOLD(lp) atomic_add_int(&(lp)->lwp_lock, 1)
|
||
|
#define LWPRELE(lp) atomic_add_int(&(lp)->lwp_lock, -1)
|
||
|
#define LWPHOLD(lp) refcount_acquire(&(lp)->lwp_lock)
|
||
|
#define LWPRELE(lp) refcount_release_wakeup(&(lp)->lwp_lock)
|
||
|
#define LWPLOCKWAIT(lp, wmesg, timo) refcount_wait(&(lp)->lwp_lock, wmesg)
|
||
|
#define PIDHASH(pid) (&pidhashtbl[(pid) & pidhash])
|
||
|
extern LIST_HEAD(pidhashhead, proc) *pidhashtbl;
|
||
- « Previous
- 1
- 2
- Next »