aboutsummaryrefslogtreecommitdiffstats
path: root/xen/common/spinlock.c
diff options
context:
space:
mode:
authorJuergen Gross <juergen.gross@ts.fujitsu.com>2011-11-07 14:36:44 +0000
committerJuergen Gross <juergen.gross@ts.fujitsu.com>2011-11-07 14:36:44 +0000
commitd98feda5c75658446f4ad28df3b6c855d9b5faa3 (patch)
treee6419bf880d6742fd65cf8fecb23449112645bd4 /xen/common/spinlock.c
parent4e3d89fbfa6e14e3ddce14b4da84adcb6f7ce0ea (diff)
downloadxen-d98feda5c75658446f4ad28df3b6c855d9b5faa3.tar.gz
xen-d98feda5c75658446f4ad28df3b6c855d9b5faa3.tar.bz2
xen-d98feda5c75658446f4ad28df3b6c855d9b5faa3.zip
Make lock profiling usable again
Using lock profiling (option lock_profile in xen/Rules.mk) resulted in build errors. Changes: - Include public/sysctl.h in spinlock.h when using lock profiling. - Allocate profile data in an own structure to avoid struct domain becoming larger then one page Signed-off-by: Juergen Gross <juergen.gross@ts.fujitsu.com> Acked-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/common/spinlock.c')
-rw-r--r--xen/common/spinlock.c34
1 files changed, 21 insertions, 13 deletions
diff --git a/xen/common/spinlock.c b/xen/common/spinlock.c
index aec9ebf6b7..14ecfd7f3d 100644
--- a/xen/common/spinlock.c
+++ b/xen/common/spinlock.c
@@ -86,17 +86,23 @@ void spin_debug_disable(void)
#ifdef LOCK_PROFILE
-#define LOCK_PROFILE_REL \
- lock->profile.time_hold += NOW() - lock->profile.time_locked; \
- lock->profile.lock_cnt++;
+#define LOCK_PROFILE_REL \
+ if (lock->profile) \
+ { \
+ lock->profile->time_hold += NOW() - lock->profile->time_locked; \
+ lock->profile->lock_cnt++; \
+ }
#define LOCK_PROFILE_VAR s_time_t block = 0
#define LOCK_PROFILE_BLOCK block = block ? : NOW();
-#define LOCK_PROFILE_GOT \
- lock->profile.time_locked = NOW(); \
- if (block) \
- { \
- lock->profile.time_block += lock->profile.time_locked - block; \
- lock->profile.block_cnt++; \
+#define LOCK_PROFILE_GOT \
+ if (lock->profile) \
+ { \
+ lock->profile->time_locked = NOW(); \
+ if (block) \
+ { \
+ lock->profile->time_block += lock->profile->time_locked - block; \
+ lock->profile->block_cnt++; \
+ } \
}
#else
@@ -197,7 +203,8 @@ int _spin_trylock(spinlock_t *lock)
if ( !_raw_spin_trylock(&lock->raw) )
return 0;
#ifdef LOCK_PROFILE
- lock->profile.time_locked = NOW();
+ if (lock->profile)
+ lock->profile->time_locked = NOW();
#endif
preempt_disable();
return 1;
@@ -211,10 +218,10 @@ void _spin_barrier(spinlock_t *lock)
check_barrier(&lock->debug);
do { mb(); loop++;} while ( _raw_spin_is_locked(&lock->raw) );
- if (loop > 1)
+ if ((loop > 1) && lock->profile)
{
- lock->profile.time_block += NOW() - block;
- lock->profile.block_cnt++;
+ lock->profile->time_block += NOW() - block;
+ lock->profile->block_cnt++;
}
#else
check_barrier(&lock->debug);
@@ -586,6 +593,7 @@ static int __init lock_prof_init(void)
{
(*q)->next = lock_profile_glb_q.elem_q;
lock_profile_glb_q.elem_q = *q;
+ (*q)->lock->profile = *q;
}
_lock_profile_register_struct(