Simplify system time accounting for profiling.

Rename struct thread's td_sticks to td_pticks, we will need the
other name for more appropriately named use shortly.  Reduce it
from uint64_t to u_int.

Clear td_pticks whenever we enter the kernel instead of recording
its value as reference for userret().  Use the absolute value of
td->pticks in userret() and eliminate third argument.
This commit is contained in:
Poul-Henning Kamp 2006-02-08 08:09:17 +00:00
parent f2b1bd14dc
commit eb2da9a51f
14 changed files with 49 additions and 72 deletions

View File

@ -259,7 +259,6 @@ trap(a0, a1, a2, entry, framep)
register struct proc *p;
register int i;
u_int64_t ucode;
u_int sticks;
int user;
#ifdef SMP
register_t s;
@ -302,12 +301,11 @@ trap(a0, a1, a2, entry, framep)
CTR5(KTR_TRAP, "%s trap: pid %d, (%lx, %lx, %lx)",
user ? "user" : "kernel", p->p_pid, a0, a1, a2);
if (user) {
sticks = td->td_sticks;
td->td_pticks = 0;
td->td_frame = framep;
if (td->td_ucred != p->p_ucred)
cred_update_thread(td);
} else {
sticks = 0; /* XXX bogus -Wuninitialized warning */
KASSERT(cold || td->td_ucred != NULL,
("kernel trap doesn't have ucred"));
}
@ -595,7 +593,7 @@ trap(a0, a1, a2, entry, framep)
out:
if (user) {
framep->tf_regs[FRAME_SP] = alpha_pal_rdusp();
userret(td, framep, sticks);
userret(td, framep);
mtx_assert(&Giant, MA_NOTOWNED);
}
return;
@ -632,7 +630,6 @@ syscall(code, framep)
struct proc *p;
int error = 0;
u_int64_t opc;
u_int sticks;
u_int64_t args[10]; /* XXX */
u_int hidden = 0, nargs;
#ifdef SMP
@ -664,7 +661,7 @@ syscall(code, framep)
PCPU_LAZY_INC(cnt.v_syscall);
td->td_frame = framep;
opc = framep->tf_regs[FRAME_PC] - 4;
sticks = td->td_sticks;
td->td_pticks = 0;
if (td->td_ucred != p->p_ucred)
cred_update_thread(td);
if (p->p_flag & P_SA)
@ -773,7 +770,7 @@ syscall(code, framep)
if ((callp->sy_narg & SYF_MPSAFE) == 0)
mtx_unlock(&Giant);
userret(td, framep, sticks);
userret(td, framep);
#ifdef KTRACE
if (KTRPOINT(td, KTR_SYSRET))

View File

@ -162,7 +162,6 @@ trap(frame)
{
struct thread *td = curthread;
struct proc *p = td->td_proc;
u_int sticks = 0;
int i = 0, ucode = 0, type, code;
register_t addr = 0;
ksiginfo_t ksi;
@ -254,7 +253,7 @@ trap(frame)
if (ISPL(frame.tf_cs) == SEL_UPL) {
/* user trap */
sticks = td->td_sticks;
td->td_pticks = 0;
td->td_frame = &frame;
addr = frame.tf_rip;
if (td->td_ucred != p->p_ucred)
@ -524,7 +523,7 @@ trap(frame)
#endif
user:
userret(td, &frame, sticks);
userret(td, &frame);
mtx_assert(&Giant, MA_NOTOWNED);
userout:
out:
@ -731,7 +730,6 @@ syscall(frame)
struct thread *td = curthread;
struct proc *p = td->td_proc;
register_t orig_tf_rflags;
u_int sticks;
int error;
int narg;
register_t args[8];
@ -757,7 +755,7 @@ syscall(frame)
reg = 0;
regcnt = 6;
sticks = td->td_sticks;
td->td_pticks = 0;
td->td_frame = &frame;
if (td->td_ucred != p->p_ucred)
cred_update_thread(td);
@ -885,7 +883,7 @@ syscall(frame)
/*
* Handle reschedule and other end-of-syscall issues
*/
userret(td, &frame, sticks);
userret(td, &frame);
CTR4(KTR_SYSC, "syscall exit thread %p pid %d proc %s code %d", td,
td->td_proc->p_pid, td->td_proc->p_comm, code);

View File

@ -96,7 +96,6 @@ ia32_syscall(struct trapframe frame)
struct thread *td = curthread;
struct proc *p = td->td_proc;
register_t orig_tf_rflags;
u_int sticks;
int error;
int narg;
u_int32_t args[8];
@ -110,7 +109,7 @@ ia32_syscall(struct trapframe frame)
*/
PCPU_LAZY_INC(cnt.v_syscall);
sticks = td->td_sticks;
td->td_pticks = 0;
td->td_frame = &frame;
if (td->td_ucred != p->p_ucred)
cred_update_thread(td);
@ -241,7 +240,7 @@ ia32_syscall(struct trapframe frame)
/*
* Handle reschedule and other end-of-syscall issues
*/
userret(td, &frame, sticks);
userret(td, &frame);
#ifdef KTRACE
if (KTRPOINT(td, KTR_SYSRET))

View File

@ -234,7 +234,6 @@ data_abort_handler(trapframe_t *tf)
vm_prot_t ftype;
void *onfault;
vm_offset_t va;
u_int sticks = 0;
int error = 0;
struct ksig ksig;
struct proc *p;
@ -261,7 +260,8 @@ data_abort_handler(trapframe_t *tf)
user = TRAP_USERMODE(tf);
if (user) {
sticks = td->td_sticks; td->td_frame = tf;
td->td_pticks = 0;
td->td_frame = tf;
if (td->td_ucred != td->td_proc->p_ucred)
cred_update_thread(td);
if (td->td_pflags & TDP_SA)
@ -465,7 +465,7 @@ data_abort_handler(trapframe_t *tf)
out:
/* If returning to user mode, make sure to invoke userret() */
if (user)
userret(td, tf, sticks);
userret(td, tf);
}
/*
@ -707,7 +707,6 @@ prefetch_abort_handler(trapframe_t *tf)
struct vm_map *map;
vm_offset_t fault_pc, va;
int error = 0;
u_int sticks = 0;
struct ksig ksig;
@ -754,7 +753,7 @@ prefetch_abort_handler(trapframe_t *tf)
/* Prefetch aborts cannot happen in kernel mode */
if (__predict_false(!TRAP_USERMODE(tf)))
dab_fatal(tf, 0, tf->tf_pc, NULL, &ksig);
sticks = td->td_sticks;
td->td_pticks = 0;
/* Ok validate the address, can only execute in USER space */
@ -809,7 +808,7 @@ prefetch_abort_handler(trapframe_t *tf)
call_trapsignal(td, ksig.signb, ksig.code);
out:
userret(td, tf, sticks);
userret(td, tf);
}
@ -871,10 +870,9 @@ syscall(struct thread *td, trapframe_t *frame, u_int32_t insn)
register_t *ap, *args, copyargs[MAXARGS];
struct sysent *callp;
int locked = 0;
u_int sticks = 0;
PCPU_LAZY_INC(cnt.v_syscall);
sticks = td->td_sticks;
td->td_pticks = 0;
if (td->td_ucred != td->td_proc->p_ucred)
cred_update_thread(td);
switch (insn & SWI_OS_MASK) {
@ -883,11 +881,11 @@ syscall(struct thread *td, trapframe_t *frame, u_int32_t insn)
break;
default:
call_trapsignal(td, SIGILL, 0);
userret(td, frame, td->td_sticks);
userret(td, frame);
return;
}
code = insn & 0x000fffff;
sticks = td->td_sticks;
td->td_pticks = 0;
ap = &frame->tf_r0;
if (code == SYS_syscall) {
code = *ap++;
@ -973,7 +971,7 @@ syscall(struct thread *td, trapframe_t *frame, u_int32_t insn)
mtx_unlock(&Giant);
userret(td, frame, sticks);
userret(td, frame);
CTR4(KTR_SYSC, "syscall exit thread %p pid %d proc %s code %d", td,
td->td_proc->p_pid, td->td_proc->p_comm, code);
@ -995,6 +993,7 @@ swi_handler(trapframe_t *frame)
td->td_frame = frame;
td->td_pticks = 0;
if (td->td_proc->p_flag & P_SA)
thread_user_enter(td);
/*
@ -1003,7 +1002,7 @@ swi_handler(trapframe_t *frame)
*/
if (__predict_false(((frame->tf_pc - INSN_SIZE) & 3) != 0)) {
call_trapsignal(td, SIGILL, 0);
userret(td, frame, td->td_sticks);
userret(td, frame);
return;
}
insn = *(u_int32_t *)(frame->tf_pc - INSN_SIZE);

View File

@ -176,7 +176,6 @@ trap(frame)
{
struct thread *td = curthread;
struct proc *p = td->td_proc;
u_int sticks = 0;
int i = 0, ucode = 0, type, code;
register_t addr = 0;
vm_offset_t eva;
@ -287,7 +286,7 @@ trap(frame)
!(PCPU_GET(curpcb)->pcb_flags & PCB_VM86CALL))) {
/* user trap */
sticks = td->td_sticks;
td->td_pticks = 0;
td->td_frame = &frame;
addr = frame.tf_eip;
if (td->td_ucred != p->p_ucred)
@ -684,7 +683,7 @@ trap(frame)
#endif
user:
userret(td, &frame, sticks);
userret(td, &frame);
mtx_assert(&Giant, MA_NOTOWNED);
userout:
out:
@ -914,7 +913,6 @@ syscall(frame)
struct thread *td = curthread;
struct proc *p = td->td_proc;
register_t orig_tf_eflags;
u_int sticks;
int error;
int narg;
int args[8];
@ -936,7 +934,7 @@ syscall(frame)
}
#endif
sticks = td->td_sticks;
td->td_pticks = 0;
td->td_frame = &frame;
if (td->td_ucred != p->p_ucred)
cred_update_thread(td);
@ -1070,7 +1068,7 @@ syscall(frame)
/*
* Handle reschedule and other end-of-syscall issues
*/
userret(td, &frame, sticks);
userret(td, &frame);
CTR4(KTR_SYSC, "syscall exit thread %p pid %d proc %s code %d", td,
td->td_proc->p_pid, td->td_proc->p_comm, code);

View File

@ -205,7 +205,6 @@ ia32_trap(int vector, struct trapframe *tf)
struct thread *td;
uint64_t ucode;
int sig;
u_int sticks;
ksiginfo_t ksi;
KASSERT(TRAPF_USERMODE(tf), ("%s: In kernel mode???", __func__));
@ -215,7 +214,7 @@ ia32_trap(int vector, struct trapframe *tf)
td = curthread;
td->td_frame = tf;
sticks = td->td_sticks;
td->td_pticks = 0;
p = td->td_proc;
if (td->td_ucred != p->p_ucred)
cred_update_thread(td);
@ -297,7 +296,7 @@ ia32_trap(int vector, struct trapframe *tf)
trapsignal(td, &ksi);
out:
userret(td, tf, sticks);
userret(td, tf);
mtx_assert(&Giant, MA_NOTOWNED);
do_ast(tf);
}

View File

@ -360,7 +360,6 @@ trap(int vector, struct trapframe *tf)
struct thread *td;
uint64_t ucode;
int error, sig, user;
u_int sticks;
ksiginfo_t ksi;
user = TRAPF_USERMODE(tf) ? 1 : 0;
@ -373,12 +372,11 @@ trap(int vector, struct trapframe *tf)
if (user) {
ia64_set_fpsr(IA64_FPSR_DEFAULT);
sticks = td->td_sticks;
td->td_pticks = 0;
td->td_frame = tf;
if (td->td_ucred != p->p_ucred)
cred_update_thread(td);
} else {
sticks = 0; /* XXX bogus -Wuninitialized warning */
KASSERT(cold || td->td_ucred != NULL,
("kernel trap doesn't have ucred"));
#ifdef KDB
@ -877,7 +875,7 @@ trap(int vector, struct trapframe *tf)
out:
if (user) {
userret(td, tf, sticks);
userret(td, tf);
mtx_assert(&Giant, MA_NOTOWNED);
do_ast(tf);
}
@ -943,7 +941,6 @@ syscall(struct trapframe *tf)
struct thread *td;
uint64_t *args;
int code, error;
u_int sticks;
ia64_set_fpsr(IA64_FPSR_DEFAULT);
@ -956,7 +953,7 @@ syscall(struct trapframe *tf)
td->td_frame = tf;
p = td->td_proc;
sticks = td->td_sticks;
td->td_pticks = 0;
if (td->td_ucred != p->p_ucred)
cred_update_thread(td);
if (p->p_flag & P_SA)
@ -1030,7 +1027,7 @@ syscall(struct trapframe *tf)
}
}
userret(td, tf, sticks);
userret(td, tf);
#ifdef KTRACE
if (KTRPOINT(td, KTR_SYSRET))

View File

@ -440,7 +440,7 @@ statclock(int usermode)
} else {
if (p->p_flag & P_SA)
thread_statclock(0);
td->td_sticks++;
td->td_pticks++;
p->p_rux.rux_sticks++;
if (td != PCPU_GET(idlethread))
cp_time[CP_SYS]++;

View File

@ -825,7 +825,7 @@ fork_return(td, frame)
struct trapframe *frame;
{
userret(td, frame, 0);
userret(td, frame);
#ifdef KTRACE
if (KTRPOINT(td, KTR_SYSRET))
ktrsysret(SYS_fork, 0, 0);

View File

@ -74,10 +74,7 @@ __FBSDID("$FreeBSD$");
* MPSAFE
*/
void
userret(td, frame, oticks)
struct thread *td;
struct trapframe *frame;
u_int oticks;
userret(struct thread *td, struct trapframe *frame)
{
struct proc *p = td->td_proc;
@ -127,10 +124,8 @@ userret(td, frame, oticks)
* Charge system time if profiling.
*/
if (p->p_flag & P_PROFIL) {
quad_t ticks;
ticks = td->td_sticks - oticks;
addupc_task(td, TRAPF_PC(frame), (u_int)ticks * psratio);
addupc_task(td, TRAPF_PC(frame), td->td_pticks * psratio);
}
/*
@ -153,7 +148,6 @@ ast(struct trapframe *framep)
struct proc *p;
struct ksegrp *kg;
struct rlimit rlim;
u_int sticks;
int sflag;
int flags;
int sig;
@ -173,7 +167,7 @@ ast(struct trapframe *framep)
mtx_assert(&Giant, MA_NOTOWNED);
mtx_assert(&sched_lock, MA_NOTOWNED);
td->td_frame = framep;
sticks = td->td_sticks;
td->td_pticks = 0;
if ((p->p_flag & P_SA) && (td->td_mailbox == NULL))
thread_user_enter(td);
@ -276,6 +270,6 @@ ast(struct trapframe *framep)
PROC_UNLOCK(p);
}
userret(td, framep, sticks);
userret(td, framep);
mtx_assert(&Giant, MA_NOTOWNED);
}

View File

@ -143,7 +143,7 @@ trap(struct trapframe *frame)
struct thread *td;
struct proc *p;
int sig, type, user;
u_int sticks, ucode;
u_int ucode;
ksiginfo_t ksi;
PCPU_LAZY_INC(cnt.v_trap);
@ -154,13 +154,12 @@ trap(struct trapframe *frame)
type = ucode = frame->exc;
sig = 0;
user = frame->srr1 & PSL_PR;
sticks = 0;
CTR3(KTR_TRAP, "trap: %s type=%s (%s)", p->p_comm,
trapname(type), user ? "user" : "kernel");
if (user) {
sticks = td->td_sticks;
td->td_pticks = 0;
td->td_frame = frame;
if (td->td_ucred != p->p_ucred)
cred_update_thread(td);
@ -263,7 +262,7 @@ trap(struct trapframe *frame)
trapsignal(td, &ksi);
}
userret(td, frame, sticks);
userret(td, frame);
mtx_assert(&Giant, MA_NOTOWNED);
}

View File

@ -143,7 +143,7 @@ trap(struct trapframe *frame)
struct thread *td;
struct proc *p;
int sig, type, user;
u_int sticks, ucode;
u_int ucode;
ksiginfo_t ksi;
PCPU_LAZY_INC(cnt.v_trap);
@ -154,13 +154,12 @@ trap(struct trapframe *frame)
type = ucode = frame->exc;
sig = 0;
user = frame->srr1 & PSL_PR;
sticks = 0;
CTR3(KTR_TRAP, "trap: %s type=%s (%s)", p->p_comm,
trapname(type), user ? "user" : "kernel");
if (user) {
sticks = td->td_sticks;
td->td_pticks = 0;
td->td_frame = frame;
if (td->td_ucred != p->p_ucred)
cred_update_thread(td);
@ -263,7 +262,7 @@ trap(struct trapframe *frame)
trapsignal(td, &ksi);
}
userret(td, frame, sticks);
userret(td, frame);
mtx_assert(&Giant, MA_NOTOWNED);
}

View File

@ -230,7 +230,6 @@ trap(struct trapframe *tf)
{
struct thread *td;
struct proc *p;
u_int sticks;
int error;
int sig;
ksiginfo_t ksi;
@ -248,7 +247,7 @@ trap(struct trapframe *tf)
KASSERT(td->td_proc != NULL, ("trap: curproc NULL"));
p = td->td_proc;
sticks = td->td_sticks;
td->td_pticks = 0;
td->td_frame = tf;
if (td->td_ucred != p->p_ucred)
cred_update_thread(td);
@ -293,7 +292,7 @@ trap(struct trapframe *tf)
trapsignal(td, &ksi);
}
userret(td, tf, sticks);
userret(td, tf);
mtx_assert(&Giant, MA_NOTOWNED);
} else {
KASSERT((tf->tf_type & T_KERNEL) != 0,
@ -502,7 +501,6 @@ syscall(struct trapframe *tf)
register_t args[8];
register_t *argp;
struct proc *p;
u_int sticks;
u_long code;
u_long tpc;
int reg;
@ -523,7 +521,7 @@ syscall(struct trapframe *tf)
reg = 0;
regcnt = REG_MAXARGS;
sticks = td->td_sticks;
td->td_pticks = 0;
td->td_frame = tf;
if (td->td_ucred != p->p_ucred)
cred_update_thread(td);
@ -646,7 +644,7 @@ syscall(struct trapframe *tf)
/*
* Handle reschedule and other end-of-syscall issues
*/
userret(td, tf, sticks);
userret(td, tf);
#ifdef KTRACE
if (KTRPOINT(td, KTR_SYSRET))

View File

@ -282,7 +282,7 @@ struct thread {
struct ucred *td_ucred; /* (k) Reference to credentials. */
struct thread *td_standin; /* (k + a) Use this for an upcall. */
struct kse_upcall *td_upcall; /* (k + j) Upcall structure. */
u_int64_t td_sticks; /* (k) Statclock hits in system mode. */
u_int td_pticks; /* (k) Statclock hits for profiling */
u_int td_uuticks; /* (k) Statclock hits (usr), for UTS. */
u_int td_usticks; /* (k) Statclock hits (sys), for UTS. */
int td_intrval; /* (j) Return value of TDF_INTERRUPT. */
@ -902,7 +902,7 @@ extern void (*cpu_idle_hook)(void); /* Hook to machdep CPU idler. */
void cpu_switch(struct thread *old, struct thread *new);
void cpu_throw(struct thread *old, struct thread *new) __dead2;
void unsleep(struct thread *);
void userret(struct thread *, struct trapframe *, u_int);
void userret(struct thread *, struct trapframe *);
void cpu_exit(struct thread *);
void exit1(struct thread *, int) __dead2;