diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-09 23:02:25 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-09 23:02:25 -0400 |
commit | 42859eea96ba6beabfb0369a1eeffa3c7d2bd9cb (patch) | |
tree | fa38aeda0d6e7a4c48a882b166b8643594a1ad50 /kernel/fork.c | |
parent | f59b51fe3d3092c08d7d554ecb40db24011b2ebc (diff) | |
parent | f322220d6159455da2b5a8a596d802c8695fed30 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal
Pull generic execve() changes from Al Viro:
"This introduces the generic kernel_thread() and kernel_execve()
functions, and switches x86, arm, alpha, um and s390 over to them."
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal: (26 commits)
s390: convert to generic kernel_execve()
s390: switch to generic kernel_thread()
s390: fold kernel_thread_helper() into ret_from_fork()
s390: fold execve_tail() into start_thread(), convert to generic sys_execve()
um: switch to generic kernel_thread()
x86, um/x86: switch to generic sys_execve and kernel_execve
x86: split ret_from_fork
alpha: introduce ret_from_kernel_execve(), switch to generic kernel_execve()
alpha: switch to generic kernel_thread()
alpha: switch to generic sys_execve()
arm: get rid of execve wrapper, switch to generic execve() implementation
arm: optimized current_pt_regs()
arm: introduce ret_from_kernel_execve(), switch to generic kernel_execve()
arm: split ret_from_fork, simplify kernel_thread() [based on patch by rmk]
generic sys_execve()
generic kernel_execve()
new helper: current_pt_regs()
preparation for generic kernel_thread()
um: kill thread->forking
um: let signal_delivered() do SIGTRAP on singlestepping into handler
...
Diffstat (limited to 'kernel/fork.c')
-rw-r--r-- | kernel/fork.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index 1cd7d581b3b2..8b20ab7d3aa2 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -1584,7 +1584,7 @@ long do_fork(unsigned long clone_flags, | |||
1584 | * requested, no event is reported; otherwise, report if the event | 1584 | * requested, no event is reported; otherwise, report if the event |
1585 | * for the type of forking is enabled. | 1585 | * for the type of forking is enabled. |
1586 | */ | 1586 | */ |
1587 | if (likely(user_mode(regs)) && !(clone_flags & CLONE_UNTRACED)) { | 1587 | if (!(clone_flags & CLONE_UNTRACED) && likely(user_mode(regs))) { |
1588 | if (clone_flags & CLONE_VFORK) | 1588 | if (clone_flags & CLONE_VFORK) |
1589 | trace = PTRACE_EVENT_VFORK; | 1589 | trace = PTRACE_EVENT_VFORK; |
1590 | else if ((clone_flags & CSIGNAL) != SIGCHLD) | 1590 | else if ((clone_flags & CSIGNAL) != SIGCHLD) |
@@ -1634,6 +1634,17 @@ long do_fork(unsigned long clone_flags, | |||
1634 | return nr; | 1634 | return nr; |
1635 | } | 1635 | } |
1636 | 1636 | ||
1637 | #ifdef CONFIG_GENERIC_KERNEL_THREAD | ||
1638 | /* | ||
1639 | * Create a kernel thread. | ||
1640 | */ | ||
1641 | pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) | ||
1642 | { | ||
1643 | return do_fork(flags|CLONE_VM|CLONE_UNTRACED, (unsigned long)fn, NULL, | ||
1644 | (unsigned long)arg, NULL, NULL); | ||
1645 | } | ||
1646 | #endif | ||
1647 | |||
1637 | #ifndef ARCH_MIN_MMSTRUCT_ALIGN | 1648 | #ifndef ARCH_MIN_MMSTRUCT_ALIGN |
1638 | #define ARCH_MIN_MMSTRUCT_ALIGN 0 | 1649 | #define ARCH_MIN_MMSTRUCT_ALIGN 0 |
1639 | #endif | 1650 | #endif |