PERFORCE change 99908 for review
Kip Macy
kmacy at FreeBSD.org
Fri Jun 23 23:57:42 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=99908
Change 99908 by kmacy at kmacy_storage:sun4v_work_sleepq on 2006/06/23 23:56:41
track wait time for mutex acquisition
Affected files ...
.. //depot/projects/kmacy_sun4v/src/sys/kern/kern_mutex.c#14 edit
.. //depot/projects/kmacy_sun4v/src/sys/sun4v/include/pcpu.h#17 edit
.. //depot/projects/kmacy_sun4v/src/sys/sys/_lock.h#4 edit
.. //depot/projects/kmacy_sun4v/src/sys/sys/lock_profile.h#2 edit
.. //depot/projects/kmacy_sun4v/src/sys/sys/proc.h#8 edit
Differences ...
==== //depot/projects/kmacy_sun4v/src/sys/kern/kern_mutex.c#14 (text+ko) ====
@@ -207,20 +207,23 @@
retry_sbufops:
sb = sbuf_new(NULL, NULL, MPROF_SBUF_SIZE * multiplier, SBUF_FIXEDLEN);
- sbuf_printf(sb, "\n%6s %12s %11s %5s %12s %12s %s\n",
- "max", "total", "count", "avg", "cnt_hold", "cnt_lock", "name");
+ sbuf_printf(sb, "\n%6s %12s %12s %11s %5s %5s %12s %12s %s\n",
+ "max", "total", "wait_total", "count", "avg", "wait_avg", "cnt_hold", "cnt_lock", "name");
for (i = 0; i < MPROF_HASH_SIZE; ++i) {
if (mprof_buf[i].name == NULL)
continue;
for (p = mprof_buf[i].file;
p != NULL && strncmp(p, "../", 3) == 0; p += 3)
/* nothing */ ;
- sbuf_printf(sb, "%6ju %12ju %11ju %5ju %12ju %12ju %s:%d (%s)\n",
+ sbuf_printf(sb, "%6ju %12ju %12ju %11ju %5ju %5ju %12ju %12ju %s:%d (%s)\n",
mprof_buf[i].cnt_max / 1000,
mprof_buf[i].cnt_tot / 1000,
+ mprof_buf[i].cnt_wait / 1000,
mprof_buf[i].cnt_cur,
mprof_buf[i].cnt_cur == 0 ? (uintmax_t)0 :
mprof_buf[i].cnt_tot / (mprof_buf[i].cnt_cur * 1000),
+ mprof_buf[i].cnt_cur == 0 ? (uintmax_t)0 :
+ mprof_buf[i].cnt_wait / (mprof_buf[i].cnt_cur * 1000),
mprof_buf[i].cnt_contest_holding,
mprof_buf[i].cnt_contest_locking,
p, mprof_buf[i].line, mprof_buf[i].name);
==== //depot/projects/kmacy_sun4v/src/sys/sun4v/include/pcpu.h#17 (text+ko) ====
@@ -41,9 +41,8 @@
struct pmap;
#if defined(WITNESS)
#define SUN4V_PAD 7
-
#elif defined(MUTEX_PROFILING)
-#define SUN4V_PAD 4
+#define SUN4V_PAD 3
#else
#define SUN4V_PAD 0
#endif
==== //depot/projects/kmacy_sun4v/src/sys/sys/_lock.h#4 (text+ko) ====
@@ -37,6 +37,7 @@
* MUTEX_PROFILING is in opt_global.h
*/
u_int64_t lpo_acqtime;
+ u_int64_t lpo_waittime;
const char *lpo_filename;
u_int lpo_namehash;
int lpo_lineno;
==== //depot/projects/kmacy_sun4v/src/sys/sys/lock_profile.h#2 (text+ko) ====
@@ -16,6 +16,7 @@
int line;
uintmax_t cnt_max;
uintmax_t cnt_tot;
+ uintmax_t cnt_wait;
uintmax_t cnt_cur;
uintmax_t cnt_contest_holding;
uintmax_t cnt_contest_locking;
@@ -45,6 +46,7 @@
struct lock_profile_object *l = &lo->lo_profile_obj;
l->lpo_acqtime = 0;
+ l->lpo_waittime = 0;
l->lpo_filename = NULL;
l->lpo_lineno = 0;
l->lpo_contest_holding = 0;
@@ -88,6 +90,8 @@
if (mutex_prof_enable) {
*contested = 1;
atomic_add_int(&l->lpo_contest_holding, 1);
+ if (curthread->td_waittime == 0)
+ curthread->td_waittime = rd(tick);
}
}
@@ -100,6 +104,12 @@
l->lpo_filename = file;
l->lpo_lineno = line;
l->lpo_acqtime = rd(tick); /* substitute for more general TSC read */
+ if (curthread->td_waittime) {
+ struct thread *td = curthread;
+ if (l->lpo_acqtime > td->td_waittime)
+ l->lpo_waittime = l->lpo_acqtime - td->td_waittime;
+ td->td_waittime = 0;
+ }
}
}
@@ -110,14 +120,16 @@
if (l->lpo_acqtime) {
const char *unknown = "(unknown)";
struct mutex_prof *mpp;
- u_int64_t acqtime, now;
+ u_int64_t acqtime, now, waittime;
u_int hash;
const char *p = l->lpo_filename;
int collision = 0;
now = rd(tick);
acqtime = l->lpo_acqtime;
+ waittime = l->lpo_waittime;
l->lpo_acqtime = 0;
+ l->lpo_waittime = 0;
if (now <= acqtime)
return;
if (p == NULL || *p == '\0')
@@ -162,6 +174,7 @@
if (now - acqtime > mpp->cnt_max)
mpp->cnt_max = now - acqtime;
mpp->cnt_tot += now - acqtime;
+ mpp->cnt_wait += waittime;
mpp->cnt_cur++;
/*
* There's a small race, really we should cmpxchg
==== //depot/projects/kmacy_sun4v/src/sys/sys/proc.h#8 (text+ko) ====
@@ -256,6 +256,9 @@
struct mdthread td_md; /* (k) Any machine-dependent fields. */
struct td_sched *td_sched; /* (*) Scheduler-specific data. */
struct kaudit_record *td_ar; /* (k) Active audit record, if any. */
+#ifdef MUTEX_PROFILING
+ uint64_t td_waittime; /* time in ns that thread started waiting for lock */
+#endif
};
/*
More information about the p4-projects
mailing list