From owner-p4-projects@FreeBSD.ORG Wed Aug 22 00:57:06 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 045CC16A41B; Wed, 22 Aug 2007 00:57:06 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id CE29F16A418 for ; Wed, 22 Aug 2007 00:57:05 +0000 (UTC) (envelope-from jbr@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id BED7013C428 for ; Wed, 22 Aug 2007 00:57:05 +0000 (UTC) (envelope-from jbr@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l7M0v5h9020533 for ; Wed, 22 Aug 2007 00:57:05 GMT (envelope-from jbr@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l7M0v5QU020530 for perforce@freebsd.org; Wed, 22 Aug 2007 00:57:05 GMT (envelope-from jbr@FreeBSD.org) Date: Wed, 22 Aug 2007 00:57:05 GMT Message-Id: <200708220057.l7M0v5QU020530@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jbr@FreeBSD.org using -f From: Jesper Brix Rosenkilde To: Perforce Change Reviews Cc: Subject: PERFORCE change 125521 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 22 Aug 2007 00:57:06 -0000 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 +#include +#include +#include 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 #include -#include 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_ */