lockdep: change a held lock's class
Impact: introduce new lockdep API Allow to change a held lock's class. Basically the same as the existing code to change a subclass therefore reuse all that. The XFS code will be able to use this to annotate their inode locking. Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
		
					parent
					
						
							
								cb9c34e6d0
							
						
					
				
			
			
				commit
				
					
						00ef9f7348
					
				
			
		
					 2 changed files with 19 additions and 17 deletions
				
			
		|  | @ -314,8 +314,15 @@ extern void lock_acquire(struct lockdep_map *lock, unsigned int subclass, | ||||||
| extern void lock_release(struct lockdep_map *lock, int nested, | extern void lock_release(struct lockdep_map *lock, int nested, | ||||||
| 			 unsigned long ip); | 			 unsigned long ip); | ||||||
| 
 | 
 | ||||||
| extern void lock_set_subclass(struct lockdep_map *lock, unsigned int subclass, | extern void lock_set_class(struct lockdep_map *lock, const char *name, | ||||||
| 			      unsigned long ip); | 			   struct lock_class_key *key, unsigned int subclass, | ||||||
|  | 			   unsigned long ip); | ||||||
|  | 
 | ||||||
|  | static inline void lock_set_subclass(struct lockdep_map *lock, | ||||||
|  | 		unsigned int subclass, unsigned long ip) | ||||||
|  | { | ||||||
|  | 	lock_set_class(lock, lock->name, lock->key, subclass, ip); | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| # define INIT_LOCKDEP				.lockdep_recursion = 0, | # define INIT_LOCKDEP				.lockdep_recursion = 0, | ||||||
| 
 | 
 | ||||||
|  | @ -333,6 +340,7 @@ static inline void lockdep_on(void) | ||||||
| 
 | 
 | ||||||
| # define lock_acquire(l, s, t, r, c, n, i)	do { } while (0) | # define lock_acquire(l, s, t, r, c, n, i)	do { } while (0) | ||||||
| # define lock_release(l, n, i)			do { } while (0) | # define lock_release(l, n, i)			do { } while (0) | ||||||
|  | # define lock_set_class(l, n, k, s, i)		do { } while (0) | ||||||
| # define lock_set_subclass(l, s, i)		do { } while (0) | # define lock_set_subclass(l, s, i)		do { } while (0) | ||||||
| # define lockdep_init()				do { } while (0) | # define lockdep_init()				do { } while (0) | ||||||
| # define lockdep_info()				do { } while (0) | # define lockdep_info()				do { } while (0) | ||||||
|  |  | ||||||
|  | @ -291,14 +291,12 @@ void lockdep_off(void) | ||||||
| { | { | ||||||
| 	current->lockdep_recursion++; | 	current->lockdep_recursion++; | ||||||
| } | } | ||||||
| 
 |  | ||||||
| EXPORT_SYMBOL(lockdep_off); | EXPORT_SYMBOL(lockdep_off); | ||||||
| 
 | 
 | ||||||
| void lockdep_on(void) | void lockdep_on(void) | ||||||
| { | { | ||||||
| 	current->lockdep_recursion--; | 	current->lockdep_recursion--; | ||||||
| } | } | ||||||
| 
 |  | ||||||
| EXPORT_SYMBOL(lockdep_on); | EXPORT_SYMBOL(lockdep_on); | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  | @ -2513,7 +2511,6 @@ void lockdep_init_map(struct lockdep_map *lock, const char *name, | ||||||
| 	if (subclass) | 	if (subclass) | ||||||
| 		register_lock_class(lock, subclass, 1); | 		register_lock_class(lock, subclass, 1); | ||||||
| } | } | ||||||
| 
 |  | ||||||
| EXPORT_SYMBOL_GPL(lockdep_init_map); | EXPORT_SYMBOL_GPL(lockdep_init_map); | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  | @ -2694,8 +2691,9 @@ static int check_unlock(struct task_struct *curr, struct lockdep_map *lock, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int | static int | ||||||
| __lock_set_subclass(struct lockdep_map *lock, | __lock_set_class(struct lockdep_map *lock, const char *name, | ||||||
| 		    unsigned int subclass, unsigned long ip) | 		 struct lock_class_key *key, unsigned int subclass, | ||||||
|  | 		 unsigned long ip) | ||||||
| { | { | ||||||
| 	struct task_struct *curr = current; | 	struct task_struct *curr = current; | ||||||
| 	struct held_lock *hlock, *prev_hlock; | 	struct held_lock *hlock, *prev_hlock; | ||||||
|  | @ -2722,6 +2720,7 @@ __lock_set_subclass(struct lockdep_map *lock, | ||||||
| 	return print_unlock_inbalance_bug(curr, lock, ip); | 	return print_unlock_inbalance_bug(curr, lock, ip); | ||||||
| 
 | 
 | ||||||
| found_it: | found_it: | ||||||
|  | 	lockdep_init_map(lock, name, key, 0); | ||||||
| 	class = register_lock_class(lock, subclass, 0); | 	class = register_lock_class(lock, subclass, 0); | ||||||
| 	hlock->class_idx = class - lock_classes + 1; | 	hlock->class_idx = class - lock_classes + 1; | ||||||
| 
 | 
 | ||||||
|  | @ -2906,9 +2905,9 @@ static void check_flags(unsigned long flags) | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void lock_set_class(struct lockdep_map *lock, const char *name, | ||||||
| lock_set_subclass(struct lockdep_map *lock, | 		    struct lock_class_key *key, unsigned int subclass, | ||||||
| 		  unsigned int subclass, unsigned long ip) | 		    unsigned long ip) | ||||||
| { | { | ||||||
| 	unsigned long flags; | 	unsigned long flags; | ||||||
| 
 | 
 | ||||||
|  | @ -2918,13 +2917,12 @@ lock_set_subclass(struct lockdep_map *lock, | ||||||
| 	raw_local_irq_save(flags); | 	raw_local_irq_save(flags); | ||||||
| 	current->lockdep_recursion = 1; | 	current->lockdep_recursion = 1; | ||||||
| 	check_flags(flags); | 	check_flags(flags); | ||||||
| 	if (__lock_set_subclass(lock, subclass, ip)) | 	if (__lock_set_class(lock, name, key, subclass, ip)) | ||||||
| 		check_chain_key(current); | 		check_chain_key(current); | ||||||
| 	current->lockdep_recursion = 0; | 	current->lockdep_recursion = 0; | ||||||
| 	raw_local_irq_restore(flags); | 	raw_local_irq_restore(flags); | ||||||
| } | } | ||||||
| 
 | EXPORT_SYMBOL_GPL(lock_set_class); | ||||||
| EXPORT_SYMBOL_GPL(lock_set_subclass); |  | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * We are not always called with irqs disabled - do that here, |  * We are not always called with irqs disabled - do that here, | ||||||
|  | @ -2948,7 +2946,6 @@ void lock_acquire(struct lockdep_map *lock, unsigned int subclass, | ||||||
| 	current->lockdep_recursion = 0; | 	current->lockdep_recursion = 0; | ||||||
| 	raw_local_irq_restore(flags); | 	raw_local_irq_restore(flags); | ||||||
| } | } | ||||||
| 
 |  | ||||||
| EXPORT_SYMBOL_GPL(lock_acquire); | EXPORT_SYMBOL_GPL(lock_acquire); | ||||||
| 
 | 
 | ||||||
| void lock_release(struct lockdep_map *lock, int nested, | void lock_release(struct lockdep_map *lock, int nested, | ||||||
|  | @ -2966,7 +2963,6 @@ void lock_release(struct lockdep_map *lock, int nested, | ||||||
| 	current->lockdep_recursion = 0; | 	current->lockdep_recursion = 0; | ||||||
| 	raw_local_irq_restore(flags); | 	raw_local_irq_restore(flags); | ||||||
| } | } | ||||||
| 
 |  | ||||||
| EXPORT_SYMBOL_GPL(lock_release); | EXPORT_SYMBOL_GPL(lock_release); | ||||||
| 
 | 
 | ||||||
| #ifdef CONFIG_LOCK_STAT | #ifdef CONFIG_LOCK_STAT | ||||||
|  | @ -3451,7 +3447,6 @@ retry: | ||||||
| 	if (unlock) | 	if (unlock) | ||||||
| 		read_unlock(&tasklist_lock); | 		read_unlock(&tasklist_lock); | ||||||
| } | } | ||||||
| 
 |  | ||||||
| EXPORT_SYMBOL_GPL(debug_show_all_locks); | EXPORT_SYMBOL_GPL(debug_show_all_locks); | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  | @ -3472,7 +3467,6 @@ void debug_show_held_locks(struct task_struct *task) | ||||||
| { | { | ||||||
| 		__debug_show_held_locks(task); | 		__debug_show_held_locks(task); | ||||||
| } | } | ||||||
| 
 |  | ||||||
| EXPORT_SYMBOL_GPL(debug_show_held_locks); | EXPORT_SYMBOL_GPL(debug_show_held_locks); | ||||||
| 
 | 
 | ||||||
| void lockdep_sys_exit(void) | void lockdep_sys_exit(void) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Peter Zijlstra
				Peter Zijlstra