diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-12 21:05:52 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-12 21:05:52 -0400 |
commit | 4e21fc138bfd7fe625ff5dc81541399aaf9d429b (patch) | |
tree | 43bedf14d2eee7711b8241dcfd6bd7b8737d9bd5 /arch/um | |
parent | 8418263e3547ed3816475e4c55a77004f0426ee6 (diff) | |
parent | 5522be6a4624a5f505555569e4d9cee946630686 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal
Pull third pile of kernel_execve() patches from Al Viro:
"The last bits of infrastructure for kernel_thread() et.al., with
alpha/arm/x86 use of those. Plus sanitizing the asm glue and
do_notify_resume() on alpha, fixing the "disabled irq while running
task_work stuff" breakage there.
At that point the rest of kernel_thread/kernel_execve/sys_execve work
can be done independently for different architectures. The only
pending bits that do depend on having all architectures converted are
restrictred to fs/* and kernel/* - that'll obviously have to wait for
the next cycle.
I thought we'd have to wait for all of them done before we start
eliminating the longjump-style insanity in kernel_execve(), but it
turned out there's a very simple way to do that without flagday-style
changes."
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal:
alpha: switch to saner kernel_execve() semantics
arm: switch to saner kernel_execve() semantics
x86, um: convert to saner kernel_execve() semantics
infrastructure for saner ret_from_kernel_thread semantics
make sure that kernel_thread() callbacks call do_exit() themselves
make sure that we always have a return path from kernel_execve()
ppc: eeh_event should just use kthread_run()
don't bother with kernel_thread/kernel_execve for launching linuxrc
alpha: get rid of switch_stack argument of do_work_pending()
alpha: don't bother passing switch_stack separately from regs
alpha: take SIGPENDING/NOTIFY_RESUME loop into signal.c
alpha: simplify TIF_NEED_RESCHED handling
Diffstat (limited to 'arch/um')
-rw-r--r-- | arch/um/include/asm/processor-generic.h | 2 | ||||
-rw-r--r-- | arch/um/include/shared/os.h | 1 | ||||
-rw-r--r-- | arch/um/kernel/exec.c | 5 | ||||
-rw-r--r-- | arch/um/kernel/process.c | 10 | ||||
-rw-r--r-- | arch/um/os-Linux/process.c | 13 |
5 files changed, 3 insertions, 28 deletions
diff --git a/arch/um/include/asm/processor-generic.h b/arch/um/include/asm/processor-generic.h index 1e82e954e978..c03cd5a02364 100644 --- a/arch/um/include/asm/processor-generic.h +++ b/arch/um/include/asm/processor-generic.h | |||
@@ -26,7 +26,6 @@ struct thread_struct { | |||
26 | jmp_buf *fault_catcher; | 26 | jmp_buf *fault_catcher; |
27 | struct task_struct *prev_sched; | 27 | struct task_struct *prev_sched; |
28 | unsigned long temp_stack; | 28 | unsigned long temp_stack; |
29 | jmp_buf *exec_buf; | ||
30 | struct arch_thread arch; | 29 | struct arch_thread arch; |
31 | jmp_buf switch_buf; | 30 | jmp_buf switch_buf; |
32 | int mm_count; | 31 | int mm_count; |
@@ -54,7 +53,6 @@ struct thread_struct { | |||
54 | .fault_addr = NULL, \ | 53 | .fault_addr = NULL, \ |
55 | .prev_sched = NULL, \ | 54 | .prev_sched = NULL, \ |
56 | .temp_stack = 0, \ | 55 | .temp_stack = 0, \ |
57 | .exec_buf = NULL, \ | ||
58 | .arch = INIT_ARCH_THREAD, \ | 56 | .arch = INIT_ARCH_THREAD, \ |
59 | .request = { 0 } \ | 57 | .request = { 0 } \ |
60 | } | 58 | } |
diff --git a/arch/um/include/shared/os.h b/arch/um/include/shared/os.h index 44883049c11d..95feaa47a2fb 100644 --- a/arch/um/include/shared/os.h +++ b/arch/um/include/shared/os.h | |||
@@ -191,7 +191,6 @@ extern int os_getpid(void); | |||
191 | extern int os_getpgrp(void); | 191 | extern int os_getpgrp(void); |
192 | 192 | ||
193 | extern void init_new_thread_signals(void); | 193 | extern void init_new_thread_signals(void); |
194 | extern int run_kernel_thread(int (*fn)(void *), void *arg, jmp_buf **jmp_ptr); | ||
195 | 194 | ||
196 | extern int os_map_memory(void *virt, int fd, unsigned long long off, | 195 | extern int os_map_memory(void *virt, int fd, unsigned long long off, |
197 | unsigned long len, int r, int w, int x); | 196 | unsigned long len, int r, int w, int x); |
diff --git a/arch/um/kernel/exec.c b/arch/um/kernel/exec.c index ab019c7f0b57..3a8ece7d09ca 100644 --- a/arch/um/kernel/exec.c +++ b/arch/um/kernel/exec.c | |||
@@ -47,8 +47,3 @@ void start_thread(struct pt_regs *regs, unsigned long eip, unsigned long esp) | |||
47 | #endif | 47 | #endif |
48 | } | 48 | } |
49 | EXPORT_SYMBOL(start_thread); | 49 | EXPORT_SYMBOL(start_thread); |
50 | |||
51 | void __noreturn ret_from_kernel_execve(struct pt_regs *unused) | ||
52 | { | ||
53 | UML_LONGJMP(current->thread.exec_buf, 1); | ||
54 | } | ||
diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c index 30629783b3e0..b6d699cdd557 100644 --- a/arch/um/kernel/process.c +++ b/arch/um/kernel/process.c | |||
@@ -135,14 +135,10 @@ void new_thread_handler(void) | |||
135 | arg = current->thread.request.u.thread.arg; | 135 | arg = current->thread.request.u.thread.arg; |
136 | 136 | ||
137 | /* | 137 | /* |
138 | * The return value is 1 if the kernel thread execs a process, | 138 | * callback returns only if the kernel thread execs a process |
139 | * 0 if it just exits | ||
140 | */ | 139 | */ |
141 | n = run_kernel_thread(fn, arg, ¤t->thread.exec_buf); | 140 | n = fn(arg); |
142 | if (n == 1) | 141 | userspace(¤t->thread.regs.regs); |
143 | userspace(¤t->thread.regs.regs); | ||
144 | else | ||
145 | do_exit(0); | ||
146 | } | 142 | } |
147 | 143 | ||
148 | /* Called magically, see new_thread_handler above */ | 144 | /* Called magically, see new_thread_handler above */ |
diff --git a/arch/um/os-Linux/process.c b/arch/um/os-Linux/process.c index 162bea3d91b2..b8f34c9e53ae 100644 --- a/arch/um/os-Linux/process.c +++ b/arch/um/os-Linux/process.c | |||
@@ -244,16 +244,3 @@ void init_new_thread_signals(void) | |||
244 | signal(SIGWINCH, SIG_IGN); | 244 | signal(SIGWINCH, SIG_IGN); |
245 | signal(SIGTERM, SIG_DFL); | 245 | signal(SIGTERM, SIG_DFL); |
246 | } | 246 | } |
247 | |||
248 | int run_kernel_thread(int (*fn)(void *), void *arg, jmp_buf **jmp_ptr) | ||
249 | { | ||
250 | jmp_buf buf; | ||
251 | int n; | ||
252 | |||
253 | *jmp_ptr = &buf; | ||
254 | n = UML_SETJMP(&buf); | ||
255 | if (n != 0) | ||
256 | return n; | ||
257 | (*fn)(arg); | ||
258 | return 0; | ||
259 | } | ||