|
@@ -1609,7 +1609,7 @@ long do_fork(unsigned long clone_flags,
|
|
* requested, no event is reported; otherwise, report if the event
|
|
* requested, no event is reported; otherwise, report if the event
|
|
* for the type of forking is enabled.
|
|
* for the type of forking is enabled.
|
|
*/
|
|
*/
|
|
- if (likely(user_mode(regs)) && !(clone_flags & CLONE_UNTRACED)) {
|
|
|
|
|
|
+ if (!(clone_flags & CLONE_UNTRACED) && likely(user_mode(regs))) {
|
|
if (clone_flags & CLONE_VFORK)
|
|
if (clone_flags & CLONE_VFORK)
|
|
trace = PTRACE_EVENT_VFORK;
|
|
trace = PTRACE_EVENT_VFORK;
|
|
else if ((clone_flags & CSIGNAL) != SIGCHLD)
|
|
else if ((clone_flags & CSIGNAL) != SIGCHLD)
|
|
@@ -1659,6 +1659,17 @@ long do_fork(unsigned long clone_flags,
|
|
return nr;
|
|
return nr;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#ifdef CONFIG_GENERIC_KERNEL_THREAD
|
|
|
|
+/*
|
|
|
|
+ * Create a kernel thread.
|
|
|
|
+ */
|
|
|
|
+pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)
|
|
|
|
+{
|
|
|
|
+ return do_fork(flags|CLONE_VM|CLONE_UNTRACED, (unsigned long)fn, NULL,
|
|
|
|
+ (unsigned long)arg, NULL, NULL);
|
|
|
|
+}
|
|
|
|
+#endif
|
|
|
|
+
|
|
#ifndef ARCH_MIN_MMSTRUCT_ALIGN
|
|
#ifndef ARCH_MIN_MMSTRUCT_ALIGN
|
|
#define ARCH_MIN_MMSTRUCT_ALIGN 0
|
|
#define ARCH_MIN_MMSTRUCT_ALIGN 0
|
|
#endif
|
|
#endif
|