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 | 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 | 201 | void flush_thread(void) |
| @@ -156,10 +156,6 @@ static void vfp_thread_copy(struct thread_info *thread) · 155 unmodified lines | ||
| 156 | 156 | * - we could be preempted if tree preempt rcu is enabled, so |
| 157 | 157 | * it is unsafe to use thread->cpu. |
| 158 | 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 | 159 | * - we could be preempted if tree preempt rcu is enabled, so |
| 164 | 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 | 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 | 70 | void flush_thread(void) |
| @@ -33,9 +33,9 @@ void default_idle(void) · 32 unmodified lines | ||
| 33 | 33 | */ |
| 34 | 34 | |
| 35 | 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 | |
| 4546 | − * we come here only if current has a context attached (loaded or masked) | |
| 4545 | + * called only from exit_thread() | |
| 4546 | + * we come here only if the task has a context attached (loaded or masked) | |
| 4547 | 4547 | */ |
| 4548 | 4548 | void |
| 4549 | 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 | 574 | * the thread calls exit(). |
| 575 | 575 | */ |
| 576 | 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 | 581 | #ifdef CONFIG_PERFMON |
| 582 | 582 | /* if needed, stop monitoring and flush state to perfmon context */ |
| 583 | − if (current->thread.pfm_context) | |
| 584 | − pfm_exit_thread(current); | |
| 583 | + if (tsk->thread.pfm_context) | |
| 584 | + pfm_exit_thread(tsk); | |
| 585 | 585 | |
| 586 | 586 | /* free debug register resources */ |
| 587 | − if (current->thread.flags & IA64_THREAD_DBG_VALID) | |
| 588 | − pfm_release_debug_registers(current); | |
| 587 | + if (tsk->thread.flags & IA64_THREAD_DBG_VALID) | |
| 588 | + pfm_release_debug_registers(tsk); | |
| 589 | 589 | #endif |
| 590 | 590 | } |
| 591 | 591 | |
| @@ -345,10 +345,10 @@ void flush_thread(void) · 344 unmodified lines | ||
| 345 | 345 | /* |
| 346 | 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); | |
| 351 | − clear_dsp(¤t->thread); | |
| 350 | + clear_fpu(&tsk->thread); | |
| 351 | + clear_dsp(&tsk->thread); | |
| 352 | 352 | } |
| 353 | 353 | |
| 354 | 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 | 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 | 111 | void flush_thread(void) |
| @@ -68,9 +68,10 @@ extern void kernel_thread_starter(void); · 67 unmodified lines | ||
| 68 | 68 | /* |
| 69 | 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 | 77 | void flush_thread(void) |
| @@ -288,7 +288,7 @@ void show_regs(struct pt_regs *regs) · 287 unmodified lines | ||
| 288 | 288 | /* |
| 289 | 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 | 294 | * See arch/sparc/kernel/process.c for the precedent for doing |
| @@ -307,9 +307,8 @@ void exit_thread(void) · 12 unmodified lines | ||
| 307 | 307 | * which it would get safely nulled. |
| 308 | 308 | */ |
| 309 | 309 | #ifdef CONFIG_SH_FPU |
| 310 | − if (last_task_used_math == current) { | |
| 310 | + if (last_task_used_math == tsk) | |
| 311 | 311 | last_task_used_math = NULL; |
| 312 | − } | |
| 313 | 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 | 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 | 189 | #ifndef CONFIG_SMP |
| 190 | − if(last_task_used_math == current) { | |
| 190 | + if (last_task_used_math == tsk) { | |
| 191 | 191 | #else |
| 192 | − if (test_thread_flag(TIF_USEDFPU)) { | |
| 192 | + if (test_ti_thread_flag(task_thread_info(tsk), TIF_USEDFPU)) { | |
| 193 | 193 | #endif |
| 194 | 194 | /* Keep process from leaving FPU in a bogon state. */ |
| 195 | 195 | put_psr(get_psr() | PSR_EF); |
| 196 | − fpsave(¤t->thread.float_regs[0], ¤t->thread.fsr, | |
| 197 | − ¤t->thread.fpqueue[0], ¤t->thread.fpqdepth); | |
| 196 | + fpsave(&tsk->thread.float_regs[0], &tsk->thread.fsr, | |
| 197 | + &tsk->thread.fpqueue[0], &tsk->thread.fpqdepth); | |
| 198 | 198 | #ifndef CONFIG_SMP |
| 199 | 199 | last_task_used_math = NULL; |
| 200 | 200 | #else |
| 201 | − clear_thread_flag(TIF_USEDFPU); | |
| 201 | + clear_ti_thread_flag(task_thread_info(tsk), TIF_USEDFPU); | |
| 202 | 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 | 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 | 424 | if (t->utraps) { |
| 425 | 425 | if (t->utraps[0] < 2) |
| @@ -541,7 +541,7 @@ void flush_thread(void) · 540 unmodified lines | ||
| 541 | 541 | /* |
| 542 | 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 | 546 | #ifdef CONFIG_HARDWALL |
| 547 | 547 | /* |
| @@ -550,7 +550,7 @@ void exit_thread(void) · 2 unmodified lines | ||
| 550 | 550 | * the last reference to a hardwall fd, it would already have |
| 551 | 551 | * been released and deactivated at this point.) |
| 552 | 552 | */ |
| 553 | − hardwall_deactivate_all(current); | |
| 553 | + hardwall_deactivate_all(tsk); | |
| 554 | 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 | 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; | |
| 103 | − struct thread_struct *t = &me->thread; | |
| 102 | + struct thread_struct *t = &tsk->thread; | |
| 104 | 103 | unsigned long *bp = t->io_bitmap_ptr; |
| 105 | 104 | struct fpu *fpu = &t->fpu; |
| 106 | 105 | |
| @@ -115,10 +115,10 @@ void arch_cpu_idle(void) · 114 unmodified lines | ||
| 115 | 115 | /* |
| 116 | 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 | 120 | #if XTENSA_HAVE_COPROCESSORS |
| 121 | − coprocessor_release_all(current_thread_info()); | |
| 121 | + coprocessor_release_all(task_thread_info(tsk)); | |
| 122 | 122 | #endif |
| 123 | 123 | } |
| 124 | 124 | |
| @@ -2771,9 +2771,9 @@ static inline int copy_thread_tls( · 2770 unmodified lines | ||
| 2771 | 2771 | extern void flush_thread(void); |
| 2772 | 2772 | |
| 2773 | 2773 | #ifdef CONFIG_HAVE_EXIT_THREAD |
| 2774 | −extern void exit_thread(void); | |
| 2774 | +extern void exit_thread(struct task_struct *tsk); | |
| 2775 | 2775 | #else |
| 2776 | −static inline void exit_thread(void) | |
| 2776 | +static inline void exit_thread(struct task_struct *tsk) | |
| 2777 | 2777 | { |
| 2778 | 2778 | } |
| 2779 | 2779 | #endif |
| @@ -746,7 +746,7 @@ void do_exit(long code) · 745 unmodified lines | ||
| 746 | 746 | disassociate_ctty(1); |
| 747 | 747 | exit_task_namespaces(tsk); |
| 748 | 748 | exit_task_work(tsk); |
| 749 | − exit_thread(); | |
| 749 | + exit_thread(tsk); | |
| 750 | 750 | |
| 751 | 751 | /* |
| 752 | 752 | * Flush inherited counters to the parent - before the parent |