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) | |||
| 85 | BUG_ON(!sig); | 85 | BUG_ON(!sig); |
| 86 | BUG_ON(!atomic_read(&sig->count)); | 86 | BUG_ON(!atomic_read(&sig->count)); |
| 87 | 87 | ||
| 88 | sighand = rcu_dereference(tsk->sighand); | 88 | sighand = rcu_dereference_check(tsk->sighand, |
| 89 | rcu_read_lock_held() || | ||
| 90 | lockdep_is_held(&tasklist_lock)); | ||
| 89 | spin_lock(&sighand->siglock); | 91 | spin_lock(&sighand->siglock); |
| 90 | 92 | ||
| 91 | posix_cpu_timers_exit(tsk); | 93 | posix_cpu_timers_exit(tsk); |
| @@ -170,8 +172,10 @@ void release_task(struct task_struct * p) | |||
| 170 | repeat: | 172 | repeat: |
| 171 | tracehook_prepare_release_task(p); | 173 | tracehook_prepare_release_task(p); |
| 172 | /* don't need to get the RCU readlock here - the process is dead and | 174 | /* don't need to get the RCU readlock here - the process is dead and |
| 173 | * can't be modifying its own credentials */ | 175 | * can't be modifying its own credentials. But shut RCU-lockdep up */ |
| 176 | rcu_read_lock(); | ||
| 174 | atomic_dec(&__task_cred(p)->user->processes); | 177 | atomic_dec(&__task_cred(p)->user->processes); |
| 178 | rcu_read_unlock(); | ||
| 175 | 179 | ||
| 176 | proc_flush_task(p); | 180 | proc_flush_task(p); |
| 177 | 181 | ||
| @@ -473,9 +477,11 @@ static void close_files(struct files_struct * files) | |||
| 473 | /* | 477 | /* |
| 474 | * It is safe to dereference the fd table without RCU or | 478 | * It is safe to dereference the fd table without RCU or |
| 475 | * ->file_lock because this is the last reference to the | 479 | * ->file_lock because this is the last reference to the |
| 476 | * files structure. | 480 | * files structure. But use RCU to shut RCU-lockdep up. |
| 477 | */ | 481 | */ |
| 482 | rcu_read_lock(); | ||
| 478 | fdt = files_fdtable(files); | 483 | fdt = files_fdtable(files); |
| 484 | rcu_read_unlock(); | ||
| 479 | for (;;) { | 485 | for (;;) { |
| 480 | unsigned long set; | 486 | unsigned long set; |
| 481 | i = j * __NFDBITS; | 487 | i = j * __NFDBITS; |
| @@ -521,10 +527,12 @@ void put_files_struct(struct files_struct *files) | |||
| 521 | * at the end of the RCU grace period. Otherwise, | 527 | * at the end of the RCU grace period. Otherwise, |
| 522 | * you can free files immediately. | 528 | * you can free files immediately. |
| 523 | */ | 529 | */ |
| 530 | rcu_read_lock(); | ||
| 524 | fdt = files_fdtable(files); | 531 | fdt = files_fdtable(files); |
| 525 | if (fdt != &files->fdtab) | 532 | if (fdt != &files->fdtab) |
| 526 | kmem_cache_free(files_cachep, files); | 533 | kmem_cache_free(files_cachep, files); |
| 527 | free_fdtable(fdt); | 534 | free_fdtable(fdt); |
| 535 | rcu_read_unlock(); | ||
| 528 | } | 536 | } |
| 529 | } | 537 | } |
| 530 | 538 | ||
