Date: Fri, 26 May 2006 23:46:33 GMT From: Kip Macy <kmacy@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 97913 for review Message-ID: <200605262346.k4QNkXSv042984@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=97913 Change 97913 by kmacy@kmacy_storage:sun4v_work on 2006/05/26 23:45:37 Add Kris Kennaway's spinlock profiling Affected files ... .. //depot/projects/kmacy_sun4v/src/sys/conf/options#7 edit .. //depot/projects/kmacy_sun4v/src/sys/kern/kern_mutex.c#5 edit .. //depot/projects/kmacy_sun4v/src/sys/sys/lock.h#4 edit .. //depot/projects/kmacy_sun4v/src/sys/sys/mutex.h#3 edit Differences ... ==== //depot/projects/kmacy_sun4v/src/sys/conf/options#7 (text+ko) ==== @@ -512,6 +512,7 @@ MUTEX_DEBUG opt_global.h MUTEX_NOINLINE opt_global.h MUTEX_PROFILING opt_global.h +SPIN_PROFILING opt_global.h MSIZE opt_global.h REGRESSION opt_global.h RESTARTABLE_PANICS opt_global.h ==== //depot/projects/kmacy_sun4v/src/sys/kern/kern_mutex.c#5 (text+ko) ==== @@ -116,6 +116,41 @@ struct mtx sched_lock; struct mtx Giant; +#ifdef SPIN_PROFILING +SYSCTL_NODE(_debug, OID_AUTO, spinlock, CTLFLAG_RD, NULL, "spinlock debugging"); +SYSCTL_NODE(_debug_spinlock, OID_AUTO, prof, CTLFLAG_RD, NULL, "spinlock profiling"); +int spin_prof_enable = 0; +SYSCTL_INT(_debug_spinlock_prof, OID_AUTO, enable, CTLFLAG_RW, + &spin_prof_enable, 0, "Enable tracing of spinlock holdtime"); +int spin_total = 0; +int spin_count = 0; +SYSCTL_INT(_debug_spinlock_prof, OID_AUTO, total, CTLFLAG_RD, + &spin_total, 0, "Number of spinlock spins recorded"); +SYSCTL_INT(_debug_spinlock_prof, OID_AUTO, count, CTLFLAG_RD, + &spin_count, 0, "Number of spinlock acquisitions recorded"); + +static int +reset_spin_prof_stats(SYSCTL_HANDLER_ARGS) +{ + int v = 0, error; + + error = sysctl_handle_int(oidp, &v, 0, req); + if (error) + return (error); + if (req->newptr == NULL) + return (error); + if (v == 0) + return (0); + + spin_total = 0; + spin_count = 0; + return (0); +} + +SYSCTL_PROC(_debug_spinlock_prof, OID_AUTO, reset, CTLTYPE_INT | CTLFLAG_RW, + NULL, 0, reset_spin_prof_stats, "I", "Reset spinlock profiling statistics"); +#endif + #ifdef MUTEX_PROFILING SYSCTL_NODE(_debug, OID_AUTO, mutex, CTLFLAG_RD, NULL, "mutex debugging"); SYSCTL_NODE(_debug_mutex, OID_AUTO, prof, CTLFLAG_RD, NULL, "mutex profiling"); @@ -592,6 +627,12 @@ int line) { int i = 0; +#ifdef SPIN_PROFILING + int profiling = 0; + + if (m->mtx_object.lo_flags & LO_PROFILE && spin_prof_enable) + profiling = 1; +#endif if (LOCK_LOG_TEST(&m->mtx_object, opts)) CTR1(KTR_LOCK, "_mtx_lock_spin: %p spinning", m); @@ -622,6 +663,13 @@ } spinlock_enter(); } +#ifdef SPIN_PROFILING + /* We have the lock, record how many spins it took to get it */ + if (profiling) { + spin_total += i; + spin_count++; + } +#endif if (LOCK_LOG_TEST(&m->mtx_object, opts)) CTR1(KTR_LOCK, "_mtx_lock_spin: %p spin done", m); @@ -849,6 +897,8 @@ flags |= LO_WITNESS; if (opts & MTX_DUPOK) flags |= LO_DUPOK; + if (opts & MTX_PROFILE) + flags |= LO_PROFILE; /* Initialize mutex. */ m->mtx_lock = MTX_UNOWNED; @@ -907,7 +957,7 @@ * Initialize mutexes. */ mtx_init(&Giant, "Giant", NULL, MTX_DEF | MTX_RECURSE); - mtx_init(&sched_lock, "sched lock", NULL, MTX_SPIN | MTX_RECURSE); + mtx_init(&sched_lock, "sched lock", NULL, MTX_SPIN | MTX_RECURSE | MTX_PROFILE); mtx_init(&proc0.p_mtx, "process lock", NULL, MTX_DEF | MTX_DUPOK); mtx_init(&devmtx, "cdev", NULL, MTX_DEF); mtx_lock(&Giant); ==== //depot/projects/kmacy_sun4v/src/sys/sys/lock.h#4 (text+ko) ==== @@ -69,6 +69,7 @@ #define LO_DUPOK 0x00400000 /* Don't check for duplicate acquires */ #define LO_ENROLLPEND 0x00800000 /* On the pending enroll list. */ #define LO_CLASSMASK 0x0f000000 /* Class index bitmask. */ +#define LO_PROFILE 0x10000000 /* Enable per-lock profiling */ /* * Lock classes are statically assigned an index into the gobal lock_classes ==== //depot/projects/kmacy_sun4v/src/sys/sys/mutex.h#3 (text+ko) ==== @@ -56,6 +56,7 @@ #define MTX_SPIN 0x00000001 /* Spin lock (disables interrupts) */ #define MTX_RECURSE 0x00000004 /* Option: lock allowed to recurse */ #define MTX_NOWITNESS 0x00000008 /* Don't do any witness checking. */ +#define MTX_PROFILE 0x00000010 /* Enable spinlock profiling for this spin lock */ /* * Option flags passed to certain lock/unlock routines, through the use @@ -164,6 +165,9 @@ */ #ifndef _get_spin_lock #ifdef SMP +#ifdef SPIN_PROFILING +extern int spin_prof_enable; +extern int spin_count; #define _get_spin_lock(mp, tid, opts, file, line) do { \ uintptr_t _tid = (uintptr_t)(tid); \ \ @@ -174,7 +178,22 @@ else \ _mtx_lock_spin((mp), _tid, (opts), (file), (line)); \ } \ + else if ((mp)->mtx_object.lo_flags & LO_PROFILE && spin_prof_enable) \ + spin_count++; \ } while (0) +#else /* SPIN_PROFILING */ +#define _get_spin_lock(mp, tid, opts, file, line) do { \ + uintptr_t _tid = (uintptr_t)(tid); \ + \ + spinlock_enter(); \ + if (!_obtain_lock((mp), _tid)) { \ + if ((mp)->mtx_lock == _tid) \ + (mp)->mtx_recurse++; \ + else \ + _mtx_lock_spin((mp), _tid, (opts), (file), (line)); \ + } \ +} while (0) +#endif /* SPIN_PROFILING */ #else /* SMP */ #define _get_spin_lock(mp, tid, opts, file, line) do { \ uintptr_t _tid = (uintptr_t)(tid); \
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200605262346.k4QNkXSv042984>