diff options
| -rw-r--r-- | kernel/lockdep.c | 86 | 
1 files changed, 8 insertions, 78 deletions
| diff --git a/kernel/lockdep.c b/kernel/lockdep.c index 1ba52e68355a..000d53a2da32 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c @@ -2061,13 +2061,13 @@ typedef int (*check_usage_f)(struct task_struct *, struct held_lock *,  			     enum lock_usage_bit bit, const char *name);  static int -mark_lock_irq_write(struct task_struct *curr, struct held_lock *this, -		      int new_bit) +mark_lock_irq(struct task_struct *curr, struct held_lock *this, int new_bit)  {  	const char *name = state_name(new_bit);  	const char *rname = state_rname(new_bit);  	int excl_bit = exclusive_bit(new_bit); +	int read = new_bit & 1;  	int dir = new_bit & 2;  	check_usage_f usage = dir ? @@ -2075,57 +2075,17 @@ mark_lock_irq_write(struct task_struct *curr, struct held_lock *this,  	if (!valid_state(curr, this, new_bit, excl_bit))  		return 0; -	if (!valid_state(curr, this, new_bit, excl_bit + 1)) -		return 0; -	/* -	 * just marked it hardirq-safe, check that this lock -	 * took no hardirq-unsafe lock in the past: -	 */ -	if (!usage(curr, this, excl_bit, name)) -		return 0; -#if STRICT_READ_CHECKS -	/* -	 * just marked it hardirq-safe, check that this lock -	 * took no hardirq-unsafe-read lock in the past: -	 */ -	if (!usage(curr, this, excl_bit + 1, rname)) +	if (!read && !valid_state(curr, this, new_bit, excl_bit + 1))  		return 0; -#endif -	if (state_verbose(new_bit, hlock_class(this))) -		return 2; - -	return 1; -} - -static int -mark_lock_irq_read(struct task_struct *curr, struct held_lock *this, -			   int new_bit) -{ -	const char *name = state_name(new_bit); -	const char *rname = state_rname(new_bit); - -	int excl_bit = exclusive_bit(new_bit); -	int dir = new_bit & 2; -	if (!valid_state(curr, this, new_bit, excl_bit)) +	if ((!read || (!dir || STRICT_READ_CHECKS)) && +			!usage(curr, this, excl_bit, name))  		return 0; -	if (!dir) { -		/* -		 * just marked it hardirq-read-safe, check that this lock -		 * took no hardirq-unsafe lock in the past: -		 */ -		if (!check_usage_forwards(curr, this, excl_bit, name)) -			return 0; -	} else if (STRICT_READ_CHECKS) { -		/* -		 * just marked it hardirq-read-unsafe, check that no -		 * hardirq-safe lock in the system ever took it in the past: -		 */ -		if (!check_usage_backwards(curr, this, excl_bit, name)) -			return 0; -	} +	if ((!read && STRICT_READ_CHECKS) && +			!usage(curr, this, excl_bit + 1, rname)) +		return 0;  	if (state_verbose(new_bit, hlock_class(this)))  		return 2; @@ -2133,36 +2093,6 @@ mark_lock_irq_read(struct task_struct *curr, struct held_lock *this,  	return 1;  } -static int mark_lock_irq(struct task_struct *curr, struct held_lock *this, -		enum lock_usage_bit new_bit) -{ -	int ret = 1; - -	switch(new_bit) { -	case LOCK_USED_IN_HARDIRQ: -	case LOCK_USED_IN_SOFTIRQ: -	case LOCK_USED_IN_RECLAIM_FS: -	case LOCK_ENABLED_HARDIRQ: -	case LOCK_ENABLED_SOFTIRQ: -	case LOCK_ENABLED_RECLAIM_FS: -		return mark_lock_irq_write(curr, this, new_bit); - -	case LOCK_USED_IN_HARDIRQ_READ: -	case LOCK_USED_IN_SOFTIRQ_READ: -	case LOCK_USED_IN_RECLAIM_FS_READ: -	case LOCK_ENABLED_HARDIRQ_READ: -	case LOCK_ENABLED_SOFTIRQ_READ: -	case LOCK_ENABLED_RECLAIM_FS_READ: -		return mark_lock_irq_read(curr, this, new_bit); - -	default: -		WARN_ON(1); -		break; -	} - -	return ret; -} -  enum mark_type {  #define LOCKDEP_STATE(__STATE)	__STATE,  #include "lockdep_states.h" | 
