diff options
Diffstat (limited to 'kernel/exit.c')
| -rw-r--r-- | kernel/exit.c | 14 | 
1 files changed, 11 insertions, 3 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index 546774a31a66..45ed043b8bf5 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -85,7 +85,9 @@ static void __exit_signal(struct task_struct *tsk)  	BUG_ON(!sig);  	BUG_ON(!atomic_read(&sig->count)); -	sighand = rcu_dereference(tsk->sighand); +	sighand = rcu_dereference_check(tsk->sighand, +					rcu_read_lock_held() || +					lockdep_is_held(&tasklist_lock));  	spin_lock(&sighand->siglock);  	posix_cpu_timers_exit(tsk); @@ -170,8 +172,10 @@ void release_task(struct task_struct * p)  repeat:  	tracehook_prepare_release_task(p);  	/* don't need to get the RCU readlock here - the process is dead and -	 * can't be modifying its own credentials */ +	 * can't be modifying its own credentials. But shut RCU-lockdep up */ +	rcu_read_lock();  	atomic_dec(&__task_cred(p)->user->processes); +	rcu_read_unlock();  	proc_flush_task(p); @@ -473,9 +477,11 @@ static void close_files(struct files_struct * files)  	/*  	 * It is safe to dereference the fd table without RCU or  	 * ->file_lock because this is the last reference to the -	 * files structure. +	 * files structure.  But use RCU to shut RCU-lockdep up.  	 */ +	rcu_read_lock();  	fdt = files_fdtable(files); +	rcu_read_unlock();  	for (;;) {  		unsigned long set;  		i = j * __NFDBITS; @@ -521,10 +527,12 @@ void put_files_struct(struct files_struct *files)  		 * at the end of the RCU grace period. Otherwise,  		 * you can free files immediately.  		 */ +		rcu_read_lock();  		fdt = files_fdtable(files);  		if (fdt != &files->fdtab)  			kmem_cache_free(files_cachep, files);  		free_fdtable(fdt); +		rcu_read_unlock();  	}  }  | 
