Booting to beginning of bootstrap with different number of cpus and checking the lock statistics where TIME is in milliseconds:
-smp 1 db{0}> show all slocks SUCCESS FAIL MASKED STACK TIME LOCK/CALLER 1 0/0 1/100 0/0 8030/8030 0x323(c1196280) 30760 0/0 0/0 2112/0 130/0 0xf5effdd0(f5ed3480) 30740 0/0 0/0 0/0 130/0 0xf647be2c(f5ed3588) 14345 0/0 0/0 30/0 80/0 0xf5a74e2c(f5a69008) 14345 0/0 0/0 30/0 80/0 0xf5effe2c(f5ec3e28) 14345 0/0 0/0 30/0 70/0 0xf5a74e2c(f5a69110) 14345 0/0 0/0 30/0 70/0 0xf5a74e2c(f5a692c8) 14345 0/0 0/0 18/0 70/0 0xf5a74e2c(f5a69588) 15125 total locks, 0 empty buckets 2290658 0/0 442463/19 3893961/1 10120/0 0xc10a4100(c10a4100) -smp 2 db{0}> show all slocks SUCCESS FAIL MASKED STACK TIME LOCK/CALLER 1 0/0 1/100 0/0 84990/84990 0x2133(c1196280) 149307 515/0 3372/2 1/0 5610/0 0xc118a110(c118a554) 126539 0/0 2/0 0/0 3740/0 0xc1098ec4(c1189b00) 32796 0/0 0/0 1/0 3340/0 0xf5a75dec(f5ab1428) 199546 3/0 1714/0 2/0 2610/0 0xc1098e54(c118a60c) 16415 0/0 0/0 1/0 1630/0 0xf5ef1de0(f5ab1320) 16395 0/0 0/0 1/0 1550/0 0xf5ef1dec(f5ab12c8) 14355 0/0 0/0 1869/0 1150/0 0xf5aafde0(f5ab1950) 15554 total locks, 0 empty buckets 2345053 1048/0 469257/20 3986453/1 138330/0 0xc10a4100(c10a4100) -smp 4 db{0}> show all slocks SUCCESS FAIL MASKED STACK TIME LOCK/CALLER 1 0/0 1/100 0/0 88870/88870 0x22b7(c1196280) 63530 0/0 0/0 2106/0 6140/0 0xf5a73dec(f5aa52c8) 150145 2/0 3372/2 1/0 5820/0 0xc118a110(c118a554) 126871 0/0 2/0 0/0 3790/0 0xc1098ec4(c1189b00) 200036 8/0 1714/0 2/0 2750/0 0xc1098e54(c118a60c) 16421 0/0 0/0 1/0 1650/0 0xf5b10de0(f5aa51c0) 14345 0/0 0/0 30/0 1270/0 0xf5b19dec(f5a626f0) 14345 0/0 0/0 30/0 1160/0 0xf5a77dec(f5ad91c0) 15679 total locks, 0 empty buckets 2382816 865/0 483970/20 4266287/1 147300/0 0xc10a4100(c10a4100) -smp 8 db{0}> show all slocks SUCCESS FAIL MASKED STACK TIME LOCK/CALLER 1 0/0 1/100 0/0 89090/89090 0x22cd(c1196280) 150603 7/0 3372/2 1/0 5520/0 0xc118a110(c118a554) 49191 0/0 0/0 1/0 4890/0 0xf5abbdec(f661b008) 127331 0/0 2/0 0/0 4010/0 0xc1098ec4(c1189b00) 200746 6/0 1714/0 2/0 2730/0 0xc1098e54(c118a60c) 16421 0/0 0/0 1/0 1580/0 0xf5a73de0(f5b3fed8) 14345 0/0 0/0 18/0 1290/0 0xf5b19dec(f5ad9588) 1505 5/0 0/0 1/0 1240/0 0xf5a73e70(f5ac9f10) 18330 total locks, 0 empty buckets 2368778 878/0 481867/20 4343006/1 147660/0 0xc10a4100(c10a4100) --- i386/i386/hardclock.c | 8 ++++++++ i386/i386/hardclock.h | 4 ++++ kern/lock_mon.c | 10 ++++------ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/i386/i386/hardclock.c b/i386/i386/hardclock.c index 9ac4f51d..d3f49aa1 100644 --- a/i386/i386/hardclock.c +++ b/i386/i386/hardclock.c @@ -46,6 +46,10 @@ extern char return_to_iret[]; +#ifdef MACH_LOCK_MON +unsigned int tick_stamp; +#endif + void hardclock(int iunit, /* 'unit' number */ int old_ipl, /* old interrupt level */ @@ -78,4 +82,8 @@ hardclock(int iunit, /* 'unit' number */ #ifdef LINUX_DEV linux_timer_intr(); #endif /* LINUX_DEV */ +#ifdef MACH_LOCK_MON + if (cpu_number() == 0) + tick_stamp++; +#endif } diff --git a/i386/i386/hardclock.h b/i386/i386/hardclock.h index b326c3cb..659e0424 100644 --- a/i386/i386/hardclock.h +++ b/i386/i386/hardclock.h @@ -19,6 +19,10 @@ #ifndef _I386_HARDCLOCK_H_ #define _I386_HARDCLOCK_H_ +#ifdef MACH_LOCK_MON +extern unsigned int tick_stamp; +#endif + void hardclock( int iunit, int old_ipl, diff --git a/kern/lock_mon.c b/kern/lock_mon.c index b8216788..9dc75ce5 100644 --- a/kern/lock_mon.c +++ b/kern/lock_mon.c @@ -47,6 +47,7 @@ #include <kern/lock.h> #include <kern/printf.h> #include <machine/ipl.h> +#include <machine/hardclock.h> #include <ddb/db_sym.h> #include <ddb/db_output.h> @@ -56,13 +57,10 @@ def_simple_lock_data(, kdb_lock) def_simple_lock_data(, printf_lock) #if NCPUS > 1 && MACH_LOCK_MON - -#if TIME_STAMP -extern time_stamp_t time_stamp; -#else /* TIME_STAMP */ +#define TIME_STAMP 1 typedef unsigned int time_stamp_t; -#define time_stamp 0 -#endif /* TIME_STAMP */ +/* in milliseconds */ +#define time_stamp (tick_stamp * 1000 / hz) #define LOCK_INFO_MAX (1024*32) #define LOCK_INFO_HASH_COUNT 1024 -- 2.39.0