PERFORCE change 125521 for review
Jesper Brix Rosenkilde
jbr at FreeBSD.org
Tue Aug 21 17:57:06 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=125521
Change 125521 by jbr at 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_ */
More information about the p4-projects
mailing list