PERFORCE change 99967 for review
Kip Macy
kmacy at FreeBSD.org
Sun Jun 25 05:02:21 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=99967
Change 99967 by kmacy at kmacy_storage:sun4v_work_sleepq on 2006/06/25 05:01:48
fix wait tracking to handle nested locking in sleep mutexes
Affected files ...
.. //depot/projects/kmacy_sun4v/src/sys/kern/kern_mutex.c#17 edit
.. //depot/projects/kmacy_sun4v/src/sys/kern/kern_sx.c#4 edit
.. //depot/projects/kmacy_sun4v/src/sys/sys/lock_profile.h#6 edit
.. //depot/projects/kmacy_sun4v/src/sys/sys/proc.h#10 edit
Differences ...
==== //depot/projects/kmacy_sun4v/src/sys/kern/kern_mutex.c#17 (text+ko) ====
@@ -273,18 +273,21 @@
void
_mtx_lock_flags(struct mtx *m, int opts, const char *file, int line)
{
-
+
+ uint64_t waittime;
MPASS(curthread != NULL);
KASSERT(LOCK_CLASS(&m->mtx_object) == &lock_class_mtx_sleep,
("mtx_lock() of spin mutex %s @ %s:%d", m->mtx_object.lo_name,
file, line));
WITNESS_CHECKORDER(&m->mtx_object, opts | LOP_NEWORDER | LOP_EXCLUSIVE,
file, line);
+
+ lock_profile_waitstart(&waittime);
_get_sleep_lock(m, curthread, opts, file, line);
LOCK_LOG_LOCK("LOCK", &m->mtx_object, opts, m->mtx_recurse, file,
line);
WITNESS_LOCK(&m->mtx_object, opts | LOP_EXCLUSIVE, file, line);
- lock_profile_obtain_lock_success(&m->mtx_object, file, line);
+ lock_profile_obtain_lock_success(&m->mtx_object, waittime, file, line);
}
void
@@ -307,18 +310,19 @@
void
_mtx_lock_spin_flags(struct mtx *m, int opts, const char *file, int line)
{
-
+ uint64_t waittime;
MPASS(curthread != NULL);
KASSERT(LOCK_CLASS(&m->mtx_object) == &lock_class_mtx_spin,
("mtx_lock_spin() of sleep mutex %s @ %s:%d",
m->mtx_object.lo_name, file, line));
WITNESS_CHECKORDER(&m->mtx_object, opts | LOP_NEWORDER | LOP_EXCLUSIVE,
file, line);
+ lock_profile_waitstart(&waittime);
_get_spin_lock(m, curthread, opts, file, line);
LOCK_LOG_LOCK("LOCK", &m->mtx_object, opts, m->mtx_recurse, file,
line);
WITNESS_LOCK(&m->mtx_object, opts | LOP_EXCLUSIVE, file, line);
- lock_profile_obtain_lock_success(&m->mtx_object, file, line);
+ lock_profile_obtain_lock_success(&m->mtx_object, waittime, file, line);
}
void
@@ -345,8 +349,9 @@
int
_mtx_trylock(struct mtx *m, int opts, const char *file, int line)
{
+ uint64_t waittime = 0;
int rval;
-
+
MPASS(curthread != NULL);
KASSERT(LOCK_CLASS(&m->mtx_object) == &lock_class_mtx_sleep,
("mtx_trylock() of spin mutex %s @ %s:%d", m->mtx_object.lo_name,
@@ -363,7 +368,7 @@
if (rval) {
WITNESS_LOCK(&m->mtx_object, opts | LOP_EXCLUSIVE | LOP_TRYLOCK,
file, line);
- lock_profile_obtain_lock_success(&m->mtx_object, file, line);
+ lock_profile_obtain_lock_success(&m->mtx_object, waittime, file, line);
}
return (rval);
}
@@ -382,13 +387,8 @@
volatile struct thread *owner;
#endif
uintptr_t v;
-#ifdef KTR
-#if 0
- int cont_logged = 0;
-#endif
-#endif
int contested;
-
+
if (mtx_owned(m)) {
KASSERT((m->mtx_object.lo_flags & LO_RECURSABLE) != 0,
("_mtx_lock_sleep: recursed on non-recursive mutex %s @ %s:%d\n",
==== //depot/projects/kmacy_sun4v/src/sys/kern/kern_sx.c#4 (text+ko) ====
@@ -113,6 +113,7 @@
{
int contested;
+ uint64_t waittime = 0;
mtx_lock(sx->sx_lock);
KASSERT(sx->sx_xholder != curthread,
@@ -123,6 +124,8 @@
/*
* Loop in case we lose the race for lock acquisition.
*/
+ if (sx->sx_cnt < 0)
+ lock_profile_waitstart(&waittime);
while (sx->sx_cnt < 0) {
sx->sx_shrd_wcnt++;
lock_profile_obtain_lock_failed(&sx->sx_object, &contested);
@@ -135,7 +138,7 @@
sx->sx_cnt++;
if (sx->sx_cnt == 1)
- lock_profile_obtain_lock_success(&sx->sx_object, file, line);
+ lock_profile_obtain_lock_success(&sx->sx_object, waittime, file, line);
LOCK_LOG_LOCK("SLOCK", &sx->sx_object, 0, 0, file, line);
WITNESS_LOCK(&sx->sx_object, 0, file, line);
@@ -166,7 +169,8 @@
{
int contested;
-
+ uint64_t waittime = 0;
+
mtx_lock(sx->sx_lock);
/*
@@ -183,6 +187,8 @@
line);
/* Loop in case we lose the race for lock acquisition. */
+ if (sx->sx_cnt)
+ lock_profile_waitstart(&waittime);
while (sx->sx_cnt != 0) {
sx->sx_excl_wcnt++;
lock_profile_obtain_lock_failed(&sx->sx_object, &contested);
@@ -196,7 +202,7 @@
sx->sx_cnt--;
sx->sx_xholder = curthread;
- lock_profile_obtain_lock_success(&sx->sx_object, file, line);
+ lock_profile_obtain_lock_success(&sx->sx_object, waittime, file, line);
LOCK_LOG_LOCK("XLOCK", &sx->sx_object, 0, 0, file, line);
WITNESS_LOCK(&sx->sx_object, LOP_EXCLUSIVE, file, line);
==== //depot/projects/kmacy_sun4v/src/sys/sys/lock_profile.h#6 (text+ko) ====
@@ -84,34 +84,34 @@
}
}
+static inline void lock_profile_waitstart(uint64_t *waittime)
+{
+ *waittime = rd(tick);
+}
+
static inline void lock_profile_obtain_lock_failed(struct lock_object *lo, int *contested)
{
struct lock_profile_object *l = &lo->lo_profile_obj;
if (mutex_prof_enable) {
*contested = 1;
atomic_add_int(&l->lpo_contest_holding, 1);
- if (curthread->td_waittime == 0)
- curthread->td_waittime = rd(tick);
}
}
-static inline void lock_profile_obtain_lock_success(struct lock_object *lo, const char *file, int line)
+static inline void lock_profile_obtain_lock_success(struct lock_object *lo, uint64_t waittime, const char *file, int line)
{
struct lock_profile_object *l = &lo->lo_profile_obj;
-
+
/* don't reset the timer when/if recursing */
if (mutex_prof_enable && l->lpo_acqtime == 0) {
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;
+ if (waittime) {
+ if (l->lpo_acqtime > waittime)
+ l->lpo_waittime = l->lpo_acqtime - waittime;
}
- } else
- curthread->td_waittime = 0;
+ }
}
static inline void lock_profile_release_lock(struct lock_object *lo)
==== //depot/projects/kmacy_sun4v/src/sys/sys/proc.h#10 (text+ko) ====
@@ -259,9 +259,6 @@
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