We need to call exit_thread from copy_process in a fail path. So make it accept task_struct as a parameter. [v2] * s390: exit_thread_runtime_instr doesn't make sense to be called for non-current tasks. * arm: fix the comment in vfp_thread_copy * change 'me' to 'tsk' for task_struct * now we can change only archs that actually have exit_thread [akpm@linux-foundation.org: coding-style fixes] Signed-off-by: Jiri Slaby <jslaby@suse.cz> Cc: "David S. Miller" <davem@davemloft.net> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: "James E.J. Bottomley" <jejb@parisc-linux.org> Cc: Aurelien Jacquiot <a-jacquiot@ti.com> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Chen Liqin <liqin.linux@gmail.com> Cc: Chris Metcalf <cmetcalf@mellanox.com> Cc: Chris Zankel <chris@zankel.net> Cc: David Howells <dhowells@redhat.com> Cc: Fenghua Yu <fenghua.yu@intel.com> Cc: Geert Uytterhoeven <geert@linux-m68k.org> Cc: Guan Xuetao <gxt@mprc.pku.edu.cn> Cc: Haavard Skinnemoen <hskinnemoen@gmail.com> Cc: Hans-Christian Egtvedt <egtvedt@samfundet.no> Cc: Heiko Carstens <heiko.carstens@de.ibm.com> Cc: Helge Deller <deller@gmx.de> Cc: Ingo Molnar <mingo@redhat.com> Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru> Cc: James Hogan <james.hogan@imgtec.com> Cc: Jeff Dike <jdike@addtoit.com> Cc: Jesper Nilsson <jesper.nilsson@axis.com> Cc: Jiri Slaby <jslaby@suse.cz> Cc: Jonas Bonn <jonas@southpole.se> Cc: Koichi Yasutake <yasutake.koichi@jp.panasonic.com> Cc: Lennox Wu <lennox.wu@gmail.com> Cc: Ley Foon Tan <lftan@altera.com> Cc: Mark Salter <msalter@redhat.com> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Cc: Matt Turner <mattst88@gmail.com> Cc: Max Filippov <jcmvbkbc@gmail.com> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Michal Simek <monstr@monstr.eu> Cc: Mikael Starvik <starvik@axis.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Ralf Baechle <ralf@linux-mips.org> Cc: Rich Felker <dalias@libc.org> Cc: Richard Henderson <rth@twiddle.net> Cc: Richard Kuo <rkuo@codeaurora.org> Cc: Richard Weinberger <richard@nod.at> Cc: Russell King <linux@arm.linux.org.uk> Cc: Steven Miao <realmz6@gmail.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Tony Luck <tony.luck@intel.com> Cc: Vineet Gupta <vgupta@synopsys.com> Cc: Will Deacon <will.deacon@arm.com> Cc: Yoshinori Sato <ysato@users.sourceforge.jp> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Unified · Split
| @@ -193,9 +193,9 @@ EXPORT_SYMBOL_GPL(thread_notify_head); · 192 unmodified lines | |||
| 193 | /* | 193 | /* |
| 194 | * Free current thread data structures etc.. | 194 | * Free current thread data structures etc.. |
| 195 | */ | 195 | */ |
| 196 | void exit_thread(void) | 196 | void exit_thread(struct task_struct *tsk) |
| 197 | { | 197 | { |
| 198 | thread_notify(THREAD_NOTIFY_EXIT, current_thread_info()); | 198 | thread_notify(THREAD_NOTIFY_EXIT, task_thread_info(tsk)); |
| 199 | } | 199 | } |
| 200 | 200 | ||
| 201 | void flush_thread(void) | 201 | void flush_thread(void) |
| @@ -156,10 +156,6 @@ static void vfp_thread_copy(struct thread_info *thread) · 155 unmodified lines | |||
| 156 | * - we could be preempted if tree preempt rcu is enabled, so | 156 | * - we could be preempted if tree preempt rcu is enabled, so |
| 157 | * it is unsafe to use thread->cpu. | 157 | * it is unsafe to use thread->cpu. |
| 158 | * THREAD_NOTIFY_EXIT | 158 | * THREAD_NOTIFY_EXIT |
| 159 | * - the thread (v) will be running on the local CPU, so | ||
| 160 | * v === current_thread_info() | ||
| 161 | * - thread->cpu is the local CPU number at the time it is accessed, | ||
| 162 | * but may change at any time. | ||
| 163 | * - we could be preempted if tree preempt rcu is enabled, so | 159 | * - we could be preempted if tree preempt rcu is enabled, so |
| 164 | * it is unsafe to use thread->cpu. | 160 | * it is unsafe to use thread->cpu. |
| 165 | */ | 161 | */ |
| @@ -62,9 +62,9 @@ void machine_restart(char *cmd) · 61 unmodified lines | |||
| 62 | /* | 62 | /* |
| 63 | * Free current thread data structures etc | 63 | * Free current thread data structures etc |
| 64 | */ | 64 | */ |
| 65 | void exit_thread(void) | 65 | void exit_thread(struct task_struct *tsk) |
| 66 | { | 66 | { |
| 67 | ocd_disable(current); | 67 | ocd_disable(tsk); |
| 68 | } | 68 | } |
| 69 | 69 | ||
| 70 | void flush_thread(void) | 70 | void flush_thread(void) |
| @@ -33,9 +33,9 @@ void default_idle(void) · 32 unmodified lines | |||
| 33 | */ | 33 | */ |
| 34 | 34 | ||
| 35 | extern void deconfigure_bp(long pid); | 35 | extern void deconfigure_bp(long pid); |
| 36 | void exit_thread(void) | 36 | void exit_thread(struct task_struct *tsk) |
| 37 | { | 37 | { |
| 38 | deconfigure_bp(current->pid); | 38 | deconfigure_bp(tsk->pid); |
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | /* | 41 | /* |
| @@ -4542,8 +4542,8 @@ pfm_context_unload(pfm_context_t *ctx, void *arg, int count, struct pt_regs *reg · 4541 unmodified lines | |||
| 4542 | 4542 | ||
| 4543 | 4543 | ||
| 4544 | /* | 4544 | /* |
| 4545 | * called only from exit_thread(): task == current | 4545 | * called only from exit_thread() |
| 4546 | * we come here only if current has a context attached (loaded or masked) | 4546 | * we come here only if the task has a context attached (loaded or masked) |
| 4547 | */ | 4547 | */ |
| 4548 | void | 4548 | void |
| 4549 | pfm_exit_thread(struct task_struct *task) | 4549 | pfm_exit_thread(struct task_struct *task) |
| @@ -570,22 +570,22 @@ flush_thread (void) · 569 unmodified lines | |||
| 570 | } | 570 | } |
| 571 | 571 | ||
| 572 | /* | 572 | /* |
| 573 | * Clean up state associated with current thread. This is called when | 573 | * Clean up state associated with a thread. This is called when |
| 574 | * the thread calls exit(). | 574 | * the thread calls exit(). |
| 575 | */ | 575 | */ |
| 576 | void | 576 | void |
| 577 | exit_thread (void) | 577 | exit_thread (struct task_struct *tsk) |
| 578 | { | 578 | { |
| 579 | 579 | ||
| 580 | ia64_drop_fpu(current); | 580 | ia64_drop_fpu(tsk); |
| 581 | #ifdef CONFIG_PERFMON | 581 | #ifdef CONFIG_PERFMON |
| 582 | /* if needed, stop monitoring and flush state to perfmon context */ | 582 | /* if needed, stop monitoring and flush state to perfmon context */ |
| 583 | if (current->thread.pfm_context) | 583 | if (tsk->thread.pfm_context) |
| 584 | pfm_exit_thread(current); | 584 | pfm_exit_thread(tsk); |
| 585 | 585 | ||
| 586 | /* free debug register resources */ | 586 | /* free debug register resources */ |
| 587 | if (current->thread.flags & IA64_THREAD_DBG_VALID) | 587 | if (tsk->thread.flags & IA64_THREAD_DBG_VALID) |
| 588 | pfm_release_debug_registers(current); | 588 | pfm_release_debug_registers(tsk); |
| 589 | #endif | 589 | #endif |
| 590 | } | 590 | } |
| 591 | 591 | ||
| @@ -345,10 +345,10 @@ void flush_thread(void) · 344 unmodified lines | |||
| 345 | /* | 345 | /* |
| 346 | * Free current thread data structures etc. | 346 | * Free current thread data structures etc. |
| 347 | */ | 347 | */ |
| 348 | void exit_thread(void) | 348 | void exit_thread(struct task_struct *tsk) |
| 349 | { | 349 | { |
| 350 | clear_fpu(¤t->thread); | 350 | clear_fpu(&tsk->thread); |
| 351 | clear_dsp(¤t->thread); | 351 | clear_dsp(&tsk->thread); |
| 352 | } | 352 | } |
| 353 | 353 | ||
| 354 | /* TODO: figure out how to unwind the kernel stack here to figure out | 354 | /* TODO: figure out how to unwind the kernel stack here to figure out |
| @@ -103,9 +103,9 @@ void show_regs(struct pt_regs *regs) · 102 unmodified lines | |||
| 103 | /* | 103 | /* |
| 104 | * free current thread data structures etc.. | 104 | * free current thread data structures etc.. |
| 105 | */ | 105 | */ |
| 106 | void exit_thread(void) | 106 | void exit_thread(struct task_struct *tsk) |
| 107 | { | 107 | { |
| 108 | exit_fpu(current); | 108 | exit_fpu(tsk); |
| 109 | } | 109 | } |
| 110 | 110 | ||
| 111 | void flush_thread(void) | 111 | void flush_thread(void) |
| @@ -68,9 +68,10 @@ extern void kernel_thread_starter(void); · 67 unmodified lines | |||
| 68 | /* | 68 | /* |
| 69 | * Free current thread data structures etc.. | 69 | * Free current thread data structures etc.. |
| 70 | */ | 70 | */ |
| 71 | void exit_thread(void) | 71 | void exit_thread(struct task_struct *tsk) |
| 72 | { | 72 | { |
| 73 | exit_thread_runtime_instr(); | 73 | if (tsk == current) |
| 74 | exit_thread_runtime_instr(); | ||
| 74 | } | 75 | } |
| 75 | 76 | ||
| 76 | void flush_thread(void) | 77 | void flush_thread(void) |
| @@ -288,7 +288,7 @@ void show_regs(struct pt_regs *regs) · 287 unmodified lines | |||
| 288 | /* | 288 | /* |
| 289 | * Free current thread data structures etc.. | 289 | * Free current thread data structures etc.. |
| 290 | */ | 290 | */ |
| 291 | void exit_thread(void) | 291 | void exit_thread(struct task_struct *tsk) |
| 292 | { | 292 | { |
| 293 | /* | 293 | /* |
| 294 | * See arch/sparc/kernel/process.c for the precedent for doing | 294 | * See arch/sparc/kernel/process.c for the precedent for doing |
| @@ -307,9 +307,8 @@ void exit_thread(void) · 12 unmodified lines | |||
| 307 | * which it would get safely nulled. | 307 | * which it would get safely nulled. |
| 308 | */ | 308 | */ |
| 309 | #ifdef CONFIG_SH_FPU | 309 | #ifdef CONFIG_SH_FPU |
| 310 | if (last_task_used_math == current) { | 310 | if (last_task_used_math == tsk) |
| 311 | last_task_used_math = NULL; | 311 | last_task_used_math = NULL; |
| 312 | } | ||
| 313 | #endif | 312 | #endif |
| 314 | } | 313 | } |
| 315 | 314 | ||
| @@ -184,21 +184,21 @@ unsigned long thread_saved_pc(struct task_struct *tsk) · 183 unmodified lines | |||
| 184 | /* | 184 | /* |
| 185 | * Free current thread data structures etc.. | 185 | * Free current thread data structures etc.. |
| 186 | */ | 186 | */ |
| 187 | void exit_thread(void) | 187 | void exit_thread(struct task_struct *tsk) |
| 188 | { | 188 | { |
| 189 | #ifndef CONFIG_SMP | 189 | #ifndef CONFIG_SMP |
| 190 | if(last_task_used_math == current) { | 190 | if (last_task_used_math == tsk) { |
| 191 | #else | 191 | #else |
| 192 | if (test_thread_flag(TIF_USEDFPU)) { | 192 | if (test_ti_thread_flag(task_thread_info(tsk), TIF_USEDFPU)) { |
| 193 | #endif | 193 | #endif |
| 194 | /* Keep process from leaving FPU in a bogon state. */ | 194 | /* Keep process from leaving FPU in a bogon state. */ |
| 195 | put_psr(get_psr() | PSR_EF); | 195 | put_psr(get_psr() | PSR_EF); |
| 196 | fpsave(¤t->thread.float_regs[0], ¤t->thread.fsr, | 196 | fpsave(&tsk->thread.float_regs[0], &tsk->thread.fsr, |
| 197 | ¤t->thread.fpqueue[0], ¤t->thread.fpqdepth); | 197 | &tsk->thread.fpqueue[0], &tsk->thread.fpqdepth); |
| 198 | #ifndef CONFIG_SMP | 198 | #ifndef CONFIG_SMP |
| 199 | last_task_used_math = NULL; | 199 | last_task_used_math = NULL; |
| 200 | #else | 200 | #else |
| 201 | clear_thread_flag(TIF_USEDFPU); | 201 | clear_ti_thread_flag(task_thread_info(tsk), TIF_USEDFPU); |
| 202 | #endif | 202 | #endif |
| 203 | } | 203 | } |
| 204 | } | 204 | } |
| @@ -417,9 +417,9 @@ unsigned long thread_saved_pc(struct task_struct *tsk) · 416 unmodified lines | |||
| 417 | } | 417 | } |
| 418 | 418 | ||
| 419 | /* Free current thread data structures etc.. */ | 419 | /* Free current thread data structures etc.. */ |
| 420 | void exit_thread(void) | 420 | void exit_thread(struct task_struct *tsk) |
| 421 | { | 421 | { |
| 422 | struct thread_info *t = current_thread_info(); | 422 | struct thread_info *t = task_thread_info(tsk); |
| 423 | 423 | ||
| 424 | if (t->utraps) { | 424 | if (t->utraps) { |
| 425 | if (t->utraps[0] < 2) | 425 | if (t->utraps[0] < 2) |
| @@ -541,7 +541,7 @@ void flush_thread(void) · 540 unmodified lines | |||
| 541 | /* | 541 | /* |
| 542 | * Free current thread data structures etc.. | 542 | * Free current thread data structures etc.. |
| 543 | */ | 543 | */ |
| 544 | void exit_thread(void) | 544 | void exit_thread(struct task_struct *tsk) |
| 545 | { | 545 | { |
| 546 | #ifdef CONFIG_HARDWALL | 546 | #ifdef CONFIG_HARDWALL |
| 547 | /* | 547 | /* |
| @@ -550,7 +550,7 @@ void exit_thread(void) · 2 unmodified lines | |||
| 550 | * the last reference to a hardwall fd, it would already have | 550 | * the last reference to a hardwall fd, it would already have |
| 551 | * been released and deactivated at this point.) | 551 | * been released and deactivated at this point.) |
| 552 | */ | 552 | */ |
| 553 | hardwall_deactivate_all(current); | 553 | hardwall_deactivate_all(tsk); |
| 554 | #endif | 554 | #endif |
| 555 | } | 555 | } |
| 556 | 556 | ||
| @@ -97,10 +97,9 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src) · 96 unmodified lines | |||
| 97 | /* | 97 | /* |
| 98 | * Free current thread data structures etc.. | 98 | * Free current thread data structures etc.. |
| 99 | */ | 99 | */ |
| 100 | void exit_thread(void) | 100 | void exit_thread(struct task_struct *tsk) |
| 101 | { | 101 | { |
| 102 | struct task_struct *me = current; | 102 | struct thread_struct *t = &tsk->thread; |
| 103 | struct thread_struct *t = &me->thread; | ||
| 104 | unsigned long *bp = t->io_bitmap_ptr; | 103 | unsigned long *bp = t->io_bitmap_ptr; |
| 105 | struct fpu *fpu = &t->fpu; | 104 | struct fpu *fpu = &t->fpu; |
| 106 | 105 | ||
| @@ -115,10 +115,10 @@ void arch_cpu_idle(void) · 114 unmodified lines | |||
| 115 | /* | 115 | /* |
| 116 | * This is called when the thread calls exit(). | 116 | * This is called when the thread calls exit(). |
| 117 | */ | 117 | */ |
| 118 | void exit_thread(void) | 118 | void exit_thread(struct task_struct *tsk) |
| 119 | { | 119 | { |
| 120 | #if XTENSA_HAVE_COPROCESSORS | 120 | #if XTENSA_HAVE_COPROCESSORS |
| 121 | coprocessor_release_all(current_thread_info()); | 121 | coprocessor_release_all(task_thread_info(tsk)); |
| 122 | #endif | 122 | #endif |
| 123 | } | 123 | } |
| 124 | 124 | ||
| @@ -2771,9 +2771,9 @@ static inline int copy_thread_tls( · 2770 unmodified lines | |||
| 2771 | extern void flush_thread(void); | 2771 | extern void flush_thread(void); |
| 2772 | 2772 | ||
| 2773 | #ifdef CONFIG_HAVE_EXIT_THREAD | 2773 | #ifdef CONFIG_HAVE_EXIT_THREAD |
| 2774 | extern void exit_thread(void); | 2774 | extern void exit_thread(struct task_struct *tsk); |
| 2775 | #else | 2775 | #else |
| 2776 | static inline void exit_thread(void) | 2776 | static inline void exit_thread(struct task_struct *tsk) |
| 2777 | { | 2777 | { |
| 2778 | } | 2778 | } |
| 2779 | #endif | 2779 | #endif |
| @@ -746,7 +746,7 @@ void do_exit(long code) · 745 unmodified lines | |||
| 746 | disassociate_ctty(1); | 746 | disassociate_ctty(1); |
| 747 | exit_task_namespaces(tsk); | 747 | exit_task_namespaces(tsk); |
| 748 | exit_task_work(tsk); | 748 | exit_task_work(tsk); |
| 749 | exit_thread(); | 749 | exit_thread(tsk); |
| 750 | 750 | ||
| 751 | /* | 751 | /* |
| 752 | * Flush inherited counters to the parent - before the parent | 752 | * Flush inherited counters to the parent - before the parent |