Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

exit_thread: accept a task parameter to be exited

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>

authored by

Jiri Slaby and committed by
Linus Torvalds
e6464694 5f56a5df

+42 -47
+2 -2
arch/arm/kernel/process.c
··· 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)
-4
arch/arm/vfp/vfpmodule.c
··· 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 */
+2 -2
arch/avr32/kernel/process.c
··· 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)
+2 -2
arch/cris/arch-v32/kernel/process.c
··· 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 /*
+2 -2
arch/ia64/kernel/perfmon.c
··· 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)
+7 -7
arch/ia64/kernel/process.c
··· 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
+3 -3
arch/metag/kernel/process.c
··· 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(&current->thread); 351 - clear_dsp(&current->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
+2 -2
arch/mn10300/kernel/process.c
··· 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)
+3 -2
arch/s390/kernel/process.c
··· 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)
+2 -3
arch/sh/kernel/process_64.c
··· 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 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
+6 -6
arch/sparc/kernel/process_32.c
··· 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(&current->thread.float_regs[0], &current->thread.fsr, 197 - &current->thread.fpqueue[0], &current->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 }
+2 -2
arch/sparc/kernel/process_64.c
··· 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)
+2 -2
arch/tile/kernel/process.c
··· 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 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
+2 -3
arch/x86/kernel/process.c
··· 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
+2 -2
arch/xtensa/kernel/process.c
··· 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
+2 -2
include/linux/sched.h
··· 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
+1 -1
kernel/exit.c
··· 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