diff options
Diffstat (limited to 'kernel/locking/spinlock_debug.c')
| -rw-r--r-- | kernel/locking/spinlock_debug.c | 32 | 
1 files changed, 16 insertions, 16 deletions
diff --git a/kernel/locking/spinlock_debug.c b/kernel/locking/spinlock_debug.c index 399669f7eba8..472dd462a40c 100644 --- a/kernel/locking/spinlock_debug.c +++ b/kernel/locking/spinlock_debug.c @@ -51,19 +51,19 @@ EXPORT_SYMBOL(__rwlock_init);  static void spin_dump(raw_spinlock_t *lock, const char *msg)  { -	struct task_struct *owner = NULL; +	struct task_struct *owner = READ_ONCE(lock->owner); -	if (lock->owner && lock->owner != SPINLOCK_OWNER_INIT) -		owner = lock->owner; +	if (owner == SPINLOCK_OWNER_INIT) +		owner = NULL;  	printk(KERN_EMERG "BUG: spinlock %s on CPU#%d, %s/%d\n",  		msg, raw_smp_processor_id(),  		current->comm, task_pid_nr(current));  	printk(KERN_EMERG " lock: %pS, .magic: %08x, .owner: %s/%d, "  			".owner_cpu: %d\n", -		lock, lock->magic, +		lock, READ_ONCE(lock->magic),  		owner ? owner->comm : "<none>",  		owner ? task_pid_nr(owner) : -1, -		lock->owner_cpu); +		READ_ONCE(lock->owner_cpu));  	dump_stack();  } @@ -80,16 +80,16 @@ static void spin_bug(raw_spinlock_t *lock, const char *msg)  static inline void  debug_spin_lock_before(raw_spinlock_t *lock)  { -	SPIN_BUG_ON(lock->magic != SPINLOCK_MAGIC, lock, "bad magic"); -	SPIN_BUG_ON(lock->owner == current, lock, "recursion"); -	SPIN_BUG_ON(lock->owner_cpu == raw_smp_processor_id(), +	SPIN_BUG_ON(READ_ONCE(lock->magic) != SPINLOCK_MAGIC, lock, "bad magic"); +	SPIN_BUG_ON(READ_ONCE(lock->owner) == current, lock, "recursion"); +	SPIN_BUG_ON(READ_ONCE(lock->owner_cpu) == raw_smp_processor_id(),  							lock, "cpu recursion");  }  static inline void debug_spin_lock_after(raw_spinlock_t *lock)  { -	lock->owner_cpu = raw_smp_processor_id(); -	lock->owner = current; +	WRITE_ONCE(lock->owner_cpu, raw_smp_processor_id()); +	WRITE_ONCE(lock->owner, current);  }  static inline void debug_spin_unlock(raw_spinlock_t *lock) @@ -99,8 +99,8 @@ static inline void debug_spin_unlock(raw_spinlock_t *lock)  	SPIN_BUG_ON(lock->owner != current, lock, "wrong owner");  	SPIN_BUG_ON(lock->owner_cpu != raw_smp_processor_id(),  							lock, "wrong CPU"); -	lock->owner = SPINLOCK_OWNER_INIT; -	lock->owner_cpu = -1; +	WRITE_ONCE(lock->owner, SPINLOCK_OWNER_INIT); +	WRITE_ONCE(lock->owner_cpu, -1);  }  /* @@ -187,8 +187,8 @@ static inline void debug_write_lock_before(rwlock_t *lock)  static inline void debug_write_lock_after(rwlock_t *lock)  { -	lock->owner_cpu = raw_smp_processor_id(); -	lock->owner = current; +	WRITE_ONCE(lock->owner_cpu, raw_smp_processor_id()); +	WRITE_ONCE(lock->owner, current);  }  static inline void debug_write_unlock(rwlock_t *lock) @@ -197,8 +197,8 @@ static inline void debug_write_unlock(rwlock_t *lock)  	RWLOCK_BUG_ON(lock->owner != current, lock, "wrong owner");  	RWLOCK_BUG_ON(lock->owner_cpu != raw_smp_processor_id(),  							lock, "wrong CPU"); -	lock->owner = SPINLOCK_OWNER_INIT; -	lock->owner_cpu = -1; +	WRITE_ONCE(lock->owner, SPINLOCK_OWNER_INIT); +	WRITE_ONCE(lock->owner_cpu, -1);  }  void do_raw_write_lock(rwlock_t *lock)  | 

