Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 00ef9f73 authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Ingo Molnar
Browse files

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: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent cb9c34e6
Loading
Loading
Loading
Loading
+10 −2
Original line number Original line Diff line number Diff line
@@ -314,9 +314,16 @@ 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,
			   struct lock_class_key *key, unsigned int subclass,
			   unsigned long ip);
			   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,


#define lockdep_depth(tsk)	(debug_locks ? (tsk)->lockdep_depth : 0)
#define lockdep_depth(tsk)	(debug_locks ? (tsk)->lockdep_depth : 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)
+9 −15
Original line number Original line Diff line number Diff line
@@ -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 @@ void debug_show_all_locks(void)
	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)