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:
Peter Zijlstra 2008-12-04 09:00:17 +01:00 committed by Ingo Molnar
parent cb9c34e6d0
commit 00ef9f7348
2 changed files with 19 additions and 17 deletions

View file

@ -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)

View file

@ -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)