From d3d65c6b2e376ac074f3ca386b6f5b70ea37636f Mon Sep 17 00:00:00 2001 From: phk Date: Thu, 28 May 1998 09:30:28 +0000 Subject: Some cleanups related to timecounters and weird ifdefs in . Clean up (or if antipodic: down) some of the msgbuf stuff. Use an inline function rather than a macro for timecounter delta. Maintain process "on-cpu" time as 64 bits of microseconds to avoid needless second rollover overhead. Avoid calling microuptime the second time in mi_switch() if we do not pass through _idle in cpu_switch() This should reduce our context-switch overhead a bit, in particular on pre-P5 and SMP systems. WARNING: Programs which muck about with struct proc in userland will have to be fixed. Reviewed, but found imperfect by: bde --- bin/ps/print.c | 28 ++++++++++++------------- sys/amd64/amd64/cpu_switch.S | 6 +++++- sys/amd64/amd64/exception.S | 4 ++-- sys/amd64/amd64/exception.s | 4 ++-- sys/amd64/amd64/genassym.c | 5 +++-- sys/amd64/amd64/machdep.c | 13 ++---------- sys/amd64/amd64/swtch.s | 6 +++++- sys/amd64/amd64/tsc.c | 6 +++--- sys/amd64/include/pcpu.h | 3 ++- sys/amd64/isa/clock.c | 6 +++--- sys/ddb/db_print.c | 28 +------------------------ sys/i386/i386/exception.s | 4 ++-- sys/i386/i386/genassym.c | 5 +++-- sys/i386/i386/globals.s | 5 +++-- sys/i386/i386/machdep.c | 13 ++---------- sys/i386/i386/swtch.s | 6 +++++- sys/i386/i386/tsc.c | 6 +++--- sys/i386/include/globaldata.h | 3 ++- sys/i386/include/pcpu.h | 3 ++- sys/i386/isa/clock.c | 6 +++--- sys/isa/atrtc.c | 6 +++--- sys/kern/init_main.c | 12 ++++++----- sys/kern/kern_clock.c | 27 ++++++++++++++---------- sys/kern/kern_resource.c | 25 ++++++++++++---------- sys/kern/kern_synch.c | 44 ++++++++++++++------------------------ sys/kern/kern_tc.c | 27 ++++++++++++++---------- sys/kern/subr_log.c | 5 +---- sys/kern/subr_prf.c | 49 +++++++++++++++++++++++++++++++++++++++---- sys/sys/msgbuf.h | 15 +++++++------ sys/sys/proc.h | 7 ++++--- sys/sys/resourcevar.h | 3 ++- sys/sys/time.h | 8 +++---- sys/sys/timetc.h | 8 +++---- usr.bin/top/machine.c | 6 +++--- 34 files changed, 211 insertions(+), 191 deletions(-) diff --git a/bin/ps/print.c b/bin/ps/print.c index 5d7a0fd..a2b69be 100644 --- a/bin/ps/print.c +++ b/bin/ps/print.c @@ -36,7 +36,7 @@ static char sccsid[] = "@(#)print.c 8.6 (Berkeley) 4/16/94"; #endif static const char rcsid[] = - "$Id: print.c,v 1.25 1998/05/15 06:29:16 charnier Exp $"; + "$Id: print.c,v 1.26 1998/05/25 05:07:18 steve Exp $"; #endif /* not lint */ #include @@ -446,35 +446,35 @@ cputime(k, ve) VARENT *ve; { VAR *v; + int64_t sec; long secs; long psecs; /* "parts" of a second. first micro, then centi */ char obuff[128]; v = ve->var; if (KI_PROC(k)->p_stat == SZOMB || !k->ki_u.u_valid) { - secs = 0; - psecs = 0; + sec = 0; } else { /* * This counts time spent handling interrupts. We could * fix this, but it is not 100% trivial (and interrupt * time fractions only work on the sparc anyway). XXX */ - secs = KI_PROC(k)->p_rtime.tv_sec; - psecs = KI_PROC(k)->p_rtime.tv_usec; + sec = KI_PROC(k)->p_runtime; if (sumrusage) { - secs += k->ki_u.u_cru.ru_utime.tv_sec + - k->ki_u.u_cru.ru_stime.tv_sec; - psecs += k->ki_u.u_cru.ru_utime.tv_usec + + sec += (k->ki_u.u_cru.ru_utime.tv_sec + + k->ki_u.u_cru.ru_stime.tv_sec) * + (int64_t)1000000; + sec += k->ki_u.u_cru.ru_utime.tv_usec + k->ki_u.u_cru.ru_stime.tv_usec; } - /* - * round and scale to 100's - */ - psecs = (psecs + 5000) / 10000; - secs += psecs / 100; - psecs = psecs % 100; } + /* + * round and scale to 100's + */ + sec = (sec + 5000) / 10000; + secs = sec / 100; + psecs = sec % 100; (void)snprintf(obuff, sizeof(obuff), "%3ld:%02ld.%02ld", secs/60, secs%60, psecs); (void)printf("%*s", v->width, obuff); diff --git a/sys/amd64/amd64/cpu_switch.S b/sys/amd64/amd64/cpu_switch.S index 5641ee9..e952f68 100644 --- a/sys/amd64/amd64/cpu_switch.S +++ b/sys/amd64/amd64/cpu_switch.S @@ -33,7 +33,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: swtch.s,v 1.72 1998/05/12 18:37:10 dyson Exp $ + * $Id: swtch.s,v 1.73 1998/05/19 20:59:07 dufault Exp $ */ #include "npx.h" @@ -251,6 +251,10 @@ rem3id: .asciz "remrq.id" */ ALIGN_TEXT _idle: + xorl %eax,%eax + movl %eax, _switchtime + movl %eax, _switchtime+4 + #ifdef SMP /* when called, we have the mplock, intr disabled */ diff --git a/sys/amd64/amd64/exception.S b/sys/amd64/amd64/exception.S index 569d6c0..9802230 100644 --- a/sys/amd64/amd64/exception.S +++ b/sys/amd64/amd64/exception.S @@ -30,7 +30,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: exception.s,v 1.51 1998/04/17 22:36:27 des Exp $ + * $Id: exception.s,v 1.52 1998/05/17 11:51:53 phk Exp $ */ #include "npx.h" @@ -344,7 +344,7 @@ IDTVEC(int0x80_syscall) ENTRY(fork_trampoline) call _spl0 movl _curproc,%eax - addl $P_RUNTIME,%eax + addl $P_SWITCHTIME,%eax pushl %eax call _microuptime popl %eax diff --git a/sys/amd64/amd64/exception.s b/sys/amd64/amd64/exception.s index 569d6c0..9802230 100644 --- a/sys/amd64/amd64/exception.s +++ b/sys/amd64/amd64/exception.s @@ -30,7 +30,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: exception.s,v 1.51 1998/04/17 22:36:27 des Exp $ + * $Id: exception.s,v 1.52 1998/05/17 11:51:53 phk Exp $ */ #include "npx.h" @@ -344,7 +344,7 @@ IDTVEC(int0x80_syscall) ENTRY(fork_trampoline) call _spl0 movl _curproc,%eax - addl $P_RUNTIME,%eax + addl $P_SWITCHTIME,%eax pushl %eax call _microuptime popl %eax diff --git a/sys/amd64/amd64/genassym.c b/sys/amd64/amd64/genassym.c index 771cab8..ee082a8 100644 --- a/sys/amd64/amd64/genassym.c +++ b/sys/amd64/amd64/genassym.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)genassym.c 5.11 (Berkeley) 5/10/91 - * $Id: genassym.c,v 1.56 1998/05/17 22:12:07 tegge Exp $ + * $Id: genassym.c,v 1.57 1998/05/17 23:08:03 tegge Exp $ */ #include "opt_vm86.h" @@ -106,7 +106,7 @@ main() printf("#define\tP_WCHAN %p\n", &p->p_wchan); printf("#define\tP_FLAG %p\n", &p->p_flag); printf("#define\tP_PID %p\n", &p->p_pid); - printf("#define\tP_RUNTIME %p\n", &p->p_runtime); + printf("#define\tP_SWITCHTIME %p\n", &p->p_switchtime); #ifdef SMP printf("#define\tP_ONCPU %p\n", &p->p_oncpu); printf("#define\tP_LASTCPU %p\n", &p->p_lastcpu); @@ -208,6 +208,7 @@ main() printf("#define\tGD_NPXPROC %d\n", &globaldata->npxproc); printf("#define\tGD_CURPCB %d\n", &globaldata->curpcb); printf("#define\tGD_COMMON_TSS %d\n", &globaldata->common_tss); + printf("#define\tGD_SWITCHTIME %d\n", &globaldata->switchtime); #ifdef VM86 printf("#define\tGD_COMMON_TSSD %d\n", &globaldata->common_tssd); printf("#define\tGD_PRIVATE_TSS %d\n", &globaldata->private_tss); diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c index 9ffd017..dbfa555 100644 --- a/sys/amd64/amd64/machdep.c +++ b/sys/amd64/amd64/machdep.c @@ -35,7 +35,7 @@ * SUCH DAMAGE. * * from: @(#)machdep.c 7.4 (Berkeley) 6/3/91 - * $Id: machdep.c,v 1.295 1998/05/19 00:00:09 tegge Exp $ + * $Id: machdep.c,v 1.296 1998/05/19 08:58:46 phk Exp $ */ #include "apm.h" @@ -146,7 +146,6 @@ int bouncepages = 0; #endif #endif /* BOUNCE_BUFFERS */ -int msgbufmapped = 0; /* set when safe to use msgbuf */ int _udatasel, _ucodesel; u_int atdevbase; @@ -1525,15 +1524,7 @@ init386(first) pmap_enter(kernel_pmap, (vm_offset_t)msgbufp + off, avail_end + off, VM_PROT_ALL, TRUE); - cp = (char *)msgbufp; - msgbufp = (struct msgbuf *) (cp + MSGBUF_SIZE - sizeof(*msgbufp)); - if (msgbufp->msg_magic != MSG_MAGIC || msgbufp->msg_ptr != cp) { - bzero(cp, MSGBUF_SIZE); - msgbufp->msg_magic = MSG_MAGIC; - msgbufp->msg_size = (char *)msgbufp - cp; - msgbufp->msg_ptr = cp; - } - msgbufmapped = 1; + msgbufinit(msgbufp, MSGBUF_SIZE); /* make a call gate to reenter kernel with */ gdp = &ldt[LSYS5CALLS_SEL].gd; diff --git a/sys/amd64/amd64/swtch.s b/sys/amd64/amd64/swtch.s index 5641ee9..e952f68 100644 --- a/sys/amd64/amd64/swtch.s +++ b/sys/amd64/amd64/swtch.s @@ -33,7 +33,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: swtch.s,v 1.72 1998/05/12 18:37:10 dyson Exp $ + * $Id: swtch.s,v 1.73 1998/05/19 20:59:07 dufault Exp $ */ #include "npx.h" @@ -251,6 +251,10 @@ rem3id: .asciz "remrq.id" */ ALIGN_TEXT _idle: + xorl %eax,%eax + movl %eax, _switchtime + movl %eax, _switchtime+4 + #ifdef SMP /* when called, we have the mplock, intr disabled */ diff --git a/sys/amd64/amd64/tsc.c b/sys/amd64/amd64/tsc.c index 315e61a..671a3be 100644 --- a/sys/amd64/amd64/tsc.c +++ b/sys/amd64/amd64/tsc.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)clock.c 7.2 (Berkeley) 5/12/91 - * $Id: clock.c,v 1.119 1998/04/05 01:04:48 tegge Exp $ + * $Id: clock.c,v 1.120 1998/05/19 18:48:30 phk Exp $ */ /* @@ -1129,7 +1129,7 @@ sysctl_machdep_tsc_freq SYSCTL_HANDLER_ARGS SYSCTL_PROC(_machdep, OID_AUTO, tsc_freq, CTLTYPE_INT | CTLFLAG_RW, 0, sizeof(u_int), sysctl_machdep_tsc_freq, "I", ""); -static u_int +static unsigned i8254_get_timecount(void) { u_int count; @@ -1158,7 +1158,7 @@ i8254_get_timecount(void) return (count); } -static u_int +static unsigned tsc_get_timecount(void) { return (rdtsc()); diff --git a/sys/amd64/include/pcpu.h b/sys/amd64/include/pcpu.h index af8e806..c6c5a17 100644 --- a/sys/amd64/include/pcpu.h +++ b/sys/amd64/include/pcpu.h @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: globaldata.h,v 1.3 1998/05/17 18:53:07 tegge Exp $ + * $Id: globaldata.h,v 1.4 1998/05/17 23:08:02 tegge Exp $ */ /* @@ -43,6 +43,7 @@ struct globaldata { struct proc *npxproc; struct pcb *curpcb; struct i386tss common_tss; + struct timeval switchtime; #ifdef VM86 struct segment_descriptor common_tssd; u_int private_tss; diff --git a/sys/amd64/isa/clock.c b/sys/amd64/isa/clock.c index 315e61a..671a3be 100644 --- a/sys/amd64/isa/clock.c +++ b/sys/amd64/isa/clock.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)clock.c 7.2 (Berkeley) 5/12/91 - * $Id: clock.c,v 1.119 1998/04/05 01:04:48 tegge Exp $ + * $Id: clock.c,v 1.120 1998/05/19 18:48:30 phk Exp $ */ /* @@ -1129,7 +1129,7 @@ sysctl_machdep_tsc_freq SYSCTL_HANDLER_ARGS SYSCTL_PROC(_machdep, OID_AUTO, tsc_freq, CTLTYPE_INT | CTLFLAG_RW, 0, sizeof(u_int), sysctl_machdep_tsc_freq, "I", ""); -static u_int +static unsigned i8254_get_timecount(void) { u_int count; @@ -1158,7 +1158,7 @@ i8254_get_timecount(void) return (count); } -static u_int +static unsigned tsc_get_timecount(void) { return (rdtsc()); diff --git a/sys/ddb/db_print.c b/sys/ddb/db_print.c index f6db84f..49a580b 100644 --- a/sys/ddb/db_print.c +++ b/sys/ddb/db_print.c @@ -23,7 +23,7 @@ * any improvements or extensions that they make and grant Carnegie the * rights to redistribute these changes. * - * $Id: db_print.c,v 1.15 1998/05/19 11:02:23 phk Exp $ + * $Id: db_print.c,v 1.16 1998/05/19 18:42:06 phk Exp $ */ /* @@ -35,8 +35,6 @@ * Miscellaneous printing. */ #include -#include -#include #include #include @@ -67,27 +65,3 @@ db_show_regs(dummy1, dummy2, dummy3, dummy4) db_print_loc_and_inst(PC_REGS(DDB_REGS)); } - -DB_SHOW_COMMAND(msgbuf, db_show_msgbuf) -{ - int i,j; - - if (!msgbufmapped) { - db_printf("msgbuf not mapped yet\n"); - return; - } - db_printf("msgbufp = %p\n", msgbufp); - db_printf("magic = %x, size = %d, r= %d, w = %d, ptr = %p\n", - msgbufp->msg_magic, - msgbufp->msg_size, - msgbufp->msg_bufr, - msgbufp->msg_bufx, - msgbufp->msg_ptr); - for (i = 0; i < msgbufp->msg_size; i++) { - j = msgbufp->msg_ptr[(i + msgbufp->msg_bufr) % msgbufp->msg_size]; - if (j) - db_printf("%c", j); - } - db_printf("\n"); -} - diff --git a/sys/i386/i386/exception.s b/sys/i386/i386/exception.s index 569d6c0..9802230 100644 --- a/sys/i386/i386/exception.s +++ b/sys/i386/i386/exception.s @@ -30,7 +30,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: exception.s,v 1.51 1998/04/17 22:36:27 des Exp $ + * $Id: exception.s,v 1.52 1998/05/17 11:51:53 phk Exp $ */ #include "npx.h" @@ -344,7 +344,7 @@ IDTVEC(int0x80_syscall) ENTRY(fork_trampoline) call _spl0 movl _curproc,%eax - addl $P_RUNTIME,%eax + addl $P_SWITCHTIME,%eax pushl %eax call _microuptime popl %eax diff --git a/sys/i386/i386/genassym.c b/sys/i386/i386/genassym.c index 771cab8..ee082a8 100644 --- a/sys/i386/i386/genassym.c +++ b/sys/i386/i386/genassym.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)genassym.c 5.11 (Berkeley) 5/10/91 - * $Id: genassym.c,v 1.56 1998/05/17 22:12:07 tegge Exp $ + * $Id: genassym.c,v 1.57 1998/05/17 23:08:03 tegge Exp $ */ #include "opt_vm86.h" @@ -106,7 +106,7 @@ main() printf("#define\tP_WCHAN %p\n", &p->p_wchan); printf("#define\tP_FLAG %p\n", &p->p_flag); printf("#define\tP_PID %p\n", &p->p_pid); - printf("#define\tP_RUNTIME %p\n", &p->p_runtime); + printf("#define\tP_SWITCHTIME %p\n", &p->p_switchtime); #ifdef SMP printf("#define\tP_ONCPU %p\n", &p->p_oncpu); printf("#define\tP_LASTCPU %p\n", &p->p_lastcpu); @@ -208,6 +208,7 @@ main() printf("#define\tGD_NPXPROC %d\n", &globaldata->npxproc); printf("#define\tGD_CURPCB %d\n", &globaldata->curpcb); printf("#define\tGD_COMMON_TSS %d\n", &globaldata->common_tss); + printf("#define\tGD_SWITCHTIME %d\n", &globaldata->switchtime); #ifdef VM86 printf("#define\tGD_COMMON_TSSD %d\n", &globaldata->common_tssd); printf("#define\tGD_PRIVATE_TSS %d\n", &globaldata->private_tss); diff --git a/sys/i386/i386/globals.s b/sys/i386/i386/globals.s index 871bb67..a183a2a 100644 --- a/sys/i386/i386/globals.s +++ b/sys/i386/i386/globals.s @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: globals.s,v 1.3 1998/05/17 18:53:19 tegge Exp $ + * $Id: globals.s,v 1.4 1998/05/17 23:08:03 tegge Exp $ */ #include "opt_vm86.h" @@ -68,11 +68,12 @@ globaldata: .space GD_SIZEOF /* in data segment */ #endif - .globl _curproc,_curpcb,_npxproc,_common_tss + .globl _curproc,_curpcb,_npxproc,_common_tss,_switchtime .set _curproc,globaldata + GD_CURPROC .set _curpcb,globaldata + GD_CURPCB .set _npxproc,globaldata + GD_NPXPROC .set _common_tss,globaldata + GD_COMMON_TSS + .set _switchtime,globaldata + GD_SWITCHTIME #ifdef VM86 .globl _common_tssd,_private_tss,_my_tr diff --git a/sys/i386/i386/machdep.c b/sys/i386/i386/machdep.c index 9ffd017..dbfa555 100644 --- a/sys/i386/i386/machdep.c +++ b/sys/i386/i386/machdep.c @@ -35,7 +35,7 @@ * SUCH DAMAGE. * * from: @(#)machdep.c 7.4 (Berkeley) 6/3/91 - * $Id: machdep.c,v 1.295 1998/05/19 00:00:09 tegge Exp $ + * $Id: machdep.c,v 1.296 1998/05/19 08:58:46 phk Exp $ */ #include "apm.h" @@ -146,7 +146,6 @@ int bouncepages = 0; #endif #endif /* BOUNCE_BUFFERS */ -int msgbufmapped = 0; /* set when safe to use msgbuf */ int _udatasel, _ucodesel; u_int atdevbase; @@ -1525,15 +1524,7 @@ init386(first) pmap_enter(kernel_pmap, (vm_offset_t)msgbufp + off, avail_end + off, VM_PROT_ALL, TRUE); - cp = (char *)msgbufp; - msgbufp = (struct msgbuf *) (cp + MSGBUF_SIZE - sizeof(*msgbufp)); - if (msgbufp->msg_magic != MSG_MAGIC || msgbufp->msg_ptr != cp) { - bzero(cp, MSGBUF_SIZE); - msgbufp->msg_magic = MSG_MAGIC; - msgbufp->msg_size = (char *)msgbufp - cp; - msgbufp->msg_ptr = cp; - } - msgbufmapped = 1; + msgbufinit(msgbufp, MSGBUF_SIZE); /* make a call gate to reenter kernel with */ gdp = &ldt[LSYS5CALLS_SEL].gd; diff --git a/sys/i386/i386/swtch.s b/sys/i386/i386/swtch.s index 5641ee9..e952f68 100644 --- a/sys/i386/i386/swtch.s +++ b/sys/i386/i386/swtch.s @@ -33,7 +33,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: swtch.s,v 1.72 1998/05/12 18:37:10 dyson Exp $ + * $Id: swtch.s,v 1.73 1998/05/19 20:59:07 dufault Exp $ */ #include "npx.h" @@ -251,6 +251,10 @@ rem3id: .asciz "remrq.id" */ ALIGN_TEXT _idle: + xorl %eax,%eax + movl %eax, _switchtime + movl %eax, _switchtime+4 + #ifdef SMP /* when called, we have the mplock, intr disabled */ diff --git a/sys/i386/i386/tsc.c b/sys/i386/i386/tsc.c index 315e61a..671a3be 100644 --- a/sys/i386/i386/tsc.c +++ b/sys/i386/i386/tsc.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)clock.c 7.2 (Berkeley) 5/12/91 - * $Id: clock.c,v 1.119 1998/04/05 01:04:48 tegge Exp $ + * $Id: clock.c,v 1.120 1998/05/19 18:48:30 phk Exp $ */ /* @@ -1129,7 +1129,7 @@ sysctl_machdep_tsc_freq SYSCTL_HANDLER_ARGS SYSCTL_PROC(_machdep, OID_AUTO, tsc_freq, CTLTYPE_INT | CTLFLAG_RW, 0, sizeof(u_int), sysctl_machdep_tsc_freq, "I", ""); -static u_int +static unsigned i8254_get_timecount(void) { u_int count; @@ -1158,7 +1158,7 @@ i8254_get_timecount(void) return (count); } -static u_int +static unsigned tsc_get_timecount(void) { return (rdtsc()); diff --git a/sys/i386/include/globaldata.h b/sys/i386/include/globaldata.h index af8e806..c6c5a17 100644 --- a/sys/i386/include/globaldata.h +++ b/sys/i386/include/globaldata.h @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: globaldata.h,v 1.3 1998/05/17 18:53:07 tegge Exp $ + * $Id: globaldata.h,v 1.4 1998/05/17 23:08:02 tegge Exp $ */ /* @@ -43,6 +43,7 @@ struct globaldata { struct proc *npxproc; struct pcb *curpcb; struct i386tss common_tss; + struct timeval switchtime; #ifdef VM86 struct segment_descriptor common_tssd; u_int private_tss; diff --git a/sys/i386/include/pcpu.h b/sys/i386/include/pcpu.h index af8e806..c6c5a17 100644 --- a/sys/i386/include/pcpu.h +++ b/sys/i386/include/pcpu.h @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: globaldata.h,v 1.3 1998/05/17 18:53:07 tegge Exp $ + * $Id: globaldata.h,v 1.4 1998/05/17 23:08:02 tegge Exp $ */ /* @@ -43,6 +43,7 @@ struct globaldata { struct proc *npxproc; struct pcb *curpcb; struct i386tss common_tss; + struct timeval switchtime; #ifdef VM86 struct segment_descriptor common_tssd; u_int private_tss; diff --git a/sys/i386/isa/clock.c b/sys/i386/isa/clock.c index 315e61a..671a3be 100644 --- a/sys/i386/isa/clock.c +++ b/sys/i386/isa/clock.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)clock.c 7.2 (Berkeley) 5/12/91 - * $Id: clock.c,v 1.119 1998/04/05 01:04:48 tegge Exp $ + * $Id: clock.c,v 1.120 1998/05/19 18:48:30 phk Exp $ */ /* @@ -1129,7 +1129,7 @@ sysctl_machdep_tsc_freq SYSCTL_HANDLER_ARGS SYSCTL_PROC(_machdep, OID_AUTO, tsc_freq, CTLTYPE_INT | CTLFLAG_RW, 0, sizeof(u_int), sysctl_machdep_tsc_freq, "I", ""); -static u_int +static unsigned i8254_get_timecount(void) { u_int count; @@ -1158,7 +1158,7 @@ i8254_get_timecount(void) return (count); } -static u_int +static unsigned tsc_get_timecount(void) { return (rdtsc()); diff --git a/sys/isa/atrtc.c b/sys/isa/atrtc.c index 315e61a..671a3be 100644 --- a/sys/isa/atrtc.c +++ b/sys/isa/atrtc.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)clock.c 7.2 (Berkeley) 5/12/91 - * $Id: clock.c,v 1.119 1998/04/05 01:04:48 tegge Exp $ + * $Id: clock.c,v 1.120 1998/05/19 18:48:30 phk Exp $ */ /* @@ -1129,7 +1129,7 @@ sysctl_machdep_tsc_freq SYSCTL_HANDLER_ARGS SYSCTL_PROC(_machdep, OID_AUTO, tsc_freq, CTLTYPE_INT | CTLFLAG_RW, 0, sizeof(u_int), sysctl_machdep_tsc_freq, "I", ""); -static u_int +static unsigned i8254_get_timecount(void) { u_int count; @@ -1158,7 +1158,7 @@ i8254_get_timecount(void) return (count); } -static u_int +static unsigned tsc_get_timecount(void) { return (rdtsc()); diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c index ba263aa..ea599a7 100644 --- a/sys/kern/init_main.c +++ b/sys/kern/init_main.c @@ -39,7 +39,7 @@ * SUCH DAMAGE. * * @(#)init_main.c 8.9 (Berkeley) 1/21/94 - * $Id: init_main.c,v 1.91 1998/04/19 23:31:54 julian Exp $ + * $Id: init_main.c,v 1.92 1998/05/17 11:52:35 phk Exp $ */ #include "opt_devfs.h" @@ -377,8 +377,10 @@ proc0_init(dummy) limit0.pl_rlimit[RLIMIT_RSS].rlim_max = i; limit0.pl_rlimit[RLIMIT_MEMLOCK].rlim_max = i; limit0.pl_rlimit[RLIMIT_MEMLOCK].rlim_cur = i / 3; + limit0.p_cpulimit = RLIM_INFINITY; limit0.p_refcnt = 1; + /* Allocate a prototype map so we have something to fork. */ pmap_pinit0(&vmspace0.vm_pmap); p->p_vmspace = &vmspace0; @@ -426,13 +428,13 @@ proc0_post(dummy) /* * Now can look at time, having had a chance to verify the time - * from the file system. Reset p->p_rtime as it may have been + * from the file system. Reset p->p_runtime as it may have been * munched in mi_switch() after the time got set. Set - * p->p_runtime to be consistent with this unmunching. + * p->p_switchtime to be consistent with this unmunching. */ microtime(&proc0.p_stats->p_start); - timevalclear(&proc0.p_rtime); - microuptime(&proc0.p_runtime); + proc0.p_runtime = 0; + microuptime(&proc0.p_switchtime); /* * Give the ``random'' number generator a thump. diff --git a/sys/kern/kern_clock.c b/sys/kern/kern_clock.c index 1cb2233..5334bf0 100644 --- a/sys/kern/kern_clock.c +++ b/sys/kern/kern_clock.c @@ -39,7 +39,7 @@ static volatile int print_tci = 1; * SUCH DAMAGE. * * @(#)kern_clock.c 8.5 (Berkeley) 1/21/94 - * $Id: kern_clock.c,v 1.68 1998/05/17 11:52:39 phk Exp $ + * $Id: kern_clock.c,v 1.69 1998/05/19 18:54:38 phk Exp $ */ #include @@ -73,6 +73,7 @@ SYSINIT(clocks, SI_SUB_CLOCKS, SI_ORDER_FIRST, initclocks, NULL) static void tco_forward __P((void)); static void tco_setscales __P((struct timecounter *tc)); +static __inline unsigned tco_getdelta __P((struct timecounter *tc)); /* Some of these don't belong here, but it's easiest to concentrate them. */ #if defined(SMP) && defined(BETTER_CLOCK) @@ -493,8 +494,12 @@ sysctl_kern_clockrate SYSCTL_HANDLER_ARGS SYSCTL_PROC(_kern, KERN_CLOCKRATE, clockrate, CTLTYPE_STRUCT|CTLFLAG_RD, 0, 0, sysctl_kern_clockrate, "S,clockinfo",""); -#define TC_DELTA(tc) \ - (((tc)->get_timecount() - (tc)->offset_count) & (tc)->counter_mask) +static __inline unsigned +tco_getdelta(struct timecounter *tc) +{ + + return ((tc->get_timecount() - tc->offset_count) & tc->counter_mask); +} /* * We have four functions for looking at the clock, two for microseconds @@ -530,7 +535,7 @@ microtime(struct timeval *tv) tc = (struct timecounter *)timecounter; tv->tv_sec = tc->offset_sec; tv->tv_usec = tc->offset_micro; - tv->tv_usec += ((u_int64_t)TC_DELTA(tc) * tc->scale_micro) >> 32; + tv->tv_usec += ((u_int64_t)tco_getdelta(tc) * tc->scale_micro) >> 32; tv->tv_usec += boottime.tv_usec; tv->tv_sec += boottime.tv_sec; while (tv->tv_usec >= 1000000) { @@ -548,7 +553,7 @@ nanotime(struct timespec *tv) tc = (struct timecounter *)timecounter; tv->tv_sec = tc->offset_sec; - count = TC_DELTA(tc); + count = tco_getdelta(tc); delta = tc->offset_nano; delta += ((u_int64_t)count * tc->scale_nano_f); delta >>= 32; @@ -590,7 +595,7 @@ microuptime(struct timeval *tv) tc = (struct timecounter *)timecounter; tv->tv_sec = tc->offset_sec; tv->tv_usec = tc->offset_micro; - tv->tv_usec += ((u_int64_t)TC_DELTA(tc) * tc->scale_micro) >> 32; + tv->tv_usec += ((u_int64_t)tco_getdelta(tc) * tc->scale_micro) >> 32; if (tv->tv_usec >= 1000000) { tv->tv_usec -= 1000000; tv->tv_sec++; @@ -600,13 +605,13 @@ microuptime(struct timeval *tv) void nanouptime(struct timespec *tv) { - u_int count; + unsigned count; u_int64_t delta; struct timecounter *tc; tc = (struct timecounter *)timecounter; tv->tv_sec = tc->offset_sec; - count = TC_DELTA(tc); + count = tco_getdelta(tc); delta = tc->offset_nano; delta += ((u_int64_t)count * tc->scale_nano_f); delta >>= 32; @@ -725,7 +730,7 @@ sync_other_counter(void) tco = tc->other; *tc = *timecounter; tc->other = tco; - delta = TC_DELTA(tc); + delta = tco_getdelta(tc); tc->offset_count += delta; tc->offset_count &= tc->counter_mask; tc->offset_nano += (u_int64_t)delta * tc->scale_nano_f; @@ -799,10 +804,10 @@ SYSCTL_PROC(_kern_timecounter, OID_AUTO, adjustment, CTLTYPE_INT | CTLFLAG_RW, * timeservices. */ -static u_int +static unsigned dummy_get_timecount(void) { - static u_int now; + static unsigned now; return (++now); } diff --git a/sys/kern/kern_resource.c b/sys/kern/kern_resource.c index 82ff088..a19f489 100644 --- a/sys/kern/kern_resource.c +++ b/sys/kern/kern_resource.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)kern_resource.c 8.5 (Berkeley) 1/21/94 - * $Id: kern_resource.c,v 1.35 1998/04/05 02:59:10 peter Exp $ + * $Id: kern_resource.c,v 1.36 1998/05/17 11:52:43 phk Exp $ */ #include "opt_compat.h" @@ -399,6 +399,13 @@ dosetrlimit(p, which, limp) switch (which) { + case RLIMIT_CPU: + if (limp->rlim_cur > RLIM_INFINITY / (rlim_t)1000000) + p->p_limit->p_cpulimit = RLIM_INFINITY; + else + p->p_limit->p_cpulimit = + (rlim_t)1000000 * limp->rlim_cur; + break; case RLIMIT_DATA: if (limp->rlim_cur > MAXDSIZ) limp->rlim_cur = MAXDSIZ; @@ -485,9 +492,8 @@ calcru(p, up, sp, ip) struct timeval *sp; struct timeval *ip; { - quad_t totusec; - u_quad_t u, st, ut, it, tot; - long sec, usec; + int64_t totusec; + u_int64_t u, st, ut, it, tot; int s; struct timeval tv; @@ -504,8 +510,7 @@ calcru(p, up, sp, ip) tot = 1; } - sec = p->p_rtime.tv_sec; - usec = p->p_rtime.tv_usec; + totusec = p->p_runtime; #ifdef SMP if (p->p_oncpu != (char)0xff) { #else @@ -517,10 +522,9 @@ calcru(p, up, sp, ip) * quantum, which is much greater than the sampling error. */ microuptime(&tv); - sec += tv.tv_sec - p->p_runtime.tv_sec; - usec += tv.tv_usec - p->p_runtime.tv_usec; + totusec += (tv.tv_usec - p->p_switchtime.tv_usec) + + (tv.tv_sec - p->p_switchtime.tv_sec) * (int64_t)1000000; } - totusec = (quad_t)sec * 1000000 + usec; if (totusec < 0) { /* XXX no %qd in kernel. Truncate. */ printf("calcru: negative time of %ld usec for pid %d (%s)\n", @@ -602,8 +606,7 @@ limcopy(lim) MALLOC(copy, struct plimit *, sizeof(struct plimit), M_SUBPROC, M_WAITOK); - bcopy(lim->pl_rlimit, copy->pl_rlimit, - sizeof(struct rlimit) * RLIM_NLIMITS); + bcopy(lim->pl_rlimit, copy->pl_rlimit, sizeof(struct plimit)); copy->p_lflags = 0; copy->p_refcnt = 1; return (copy); diff --git a/sys/kern/kern_synch.c b/sys/kern/kern_synch.c index 342cb3a..8e429e2 100644 --- a/sys/kern/kern_synch.c +++ b/sys/kern/kern_synch.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)kern_synch.c 8.9 (Berkeley) 5/19/95 - * $Id: kern_synch.c,v 1.55 1998/05/17 11:52:45 phk Exp $ + * $Id: kern_synch.c,v 1.56 1998/05/17 22:12:14 tegge Exp $ */ #include "opt_ktrace.h" @@ -599,9 +599,7 @@ mi_switch() { register struct proc *p = curproc; /* XXX */ register struct rlimit *rlim; - register long s, u; int x; - struct timeval tv; /* * XXX this spl is almost unnecessary. It is partly to allow for @@ -630,36 +628,23 @@ mi_switch() * Compute the amount of time during which the current * process was running, and add that to its total so far. */ - microuptime(&tv); - u = p->p_rtime.tv_usec + (tv.tv_usec - p->p_runtime.tv_usec); - s = p->p_rtime.tv_sec + (tv.tv_sec - p->p_runtime.tv_sec); - if (u < 0) { - u += 1000000; - s--; - } else if (u >= 1000000) { - u -= 1000000; - s++; - } -#ifdef SMP - if (s < 0) - s = u = 0; -#endif - p->p_rtime.tv_usec = u; - p->p_rtime.tv_sec = s; + microuptime(&switchtime); + p->p_runtime += (switchtime.tv_usec - p->p_switchtime.tv_usec) + + (switchtime.tv_sec - p->p_switchtime.tv_sec) * (int64_t)1000000; /* * Check if the process exceeds its cpu resource allocation. * If over max, kill it. */ - if (p->p_stat != SZOMB) { + if (p->p_stat != SZOMB && p->p_runtime > p->p_limit->p_cpulimit) { rlim = &p->p_rlimit[RLIMIT_CPU]; - if (s >= rlim->rlim_cur) { - if (s >= rlim->rlim_max) - killproc(p, "exceeded maximum CPU limit"); - else { - psignal(p, SIGXCPU); - if (rlim->rlim_cur < rlim->rlim_max) - rlim->rlim_cur += 5; + if (p->p_runtime / (rlim_t)1000000 >= rlim->rlim_max) { + killproc(p, "exceeded maximum CPU limit"); + } else { + psignal(p, SIGXCPU); + if (rlim->rlim_cur < rlim->rlim_max) { + /* XXX: we should make a private copy */ + rlim->rlim_cur += 5; } } } @@ -669,7 +654,10 @@ mi_switch() */ cnt.v_swtch++; cpu_switch(p); - microuptime(&p->p_runtime); + if (switchtime.tv_sec) + p->p_switchtime = switchtime; + else + microuptime(&p->p_switchtime); splx(x); } diff --git a/sys/kern/kern_tc.c b/sys/kern/kern_tc.c index 1cb2233..5334bf0 100644 --- a/sys/kern/kern_tc.c +++ b/sys/kern/kern_tc.c @@ -39,7 +39,7 @@ static volatile int print_tci = 1; * SUCH DAMAGE. * * @(#)kern_clock.c 8.5 (Berkeley) 1/21/94 - * $Id: kern_clock.c,v 1.68 1998/05/17 11:52:39 phk Exp $ + * $Id: kern_clock.c,v 1.69 1998/05/19 18:54:38 phk Exp $ */ #include @@ -73,6 +73,7 @@ SYSINIT(clocks, SI_SUB_CLOCKS, SI_ORDER_FIRST, initclocks, NULL) static void tco_forward __P((void)); static void tco_setscales __P((struct timecounter *tc)); +static __inline unsigned tco_getdelta __P((struct timecounter *tc)); /* Some of these don't belong here, but it's easiest to concentrate them. */ #if defined(SMP) && defined(BETTER_CLOCK) @@ -493,8 +494,12 @@ sysctl_kern_clockrate SYSCTL_HANDLER_ARGS SYSCTL_PROC(_kern, KERN_CLOCKRATE, clockrate, CTLTYPE_STRUCT|CTLFLAG_RD, 0, 0, sysctl_kern_clockrate, "S,clockinfo",""); -#define TC_DELTA(tc) \ - (((tc)->get_timecount() - (tc)->offset_count) & (tc)->counter_mask) +static __inline unsigned +tco_getdelta(struct timecounter *tc) +{ + + return ((tc->get_timecount() - tc->offset_count) & tc->counter_mask); +} /* * We have four functions for looking at the clock, two for microseconds @@ -530,7 +535,7 @@ microtime(struct timeval *tv) tc = (struct timecounter *)timecounter; tv->tv_sec = tc->offset_sec; tv->tv_usec = tc->offset_micro; - tv->tv_usec += ((u_int64_t)TC_DELTA(tc) * tc->scale_micro) >> 32; + tv->tv_usec += ((u_int64_t)tco_getdelta(tc) * tc->scale_micro) >> 32; tv->tv_usec += boottime.tv_usec; tv->tv_sec += boottime.tv_sec; while (tv->tv_usec >= 1000000) { @@ -548,7 +553,7 @@ nanotime(struct timespec *tv) tc = (struct timecounter *)timecounter; tv->tv_sec = tc->offset_sec; - count = TC_DELTA(tc); + count = tco_getdelta(tc); delta = tc->offset_nano; delta += ((u_int64_t)count * tc->scale_nano_f); delta >>= 32; @@ -590,7 +595,7 @@ microuptime(struct timeval *tv) tc = (struct timecounter *)timecounter; tv->tv_sec = tc->offset_sec; tv->tv_usec = tc->offset_micro; - tv->tv_usec += ((u_int64_t)TC_DELTA(tc) * tc->scale_micro) >> 32; + tv->tv_usec += ((u_int64_t)tco_getdelta(tc) * tc->scale_micro) >> 32; if (tv->tv_usec >= 1000000) { tv->tv_usec -= 1000000; tv->tv_sec++; @@ -600,13 +605,13 @@ microuptime(struct timeval *tv) void nanouptime(struct timespec *tv) { - u_int count; + unsigned count; u_int64_t delta; struct timecounter *tc; tc = (struct timecounter *)timecounter; tv->tv_sec = tc->offset_sec; - count = TC_DELTA(tc); + count = tco_getdelta(tc); delta = tc->offset_nano; delta += ((u_int64_t)count * tc->scale_nano_f); delta >>= 32; @@ -725,7 +730,7 @@ sync_other_counter(void) tco = tc->other; *tc = *timecounter; tc->other = tco; - delta = TC_DELTA(tc); + delta = tco_getdelta(tc); tc->offset_count += delta; tc->offset_count &= tc->counter_mask; tc->offset_nano += (u_int64_t)delta * tc->scale_nano_f; @@ -799,10 +804,10 @@ SYSCTL_PROC(_kern_timecounter, OID_AUTO, adjustment, CTLTYPE_INT | CTLFLAG_RW, * timeservices. */ -static u_int +static unsigned dummy_get_timecount(void) { - static u_int now; + static unsigned now; return (++now); } diff --git a/sys/kern/subr_log.c b/sys/kern/subr_log.c index 60b1c3e..d35f83b 100644 --- a/sys/kern/subr_log.c +++ b/sys/kern/subr_log.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)subr_log.c 8.1 (Berkeley) 6/10/93 - * $Id: subr_log.c,v 1.27 1998/02/20 13:46:56 bde Exp $ + * $Id: subr_log.c,v 1.28 1998/05/19 08:58:51 phk Exp $ */ /* @@ -39,7 +39,6 @@ */ #include "opt_devfs.h" -#include "opt_msgbuf.h" #include #include @@ -269,5 +268,3 @@ log_drvinit(unused) } SYSINIT(logdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,log_drvinit,NULL) - - diff --git a/sys/kern/subr_prf.c b/sys/kern/subr_prf.c index 9124f67..c30e45b 100644 --- a/sys/kern/subr_prf.c +++ b/sys/kern/subr_prf.c @@ -36,13 +36,12 @@ * SUCH DAMAGE. * * @(#)subr_prf.c 8.3 (Berkeley) 1/21/94 - * $Id: subr_prf.c,v 1.44 1997/12/28 05:03:33 bde Exp $ + * $Id: subr_prf.c,v 1.45 1998/05/19 08:58:51 phk Exp $ */ -#include "opt_msgbuf.h" - #include #include +#include #include #include #include @@ -71,6 +70,7 @@ static void putchar __P((int ch, void *arg)); static char *ksprintn __P((u_long num, int base, int *len)); static int consintr = 1; /* Ok to handle console interrupts? */ +static int msgbufmapped; /* Set when safe to use msgbuf */ /* * Warn that a system table is full. @@ -275,7 +275,7 @@ vprintf(const char *fmt, va_list ap) /* * Print a character on console or users terminal. If destination is - * the console then the last MSGBUFS characters are saved in msgbuf for + * the console then the last bunch of characters are saved in msgbuf for * inspection later. */ static void @@ -598,3 +598,44 @@ msglogchar(int c, void *dummyarg) } } } + +void +msgbufinit(void *ptr, size_t size) +{ + char *cp; + + cp = (char *)ptr; + msgbufp = (struct msgbuf *) (cp + size - sizeof(*msgbufp)); + if (msgbufp->msg_magic != MSG_MAGIC || msgbufp->msg_ptr != cp) { + bzero(cp, size); + msgbufp->msg_magic = MSG_MAGIC; + msgbufp->msg_size = (char *)msgbufp - cp; + msgbufp->msg_ptr = cp; + } + msgbufmapped = 1; +} + +#include "opt_ddb.h" +#ifdef DDB +#include + +DB_SHOW_COMMAND(msgbuf, db_show_msgbuf) +{ + int i, j; + + if (!msgbufmapped) { + db_printf("msgbuf not mapped yet\n"); + return; + } + db_printf("msgbufp = %p\n", msgbufp); + db_printf("magic = %x, size = %d, r= %d, w = %d, ptr = %p\n", + msgbufp->msg_magic, msgbufp->msg_size, msgbufp->msg_bufr, + msgbufp->msg_bufx, msgbufp->msg_ptr); + for (i = 0; i < msgbufp->msg_size; i++) { + j = (i + msgbufp->msg_bufr) % msgbufp->msg_size; + db_printf("%c", msgbufp->msg_ptr[j]); + } + db_printf("\n"); +} + +#endif /* DDB */ diff --git a/sys/sys/msgbuf.h b/sys/sys/msgbuf.h index 2a153c8..4cfd004 100644 --- a/sys/sys/msgbuf.h +++ b/sys/sys/msgbuf.h @@ -31,27 +31,30 @@ * SUCH DAMAGE. * * @(#)msgbuf.h 8.1 (Berkeley) 6/2/93 - * $Id: msgbuf.h,v 1.9 1997/02/22 09:45:37 peter Exp $ + * $Id: msgbuf.h,v 1.10 1998/05/19 08:58:35 phk Exp $ */ #ifndef _SYS_MSGBUF_H_ #define _SYS_MSGBUF_H_ -#if defined(KERNEL) && !defined(MSGBUF_SIZE) -#define MSGBUF_SIZE 8192 -#endif - struct msgbuf { #define MSG_MAGIC 0x063062 unsigned int msg_magic; - unsigned int msg_size; /* MSG_BSIZE */ + unsigned int msg_size; /* size of buffer area */ unsigned int msg_bufx; /* write pointer */ unsigned int msg_bufr; /* read pointer */ char * msg_ptr; /* pointer to buffer */ }; + #ifdef KERNEL extern int msgbufmapped; extern struct msgbuf *msgbufp; +void msgbufinit __P((void *ptr, size_t size)); + +#if !defined(MSGBUF_SIZE) +#define MSGBUF_SIZE 8192 +#endif + #endif #endif diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 40460b6..2a7a7a39 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)proc.h 8.15 (Berkeley) 5/19/95 - * $Id: proc.h,v 1.56 1998/03/28 10:33:23 bde Exp $ + * $Id: proc.h,v 1.57 1998/04/04 13:26:14 phk Exp $ */ #ifndef _SYS_PROC_H_ @@ -134,8 +134,8 @@ struct proc { u_int p_slptime; /* Time since last blocked. */ struct itimerval p_realtimer; /* Alarm timer. */ - struct timeval p_rtime; /* Real time. */ - struct timeval p_runtime; /* When last scheduled */ + u_int64_t p_runtime; /* Real time in microsec. */ + struct timeval p_switchtime; /* When last scheduled */ u_quad_t p_uticks; /* Statclock hits in user mode. */ u_quad_t p_sticks; /* Statclock hits in system mode. */ u_quad_t p_iticks; /* Statclock hits processing intr. */ @@ -300,6 +300,7 @@ extern struct proc *curproc; /* Current running proc. */ extern struct proc proc0; /* Process slot for swapper. */ extern int nprocs, maxproc; /* Current and max number of procs. */ extern int maxprocperuid; /* Max procs per uid. */ +extern struct timeval switchtime; /* Uptime at last context switch */ LIST_HEAD(proclist, proc); extern struct proclist allproc; /* List of all processes. */ diff --git a/sys/sys/resourcevar.h b/sys/sys/resourcevar.h index 086b62f..e1dbaaa1 100644 --- a/sys/sys/resourcevar.h +++ b/sys/sys/resourcevar.h @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)resourcevar.h 8.4 (Berkeley) 1/9/95 - * $Id: resourcevar.h,v 1.10 1997/02/22 09:45:46 peter Exp $ + * $Id: resourcevar.h,v 1.11 1998/03/28 10:33:23 bde Exp $ */ #ifndef _SYS_RESOURCEVAR_H_ @@ -77,6 +77,7 @@ struct plimit { #define PL_SHAREMOD 0x01 /* modifications are shared */ int p_lflags; int p_refcnt; /* number of references */ + rlim_t p_cpulimit; /* current cpu limit in usec */ }; #ifdef KERNEL diff --git a/sys/sys/time.h b/sys/sys/time.h index 653d6ae..ce12bb6 100644 --- a/sys/sys/time.h +++ b/sys/sys/time.h @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)time.h 8.5 (Berkeley) 5/4/95 - * $Id: time.h,v 1.27 1998/05/17 11:53:40 phk Exp $ + * $Id: time.h,v 1.28 1998/05/19 18:55:02 phk Exp $ */ #ifndef _SYS_TIME_H_ @@ -129,12 +129,12 @@ struct timezone { */ struct timecounter; -typedef u_int timecounter_get_t __P((void)); +typedef unsigned timecounter_get_t __P((void)); struct timecounter { /* These fields must be initialized by the driver. */ timecounter_get_t *get_timecount; - u_int counter_mask; + unsigned counter_mask; u_int32_t frequency; char *name; /* These fields will be managed by the generic code. */ @@ -143,7 +143,7 @@ struct timecounter { u_int32_t scale_micro; u_int32_t scale_nano_i; u_int32_t scale_nano_f; - u_int offset_count; + unsigned offset_count; u_int32_t offset_sec; u_int32_t offset_micro; u_int64_t offset_nano; diff --git a/sys/sys/timetc.h b/sys/sys/timetc.h index 653d6ae..ce12bb6 100644 --- a/sys/sys/timetc.h +++ b/sys/sys/timetc.h @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)time.h 8.5 (Berkeley) 5/4/95 - * $Id: time.h,v 1.27 1998/05/17 11:53:40 phk Exp $ + * $Id: time.h,v 1.28 1998/05/19 18:55:02 phk Exp $ */ #ifndef _SYS_TIME_H_ @@ -129,12 +129,12 @@ struct timezone { */ struct timecounter; -typedef u_int timecounter_get_t __P((void)); +typedef unsigned timecounter_get_t __P((void)); struct timecounter { /* These fields must be initialized by the driver. */ timecounter_get_t *get_timecount; - u_int counter_mask; + unsigned counter_mask; u_int32_t frequency; char *name; /* These fields will be managed by the generic code. */ @@ -143,7 +143,7 @@ struct timecounter { u_int32_t scale_micro; u_int32_t scale_nano_i; u_int32_t scale_nano_f; - u_int offset_count; + unsigned offset_count; u_int32_t offset_sec; u_int32_t offset_micro; u_int64_t offset_nano; diff --git a/usr.bin/top/machine.c b/usr.bin/top/machine.c index d715210..c87b00e 100644 --- a/usr.bin/top/machine.c +++ b/usr.bin/top/machine.c @@ -17,7 +17,7 @@ * Steven Wallace * Wolfram Schneider * - * $Id: machine.c,v 1.8 1997/10/05 21:20:56 fsmp Exp $ + * $Id: machine.c,v 1.9 1998/02/14 13:34:59 peter Exp $ */ @@ -565,7 +565,7 @@ char *(*get_userid)(); /* This does not produce the correct results */ cputime = PP(pp, p_uticks) + PP(pp, p_sticks) + PP(pp, p_iticks); #endif - cputime = PP(pp, p_rtime).tv_sec; /* This does not count interrupts */ + cputime = PP(pp, p_runtime) / 1000000; /* This does not count interrupts */ /* calculate the base for cpu percentages */ pct = pctdouble(PP(pp, p_pctcpu)); @@ -736,7 +736,7 @@ struct proc **pp2; if ((lresult = PP(p2, p_pctcpu) - PP(p1, p_pctcpu)) == 0) { /* use lifetime CPU usage to break the tie */ - if ((result = PP(p2, p_rtime).tv_sec - PP(p1, p_rtime).tv_sec) == 0) + if ((result = PP(p2, p_runtime) - PP(p1, p_runtime)) == 0) { /* use process state to break the tie */ if ((result = sorted_state[(unsigned char) PP(p2, p_stat)] - -- cgit v1.1