# This patch makes tt mode use filehandles for the pipes it uses for context # switching. This protects process creation against failing when there are # no free file descriptors. Index: um/arch/um/include/user_util.h =================================================================== --- um.orig/arch/um/include/user_util.h 2004-08-05 20:38:09.000000000 -0400 +++ um/arch/um/include/user_util.h 2004-08-05 22:54:05.000000000 -0400 @@ -73,7 +73,6 @@ extern void tracer_panic(char *msg, ...); extern char *get_umid(int only_if_set); extern void do_longjmp(void *p, int val); -extern void suspend_new_thread(int fd); extern int detach(int pid, int sig); extern int attach(int pid); extern void kill_child_dead(int pid); Index: um/arch/um/kernel/process.c =================================================================== --- um.orig/arch/um/kernel/process.c 2004-08-05 20:38:09.000000000 -0400 +++ um/arch/um/kernel/process.c 2004-08-05 22:54:30.000000000 -0400 @@ -134,16 +134,6 @@ return(arg.pid); } -void suspend_new_thread(int fd) -{ - char c; - - os_stop_process(os_getpid()); - - if(os_read_file(fd, &c, sizeof(c)) != sizeof(c)) - panic("read failed in suspend_new_thread"); -} - static int ptrace_child(void *arg) { int pid = os_getpid(); Index: um/arch/um/kernel/skas/process.c =================================================================== --- um.orig/arch/um/kernel/skas/process.c 2004-08-05 21:24:26.000000000 -0400 +++ um/arch/um/kernel/skas/process.c 2004-08-05 22:54:30.000000000 -0400 @@ -356,28 +356,6 @@ siglongjmp(initial_jmpbuf, 4); } -int new_mm(int from) -{ - struct proc_mm_op copy; - int n, fd = os_open_file("/proc/mm", - of_cloexec(of_write(OPENFLAGS())), 0); - - if(fd < 0) - return(fd); - - if(from != -1){ - copy = ((struct proc_mm_op) { .op = MM_COPY_SEGMENTS, - .u = - { .copy_segments = from } } ); - n = os_write_file(fd, ©, sizeof(copy)); - if(n != sizeof(copy)) - printk("new_mm : /proc/mm copy_segments failed, " - "err = %d\n", -n); - } - - return(fd); -} - void switch_mm_skas(int mm_fd) { int err; Index: um/arch/um/kernel/skas/process_kern.c =================================================================== --- um.orig/arch/um/kernel/skas/process_kern.c 2004-08-05 22:40:59.000000000 -0400 +++ um/arch/um/kernel/skas/process_kern.c 2004-08-05 22:54:40.000000000 -0400 @@ -16,6 +16,8 @@ #include "frame.h" #include "kern.h" #include "mode.h" +#include "filehandle.h" +#include "proc_mm.h" int singlestepping_skas(void) { @@ -136,6 +138,28 @@ return(0); } +int new_mm(int from) +{ + struct proc_mm_op copy; + int n, fd; + + fd = open_file("/proc/mm", of_cloexec(of_write(OPENFLAGS())), 0); + if(fd < 0) + return(fd); + + if(from != -1){ + copy = ((struct proc_mm_op) { .op = MM_COPY_SEGMENTS, + .u = + { .copy_segments = from } } ); + n = os_write_file(fd, ©, sizeof(copy)); + if(n != sizeof(copy)) + printk("new_mm : /proc/mm copy_segments failed, " + "err = %d\n", -n); + } + + return(fd); +} + void init_idle_skas(void) { cpu_tasks[current_thread->cpu].pid = os_getpid(); Index: um/arch/um/kernel/smp.c =================================================================== --- um.orig/arch/um/kernel/smp.c 2004-08-05 20:38:09.000000000 -0400 +++ um/arch/um/kernel/smp.c 2004-08-05 22:02:40.000000000 -0400 @@ -116,8 +116,7 @@ .task = new_task } ); idle_threads[cpu] = new_task; CHOOSE_MODE(os_write_file(new_task->thread.mode.tt.switch_pipe[1], &c, - sizeof(c)), - ({ panic("skas mode doesn't support SMP"); })); + sizeof(c)), wake_up_forked_process(new_task); return(new_task); } Index: um/arch/um/kernel/tt/process_kern.c =================================================================== --- um.orig/arch/um/kernel/tt/process_kern.c 2004-08-05 20:38:09.000000000 -0400 +++ um/arch/um/kernel/tt/process_kern.c 2004-08-05 22:54:05.000000000 -0400 @@ -116,6 +116,17 @@ os_close_file(current->thread.mode.tt.switch_pipe[1]); } +void suspend_new_thread(int fd) +{ + int err; + char c; + + os_stop_process(os_getpid()); + err = os_read_file(fd, &c, sizeof(c)); + if(err != sizeof(c)) + panic("read failed in suspend_new_thread, err = %d", -err); +} + void schedule_tail(task_t *prev); static void new_thread_handler(int sig) @@ -236,7 +247,7 @@ err = os_pipe(p->thread.mode.tt.switch_pipe, 1, 1); if(err < 0){ printk("copy_thread : pipe failed, err = %d\n", -err); - return(err); + goto out; } stack = alloc_stack(0, 0); @@ -267,7 +278,9 @@ current->thread.request.op = OP_FORK; current->thread.request.u.fork.pid = new_pid; os_usr1_process(os_getpid()); - return(0); + err = 0; + out: + return(err); } void reboot_tt(void) @@ -475,7 +488,7 @@ init_task.thread.mode.tt.extern_pid = pid; err = os_pipe(init_task.thread.mode.tt.switch_pipe, 1, 1); - if(err) + if(err) panic("Can't create switch pipe for init_task, errno = %d", -err); } Index: um/include/asm-um/processor-generic.h =================================================================== --- um.orig/include/asm-um/processor-generic.h 2004-08-05 20:38:09.000000000 -0400 +++ um/include/asm-um/processor-generic.h 2004-08-05 22:09:42.000000000 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) + * Copyright (C) 2000 - 2004 Jeff Dike (jdike@addtoit.com) * Licensed under the GPL */