diff options
author | jhb <jhb@FreeBSD.org> | 2003-06-09 17:38:32 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2003-06-09 17:38:32 +0000 |
commit | ae455223406d6a2cafdf2f32371a238a5975973f (patch) | |
tree | 476de6b4741d7af0272c17c44aeeae777d33f434 /sys | |
parent | 37d801936a730d980f3974cc25bfc18f11d8c1d2 (diff) | |
download | FreeBSD-src-ae455223406d6a2cafdf2f32371a238a5975973f.zip FreeBSD-src-ae455223406d6a2cafdf2f32371a238a5975973f.tar.gz |
- Add a td_pflags field to struct thread for private flags accessed only by
curthread. Unlike td_flags, this field does not need any locking.
- Replace the td_inktr and td_inktrace variables with equivalent private
thread flags.
- Move TDF_OLDMASK over to the private flags field so it no longer requires
sched_lock.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/kern/kern_ktr.c | 6 | ||||
-rw-r--r-- | sys/kern/kern_ktrace.c | 20 | ||||
-rw-r--r-- | sys/kern/kern_sig.c | 18 | ||||
-rw-r--r-- | sys/sys/ktrace.h | 3 | ||||
-rw-r--r-- | sys/sys/proc.h | 9 |
5 files changed, 27 insertions, 29 deletions
diff --git a/sys/kern/kern_ktr.c b/sys/kern/kern_ktr.c index 2454406..7c50790 100644 --- a/sys/kern/kern_ktr.c +++ b/sys/kern/kern_ktr.c @@ -188,9 +188,9 @@ ktr_tracepoint(u_int mask, const char *file, int line, const char *format, return; #if defined(KTR_VERBOSE) || defined(KTR_ALQ) td = curthread; - if (td->td_inktr) + if (td->td_pflags & TDP_INKTR) return; - td->td_inktr++; + td->td_pflags |= TDP_INKTR; #endif #ifdef KTR_ALQ if (ktr_alq_enabled && @@ -247,7 +247,7 @@ ktr_tracepoint(u_int mask, const char *file, int line, const char *format, done: #endif #if defined(KTR_VERBOSE) || defined(KTR_ALQ) - td->td_inktr--; + td->td_pflags &= ~TDP_INKTR; #endif } diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c index 8e97122..ecb2421 100644 --- a/sys/kern/kern_ktrace.c +++ b/sys/kern/kern_ktrace.c @@ -157,12 +157,12 @@ sysctl_kern_ktrace_request_pool(SYSCTL_HANDLER_ARGS) if (error) return (error); td = curthread; - td->td_inktrace = 1; + td->td_pflags |= TDP_INKTRACE; mtx_lock(&ktrace_mtx); oldsize = ktr_requestpool; newsize = ktrace_resize_pool(wantsize); mtx_unlock(&ktrace_mtx); - td->td_inktrace = 0; + td->td_pflags &= ~TDP_INKTRACE; error = SYSCTL_OUT(req, &oldsize, sizeof(uint)); if (error) return (error); @@ -215,11 +215,11 @@ ktr_getrequest(int type) struct proc *p = td->td_proc; int pm; - td->td_inktrace = 1; + td->td_pflags |= TDP_INKTRACE; mtx_lock(&ktrace_mtx); if (!KTRCHECK(td, type)) { mtx_unlock(&ktrace_mtx); - td->td_inktrace = 0; + td->td_pflags &= ~TDP_INKTRACE; return (NULL); } req = STAILQ_FIRST(&ktr_free); @@ -248,7 +248,7 @@ ktr_getrequest(int type) mtx_unlock(&ktrace_mtx); if (pm) printf("Out of ktrace request objects.\n"); - td->td_inktrace = 0; + td->td_pflags &= ~TDP_INKTRACE; } return (req); } @@ -261,7 +261,7 @@ ktr_submitrequest(struct ktr_request *req) STAILQ_INSERT_TAIL(&ktr_todo, req, ktr_list); sema_post(&ktrace_sema); mtx_unlock(&ktrace_mtx); - curthread->td_inktrace = 0; + curthread->td_pflags &= ~TDP_INKTRACE; } static void @@ -514,7 +514,7 @@ ktrace(td, uap) if (ops != KTROP_CLEARFILE && facs == 0) return (EINVAL); - td->td_inktrace = 1; + td->td_pflags |= TDP_INKTRACE; if (ops != KTROP_CLEAR) { /* * an operation which requires a file argument. @@ -525,7 +525,7 @@ ktrace(td, uap) error = vn_open(&nd, &flags, 0); if (error) { mtx_unlock(&Giant); - td->td_inktrace = 0; + td->td_pflags &= ~TDP_INKTRACE; return (error); } NDFREE(&nd, NDF_ONLY_PNBUF); @@ -534,7 +534,7 @@ ktrace(td, uap) if (vp->v_type != VREG) { (void) vn_close(vp, FREAD|FWRITE, td->td_ucred, td); mtx_unlock(&Giant); - td->td_inktrace = 0; + td->td_pflags &= ~TDP_INKTRACE; return (EACCES); } mtx_unlock(&Giant); @@ -623,7 +623,7 @@ done: (void) vn_close(vp, FWRITE, td->td_ucred, td); mtx_unlock(&Giant); } - td->td_inktrace = 0; + td->td_pflags &= ~TDP_INKTRACE; return (error); #else /* !KTRACE */ return (ENOSYS); diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index ef4948f..6126f5f 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -874,7 +874,7 @@ out: mtx_unlock(&ps->ps_mtx); #ifdef KTRACE if (KTRPOINT(td, KTR_PSIG)) - ktrpsig(sig, action, td->td_flags & TDF_OLDMASK ? + ktrpsig(sig, action, td->td_pflags & TDP_OLDMASK ? &td->td_oldsigmask : &td->td_sigmask, 0); #endif _STOPEVENT(p, S_SIG, sig); @@ -1089,9 +1089,7 @@ kern_sigsuspend(struct thread *td, sigset_t mask) */ PROC_LOCK(p); td->td_oldsigmask = td->td_sigmask; - mtx_lock_spin(&sched_lock); - td->td_flags |= TDF_OLDMASK; - mtx_unlock_spin(&sched_lock); + td->td_pflags |= TDP_OLDMASK; SIG_CANTMASK(mask); td->td_sigmask = mask; signotify(td); @@ -1122,9 +1120,7 @@ osigsuspend(td, uap) PROC_LOCK(p); td->td_oldsigmask = td->td_sigmask; - mtx_lock_spin(&sched_lock); - td->td_flags |= TDF_OLDMASK; - mtx_unlock_spin(&sched_lock); + td->td_pflags |= TDP_OLDMASK; OSIG2SIG(uap->mask, mask); SIG_CANTMASK(mask); SIGSETLO(td->td_sigmask, mask); @@ -2136,7 +2132,7 @@ postsig(sig) action = ps->ps_sigact[_SIG_IDX(sig)]; #ifdef KTRACE if (KTRPOINT(td, KTR_PSIG)) - ktrpsig(sig, action, td->td_flags & TDF_OLDMASK ? + ktrpsig(sig, action, td->td_pflags & TDP_OLDMASK ? &td->td_oldsigmask : &td->td_sigmask, 0); #endif _STOPEVENT(p, S_SIG, sig); @@ -2164,11 +2160,9 @@ postsig(sig) * mask from before the sigsuspend is what we want * restored after the signal processing is completed. */ - if (td->td_flags & TDF_OLDMASK) { + if (td->td_pflags & TDP_OLDMASK) { returnmask = td->td_oldsigmask; - mtx_lock_spin(&sched_lock); - td->td_flags &= ~TDF_OLDMASK; - mtx_unlock_spin(&sched_lock); + td->td_pflags &= ~TDP_OLDMASK; } else returnmask = td->td_sigmask; diff --git a/sys/sys/ktrace.h b/sys/sys/ktrace.h index 8fffcaf..cff0e91 100644 --- a/sys/sys/ktrace.h +++ b/sys/sys/ktrace.h @@ -70,7 +70,8 @@ struct ktr_header { * is the public interface. */ #define KTRCHECK(td, type) ((td)->td_proc->p_traceflag & (1 << type)) -#define KTRPOINT(td, type) (KTRCHECK((td), (type)) && !(td)->td_inktrace) +#define KTRPOINT(td, type) \ + (KTRCHECK((td), (type)) && !((td)->td_pflags & TDP_INKTRACE)) /* * ktrace record types diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 125e690..dec25e5 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -269,14 +269,13 @@ struct thread { #define td_startzero td_flags int td_flags; /* (j) TDF_* flags. */ int td_inhibitors; /* (j) Why can not run */ + int td_pflags; /* (k) Private thread (TDP_*) flags. */ struct kse *td_last_kse; /* (j) Previous value of td_kse */ struct kse *td_kse; /* (j) Current KSE if running. */ int td_dupfd; /* (k) Ret value from fdopen. XXX */ void *td_wchan; /* (j) Sleep address. */ const char *td_wmesg; /* (j) Reason for sleep. */ u_char td_lastcpu; /* (j) Last cpu we were on. */ - u_char td_inktr; /* (k) Currently handling a KTR. */ - u_char td_inktrace; /* (k) Currently handling a KTRACE. */ u_char td_oncpu; /* (j) Which cpu we are on. */ short td_locks; /* (k) DEBUG: lockmgr count of locks */ struct mtx *td_blocked; /* (j) Mutex process is blocked on. */ @@ -333,7 +332,6 @@ struct thread { struct td_sched *td_sched; /* (*) Scheduler specific data */ }; /* flags kept in td_flags */ -#define TDF_OLDMASK 0x000001 /* Need to restore mask after suspend. */ #define TDF_INPANIC 0x000002 /* Caused a panic, let it drive crashdump. */ #define TDF_CAN_UNBIND 0x000004 /* Only temporarily bound. */ #define TDF_SINTR 0x000008 /* Sleep is interruptible. */ @@ -352,6 +350,11 @@ struct thread { #define TDF_NEEDSIGCHK 0x020000 /* Thread may need signal delivery. */ #define TDF_DEADLKTREAT 0x800000 /* Lock aquisition - deadlock treatment. */ +/* "private" flags kept in td_pflags */ +#define TDP_OLDMASK 0x0001 /* Need to restore mask after suspend. */ +#define TDP_INKTR 0x0002 /* Thread is currently in KTR code. */ +#define TDP_INKTRACE 0x0004 /* Thread is currently in KTRACE code. */ + #define TDI_SUSPENDED 0x0001 /* On suspension queue. */ #define TDI_SLEEPING 0x0002 /* Actually asleep! (tricky). */ #define TDI_SWAPPED 0x0004 /* Stack not in mem.. bad juju if run. */ |