PERFORCE change 92099 for review
John Baldwin
jhb at FreeBSD.org
Mon Feb 20 14:41:24 PST 2006
http://perforce.freebsd.org/chv.cgi?CH=92099
Change 92099 by jhb at jhb_slimer on 2006/02/20 22:40:44
- Do a single PHOLD around the actions of kern_ptrace().
- Fix the default error case to be in the default: case so we
can just use break instead of goto out. Simplify a lot of
cleanup and unlocking code as a result. Many ptrace actions
are now back to just ptrace_foo(); break;
- Revert PHOLD/PRELE in FIX_SSTEP as all callers already do it now.
Affected files ...
.. //depot/projects/smpng/sys/alpha/include/ptrace.h#10 edit
.. //depot/projects/smpng/sys/kern/sys_process.c#51 edit
Differences ...
==== //depot/projects/smpng/sys/alpha/include/ptrace.h#10 (text+ko) ====
@@ -34,11 +34,7 @@
#define _MACHINE_PTRACE_H_
#ifdef _KERNEL
-#define FIX_SSTEP(p) do { \
- _PHOLD((p)); \
- ptrace_clear_single_step((p)); \
- _PRELE((p)); \
-} while (0)
+#define FIX_SSTEP(p) ptrace_clear_single_step(p)
#endif
#endif
==== //depot/projects/smpng/sys/kern/sys_process.c#51 (text+ko) ====
@@ -658,11 +658,14 @@
break;
}
+ /* Keep this process around until we finish this request. */
+ _PHOLD(p);
+
#ifdef FIX_SSTEP
/*
* Single step fixup ala procfs
*/
- FIX_SSTEP(td2); /* XXXKSE */
+ FIX_SSTEP(td2);
#endif
/*
@@ -676,9 +679,7 @@
/* set my trace flag and "owner" so it can read/write me */
p->p_flag |= P_TRACED;
p->p_oppid = p->p_pptr->p_pid;
- PROC_UNLOCK(p);
- sx_xunlock(&proctree_lock);
- return (0);
+ break;
case PT_ATTACH:
/* security check done above */
@@ -694,36 +695,24 @@
goto sendsig; /* in PT_CONTINUE below */
case PT_CLEARSTEP:
- _PHOLD(p);
error = ptrace_clear_single_step(td2);
- _PRELE(p);
- if (error)
- goto fail;
- PROC_UNLOCK(p);
- return (0);
+ break;
case PT_SETSTEP:
- _PHOLD(p);
error = ptrace_single_step(td2);
- _PRELE(p);
- if (error)
- goto fail;
- PROC_UNLOCK(p);
- return (0);
+ break;
case PT_SUSPEND:
mtx_lock_spin(&sched_lock);
td2->td_flags |= TDF_DBSUSPEND;
mtx_unlock_spin(&sched_lock);
- PROC_UNLOCK(p);
- return (0);
+ break;
case PT_RESUME:
mtx_lock_spin(&sched_lock);
td2->td_flags &= ~TDF_DBSUSPEND;
mtx_unlock_spin(&sched_lock);
- PROC_UNLOCK(p);
- return (0);
+ break;
case PT_STEP:
case PT_CONTINUE:
@@ -734,18 +723,14 @@
/* Zero means do not send any signal */
if (data < 0 || data > _SIG_MAXSIG) {
error = EINVAL;
- goto fail;
+ break;
}
- _PHOLD(p);
-
switch (req) {
case PT_STEP:
error = ptrace_single_step(td2);
- if (error) {
- _PRELE(p);
- goto fail;
- }
+ if (error)
+ goto out;
break;
case PT_TO_SCE:
p->p_stops |= S_PT_SCE;
@@ -760,12 +745,9 @@
if (addr != (void *)1) {
error = ptrace_set_pc(td2, (u_long)(uintfptr_t)addr);
- if (error) {
- _PRELE(p);
- goto fail;
- }
+ if (error)
+ break;
}
- _PRELE(p);
if (req == PT_DETACH) {
/* reset process parent */
@@ -795,8 +777,10 @@
}
sendsig:
- if (proctree_locked)
+ if (proctree_locked) {
sx_xunlock(&proctree_lock);
+ proctree_locked = 0;
+ }
/* deliver or queue signal */
mtx_lock_spin(&sched_lock);
td2->td_flags &= ~TDF_XSIG;
@@ -827,8 +811,7 @@
if (data)
psignal(p, data);
- PROC_UNLOCK(p);
- return (0);
+ break;
case PT_WRITE_I:
case PT_WRITE_D:
@@ -836,7 +819,6 @@
/* FALLTHROUGH */
case PT_READ_I:
case PT_READ_D:
- _PHOLD(p);
PROC_UNLOCK(p);
tmp = 0;
/* write = 0 set above */
@@ -850,7 +832,6 @@
uio.uio_rw = write ? UIO_WRITE : UIO_READ;
uio.uio_td = td;
error = proc_rwmem(p, &uio);
- PRELE(p);
if (uio.uio_resid != 0) {
/*
* XXX proc_rwmem() doesn't currently return ENOSPC,
@@ -866,11 +847,10 @@
}
if (!write)
td->td_retval[0] = tmp;
- return (error);
+ PROC_LOCK(p);
+ break;
case PT_IO:
- _PHOLD(p);
- PROC_UNLOCK(p);
#ifdef COMPAT_IA32
if (wrap32) {
piod32 = addr;
@@ -906,69 +886,52 @@
uio.uio_rw = UIO_WRITE;
break;
default:
- PRELE(p);
- return (EINVAL);
+ error = EINVAL;
+ goto out;
}
+ PROC_UNLOCK(p);
error = proc_rwmem(p, &uio);
- PRELE(p);
#ifdef COMPAT_IA32
if (wrap32)
piod32->piod_len -= uio.uio_resid;
else
#endif
piod->piod_len -= uio.uio_resid;
- return (error);
+ PROC_LOCK(p);
+ break;
case PT_KILL:
data = SIGKILL;
goto sendsig; /* in PT_CONTINUE above */
case PT_SETREGS:
- _PHOLD(p);
error = PROC_WRITE(regs, td2, addr);
- _PRELE(p);
- PROC_UNLOCK(p);
- return (error);
+ break;
case PT_GETREGS:
- _PHOLD(p);
error = PROC_READ(regs, td2, addr);
- _PRELE(p);
- PROC_UNLOCK(p);
- return (error);
+ break;
case PT_SETFPREGS:
- _PHOLD(p);
error = PROC_WRITE(fpregs, td2, addr);
- _PRELE(p);
- PROC_UNLOCK(p);
- return (error);
+ break;
case PT_GETFPREGS:
- _PHOLD(p);
error = PROC_READ(fpregs, td2, addr);
- _PRELE(p);
- PROC_UNLOCK(p);
- return (error);
+ break;
case PT_SETDBREGS:
- _PHOLD(p);
error = PROC_WRITE(dbregs, td2, addr);
- _PRELE(p);
- PROC_UNLOCK(p);
- return (error);
+ break;
case PT_GETDBREGS:
- _PHOLD(p);
error = PROC_READ(dbregs, td2, addr);
- _PRELE(p);
- PROC_UNLOCK(p);
- return (error);
+ break;
case PT_LWPINFO:
if (data == 0 || data > sizeof(*pl)) {
error = EINVAL;
- goto fail;
+ break;
}
pl = addr;
pl->pl_lwpid = td2->td_tid;
@@ -983,21 +946,18 @@
} else {
pl->pl_flags = 0;
}
- PROC_UNLOCK(p);
- return (0);
+ break;
case PT_GETNUMLWPS:
td->td_retval[0] = p->p_numthreads;
- PROC_UNLOCK(p);
- return (0);
+ break;
case PT_GETLWPLIST:
if (data <= 0) {
error = EINVAL;
- goto fail;
+ break;
}
num = imin(p->p_numthreads, data);
- _PHOLD(p);
PROC_UNLOCK(p);
buf = malloc(num * sizeof(lwpid_t), M_TEMP, M_WAITOK);
tmp = 0;
@@ -1009,30 +969,30 @@
buf[tmp++] = td2->td_tid;
}
mtx_unlock_spin(&sched_lock);
- _PRELE(p);
PROC_UNLOCK(p);
error = copyout(buf, addr, tmp * sizeof(lwpid_t));
free(buf, M_TEMP);
if (!error)
td->td_retval[0] = num;
- return (error);
+ PROC_LOCK(p);
+ break;
default:
#ifdef __HAVE_PTRACE_MACHDEP
if (req >= PT_FIRSTMACH) {
- _PHOLD(p);
PROC_UNLOCK(p);
error = cpu_ptrace(td2, req, addr, data);
- PRELE(p);
- return (error);
- }
+ PROC_LOCK(p);
+ } else
#endif
+ /* Unknown request. */
+ error = EINVAL;
break;
}
- /* Unknown request. */
- error = EINVAL;
-
+out:
+ /* Drop our hold on this process now that the request has completed. */
+ _PRELE(p);
fail:
PROC_UNLOCK(p);
if (proctree_locked)
More information about the p4-projects
mailing list