diff options
Diffstat (limited to 'kernel/lockdep.c')
| -rw-r--r-- | kernel/lockdep.c | 60 | 
1 files changed, 32 insertions, 28 deletions
diff --git a/kernel/lockdep.c b/kernel/lockdep.c index 74b1878b8bb..06b0c3568f0 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c @@ -137,16 +137,16 @@ static inline struct lock_class *hlock_class(struct held_lock *hlock)  #ifdef CONFIG_LOCK_STAT  static DEFINE_PER_CPU(struct lock_class_stats[MAX_LOCKDEP_KEYS], lock_stats); -static int lock_contention_point(struct lock_class *class, unsigned long ip) +static int lock_point(unsigned long points[], unsigned long ip)  {  	int i; -	for (i = 0; i < ARRAY_SIZE(class->contention_point); i++) { -		if (class->contention_point[i] == 0) { -			class->contention_point[i] = ip; +	for (i = 0; i < LOCKSTAT_POINTS; i++) { +		if (points[i] == 0) { +			points[i] = ip;  			break;  		} -		if (class->contention_point[i] == ip) +		if (points[i] == ip)  			break;  	} @@ -186,6 +186,9 @@ struct lock_class_stats lock_stats(struct lock_class *class)  		for (i = 0; i < ARRAY_SIZE(stats.contention_point); i++)  			stats.contention_point[i] += pcs->contention_point[i]; +		for (i = 0; i < ARRAY_SIZE(stats.contending_point); i++) +			stats.contending_point[i] += pcs->contending_point[i]; +  		lock_time_add(&pcs->read_waittime, &stats.read_waittime);  		lock_time_add(&pcs->write_waittime, &stats.write_waittime); @@ -210,6 +213,7 @@ void clear_lock_stats(struct lock_class *class)  		memset(cpu_stats, 0, sizeof(struct lock_class_stats));  	}  	memset(class->contention_point, 0, sizeof(class->contention_point)); +	memset(class->contending_point, 0, sizeof(class->contending_point));  }  static struct lock_class_stats *get_lock_stats(struct lock_class *class) @@ -288,14 +292,12 @@ void lockdep_off(void)  {  	current->lockdep_recursion++;  } -  EXPORT_SYMBOL(lockdep_off);  void lockdep_on(void)  {  	current->lockdep_recursion--;  } -  EXPORT_SYMBOL(lockdep_on);  /* @@ -577,7 +579,8 @@ static void print_lock_class_header(struct lock_class *class, int depth)  /*   * printk all lock dependencies starting at <entry>:   */ -static void print_lock_dependencies(struct lock_class *class, int depth) +static void __used +print_lock_dependencies(struct lock_class *class, int depth)  {  	struct lock_list *entry; @@ -2509,7 +2512,6 @@ void lockdep_init_map(struct lockdep_map *lock, const char *name,  	if (subclass)  		register_lock_class(lock, subclass, 1);  } -  EXPORT_SYMBOL_GPL(lockdep_init_map);  /* @@ -2690,8 +2692,9 @@ static int check_unlock(struct task_struct *curr, struct lockdep_map *lock,  }  static int -__lock_set_subclass(struct lockdep_map *lock, -		    unsigned int subclass, unsigned long ip) +__lock_set_class(struct lockdep_map *lock, const char *name, +		 struct lock_class_key *key, unsigned int subclass, +		 unsigned long ip)  {  	struct task_struct *curr = current;  	struct held_lock *hlock, *prev_hlock; @@ -2718,6 +2721,7 @@ __lock_set_subclass(struct lockdep_map *lock,  	return print_unlock_inbalance_bug(curr, lock, ip);  found_it: +	lockdep_init_map(lock, name, key, 0);  	class = register_lock_class(lock, subclass, 0);  	hlock->class_idx = class - lock_classes + 1; @@ -2902,9 +2906,9 @@ static void check_flags(unsigned long flags)  #endif  } -void -lock_set_subclass(struct lockdep_map *lock, -		  unsigned int subclass, unsigned long ip) +void lock_set_class(struct lockdep_map *lock, const char *name, +		    struct lock_class_key *key, unsigned int subclass, +		    unsigned long ip)  {  	unsigned long flags; @@ -2914,13 +2918,12 @@ lock_set_subclass(struct lockdep_map *lock,  	raw_local_irq_save(flags);  	current->lockdep_recursion = 1;  	check_flags(flags); -	if (__lock_set_subclass(lock, subclass, ip)) +	if (__lock_set_class(lock, name, key, subclass, ip))  		check_chain_key(current);  	current->lockdep_recursion = 0;  	raw_local_irq_restore(flags);  } - -EXPORT_SYMBOL_GPL(lock_set_subclass); +EXPORT_SYMBOL_GPL(lock_set_class);  /*   * We are not always called with irqs disabled - do that here, @@ -2944,7 +2947,6 @@ void lock_acquire(struct lockdep_map *lock, unsigned int subclass,  	current->lockdep_recursion = 0;  	raw_local_irq_restore(flags);  } -  EXPORT_SYMBOL_GPL(lock_acquire);  void lock_release(struct lockdep_map *lock, int nested, @@ -2962,7 +2964,6 @@ void lock_release(struct lockdep_map *lock, int nested,  	current->lockdep_recursion = 0;  	raw_local_irq_restore(flags);  } -  EXPORT_SYMBOL_GPL(lock_release);  #ifdef CONFIG_LOCK_STAT @@ -3000,7 +3001,7 @@ __lock_contended(struct lockdep_map *lock, unsigned long ip)  	struct held_lock *hlock, *prev_hlock;  	struct lock_class_stats *stats;  	unsigned int depth; -	int i, point; +	int i, contention_point, contending_point;  	depth = curr->lockdep_depth;  	if (DEBUG_LOCKS_WARN_ON(!depth)) @@ -3024,18 +3025,22 @@ __lock_contended(struct lockdep_map *lock, unsigned long ip)  found_it:  	hlock->waittime_stamp = sched_clock(); -	point = lock_contention_point(hlock_class(hlock), ip); +	contention_point = lock_point(hlock_class(hlock)->contention_point, ip); +	contending_point = lock_point(hlock_class(hlock)->contending_point, +				      lock->ip);  	stats = get_lock_stats(hlock_class(hlock)); -	if (point < ARRAY_SIZE(stats->contention_point)) -		stats->contention_point[point]++; +	if (contention_point < LOCKSTAT_POINTS) +		stats->contention_point[contention_point]++; +	if (contending_point < LOCKSTAT_POINTS) +		stats->contending_point[contending_point]++;  	if (lock->cpu != smp_processor_id())  		stats->bounces[bounce_contended + !!hlock->read]++;  	put_lock_stats(stats);  }  static void -__lock_acquired(struct lockdep_map *lock) +__lock_acquired(struct lockdep_map *lock, unsigned long ip)  {  	struct task_struct *curr = current;  	struct held_lock *hlock, *prev_hlock; @@ -3084,6 +3089,7 @@ found_it:  	put_lock_stats(stats);  	lock->cpu = cpu; +	lock->ip = ip;  }  void lock_contended(struct lockdep_map *lock, unsigned long ip) @@ -3105,7 +3111,7 @@ void lock_contended(struct lockdep_map *lock, unsigned long ip)  }  EXPORT_SYMBOL_GPL(lock_contended); -void lock_acquired(struct lockdep_map *lock) +void lock_acquired(struct lockdep_map *lock, unsigned long ip)  {  	unsigned long flags; @@ -3118,7 +3124,7 @@ void lock_acquired(struct lockdep_map *lock)  	raw_local_irq_save(flags);  	check_flags(flags);  	current->lockdep_recursion = 1; -	__lock_acquired(lock); +	__lock_acquired(lock, ip);  	current->lockdep_recursion = 0;  	raw_local_irq_restore(flags);  } @@ -3442,7 +3448,6 @@ retry:  	if (unlock)  		read_unlock(&tasklist_lock);  } -  EXPORT_SYMBOL_GPL(debug_show_all_locks);  /* @@ -3463,7 +3468,6 @@ void debug_show_held_locks(struct task_struct *task)  {  		__debug_show_held_locks(task);  } -  EXPORT_SYMBOL_GPL(debug_show_held_locks);  void lockdep_sys_exit(void)  |