diff options
author | Juergen Gross <juergen.gross@ts.fujitsu.com> | 2011-11-07 14:36:44 +0000 |
---|---|---|
committer | Juergen Gross <juergen.gross@ts.fujitsu.com> | 2011-11-07 14:36:44 +0000 |
commit | d98feda5c75658446f4ad28df3b6c855d9b5faa3 (patch) | |
tree | e6419bf880d6742fd65cf8fecb23449112645bd4 /xen/common/spinlock.c | |
parent | 4e3d89fbfa6e14e3ddce14b4da84adcb6f7ce0ea (diff) | |
download | xen-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.c | 34 |
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( |