Skip site navigation (1)Skip section navigation (2)
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>