Date: Wed, 22 Aug 2007 00:57:05 GMT From: Jesper Brix Rosenkilde <jbr@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 125521 for review Message-ID: <200708220057.l7M0v5QU020530@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=125521 Change 125521 by jbr@jbr_bob on 2007/08/22 00:56:56 * Moved things around a bit * Removed dead and redundant code * Added rfork(RFPROC | RFMEM) (which fails) TODO: * fix RFMEM problem * fix some unmaping of the sysshm Affected files ... .. //depot/projects/soc2007/jbr-syscall/src/sys/kern/kern_exec.c#19 edit .. //depot/projects/soc2007/jbr-syscall/src/sys/kern/kern_fork.c#7 edit .. //depot/projects/soc2007/jbr-syscall/src/sys/kern/kern_proc.c#2 edit .. //depot/projects/soc2007/jbr-syscall/src/sys/sys/proc.h#7 edit .. //depot/projects/soc2007/jbr-syscall/src/sys/sys/types.h#4 edit .. //depot/projects/soc2007/jbr-syscall/src/sys/vm/vm_glue.c#6 edit .. //depot/projects/soc2007/jbr-syscall/src/sys/vm/vm_map.c#14 edit .. //depot/projects/soc2007/jbr-syscall/tests/fork.c#4 edit .. //depot/projects/soc2007/jbr-syscall/tests/mlibc/mlibc.c#3 edit .. //depot/projects/soc2007/jbr-syscall/tests/mlibc/mlibc.h#2 edit .. //depot/projects/soc2007/jbr-syscall/tests/rfork.c#1 add Differences ... ==== //depot/projects/soc2007/jbr-syscall/src/sys/kern/kern_exec.c#19 (text+ko) ==== @@ -445,8 +445,6 @@ goto exec_fail_dealloc; } - exec_map_sysshm(imgp); - /* * Special interpreter operation, cleanup and loop up to try to * activate the interpreter. @@ -739,6 +737,8 @@ vfs_mark_atime(imgp->vp, td); done1: + exec_map_sysshm(imgp); + /* * Free any resources malloc'd earlier that we didn't use. */ @@ -910,15 +910,10 @@ { int error = 0; struct proc *p = imgp->proc; - struct sysshm outsysshm; error = vm_map_sysshm(p); - PROC_LOCK(p); - outsysshm.pid = p->p_pid; - copyout(&outsysshm, (vm_offset_t *) p->p_usrsysshm, - sizeof(struct sysshm)); - PROC_UNLOCK(p); + proc_sysshm_out(p); return(error); } ==== //depot/projects/soc2007/jbr-syscall/src/sys/kern/kern_fork.c#7 (text+ko) ==== @@ -822,6 +822,7 @@ struct thread *td; struct trapframe *frame; { + proc_sysshm_out(td->td_proc); userret(td, frame); #ifdef KTRACE ==== //depot/projects/soc2007/jbr-syscall/src/sys/kern/kern_proc.c#2 (text+ko) ==== @@ -1150,6 +1150,16 @@ pargs_free(pa); } +void proc_sysshm_out(struct proc *p) +{ + struct sysshm outsysshm; + + PROC_LOCK(p); + outsysshm.pid = p->p_pid; + PROC_UNLOCK(p); + copyout(&outsysshm, (vm_offset_t *) p->p_usrsysshm, + sizeof(struct sysshm)); +} /* * This sysctl allows a process to retrieve the argument list or process * title for another process without groping around in the address space ==== //depot/projects/soc2007/jbr-syscall/src/sys/sys/proc.h#7 (text+ko) ==== @@ -473,6 +473,10 @@ u_int64_t rux_tu; /* (c) Previous total time in usec. */ }; +struct sysshm { + pid_t pid; +}; + /* * The old fashionned process. May have multiple threads. * Starts off with a single embedded THREAD. @@ -824,7 +828,8 @@ void faultin(struct proc *p); void fixjobc(struct proc *p, struct pgrp *pgrp, int entering); int fork1(struct thread *, int, int, struct proc **); -void fork_map_sysshm(struct proc *, struct proc *, int); +void fork_map_sysshm(struct proc *, int); +void proc_sysshm_out(struct proc *); void fork_exit(void (*)(void *, struct trapframe *), void *, struct trapframe *); void fork_return(struct thread *, struct trapframe *); ==== //depot/projects/soc2007/jbr-syscall/src/sys/sys/types.h#4 (text+ko) ==== @@ -372,12 +372,6 @@ __END_DECLS #endif /* !_KERNEL */ -struct sysshm { - pid_t pid; - char progtitle[20]; - char proctitle[2048]; -}; - #endif /* __BSD_VISIBLE */ #endif /* !_SYS_TYPES_H_ */ ==== //depot/projects/soc2007/jbr-syscall/src/sys/vm/vm_glue.c#6 (text+ko) ==== @@ -523,7 +523,7 @@ vmspace_unshare(p1); } } - fork_map_sysshm(p1, p2, flags); + fork_map_sysshm(p2, flags); cpu_fork(td, p2, td2, flags); return; } @@ -547,25 +547,14 @@ * cpu_fork will copy and update the pcb, set up the kernel stack, * and make the child ready to run. */ - fork_map_sysshm(p1, p2, flags); + fork_map_sysshm(p2, flags); cpu_fork(td, p2, td2, flags); } void -fork_map_sysshm(struct proc *old, struct proc *new, int flags) +fork_map_sysshm(struct proc *new, int flags) { - struct sysshm outsysshm; - - new->p_usrsysshm = (vm_offset_t) old->p_vmspace->vm_taddr - - old->p_usrsysshm + (vm_offset_t) new->p_vmspace->vm_taddr; - vm_map_sysshm(new); - - PROC_LOCK(new); - outsysshm.pid = new->p_pid; - PROC_UNLOCK(new); - copyout(&outsysshm, (vm_offset_t *) new->p_usrsysshm, - sizeof(struct sysshm)); } /* ==== //depot/projects/soc2007/jbr-syscall/src/sys/vm/vm_map.c#14 (text+ko) ==== @@ -3026,27 +3026,6 @@ != KERN_SUCCESS) panic("vm_map_sysshm: cannot wire page."); - vm_map_t tmap = map; - vm_map_entry_t entry; - vm_object_t object; - vm_pindex_t pindex; - vm_prot_t prot; - boolean_t wired; - vm_page_t page; - - if (vm_map_lookup(&tmap, addr, VM_PROT_READ|VM_PROT_WRITE, &entry, - &object, &pindex, &prot, &wired)) - panic("vm_map_sysshm: cannot lookup vm_object."); - - VM_OBJECT_LOCK(object); - if(!(page = vm_page_lookup(object, pindex))) - panic("vm_map_sysshm: cannot wire page."); - vm_page_lock_queues(); - vm_page_wire(page); - vm_page_unlock_queues(); - VM_OBJECT_UNLOCK(object); - vm_map_lookup_done(tmap, entry); - p->p_usrsysshm = addr; return (addr); ==== //depot/projects/soc2007/jbr-syscall/tests/fork.c#4 (text+ko) ==== @@ -9,7 +9,7 @@ pid_t child; printf("Parent -- getpid(): %d\tgetpid2(): %d\n", getpid(), getpid2()); - if(!(child = fork())) { + if(!(child = fork2())) { printf("Child -- getpid(): %d\tgetpid2(): %d\n", getpid(), getpid2()); } else { ==== //depot/projects/soc2007/jbr-syscall/tests/mlibc/mlibc.c#3 (text+ko) ==== @@ -1,5 +1,8 @@ #include "mlibc.h" #include <stdio.h> +#include <unistd.h> +#include <sys/sysctl.h> +#include <sys/types.h> struct sysshm * sysshm = NULL; @@ -12,11 +15,29 @@ sysctlbyname("kern.usrsysshm", &addr, &size, NULL, 0); sysshm = (struct sysshm * ) addr; - printf("%d\n", addr); +} + +pid_t fork2(void) +{ + pid_t pid = fork(); + + if (!pid) + __mlibc_init(); + + return (pid); +} + +pid_t rfork2(int flags) +{ + pid_t pid = rfork(flags); + + if (!pid) + __mlibc_init(); + + return (pid); } pid_t getpid2(void) { - __mlibc_init(); return(sysshm->pid); } ==== //depot/projects/soc2007/jbr-syscall/tests/mlibc/mlibc.h#2 (text+ko) ==== @@ -1,15 +1,13 @@ #ifndef _MLIBC_H_ #define _MLIBC_H_ -#include <sys/param.h> #include <sys/types.h> -#include <sys/sysctl.h> struct sysshm { pid_t pid; - char progtitle[20]; - char proctitle[2048]; }; +pid_t fork2(void); +pid_t rfork2(int flags); pid_t getpid2(void); #endif /* _MLIBC_H_ */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200708220057.l7M0v5QU020530>