add pmax
[unix-history] / usr / src / sys / kern / kern_fork.c
CommitLineData
da7c5cc6 1/*
6795ddce 2 * Copyright (c) 1982, 1986, 1989, 1991 Regents of the University of California.
c4ec2128 3 * All rights reserved.
da7c5cc6 4 *
dbf0c423 5 * %sccs.include.redist.c%
c4ec2128 6 *
53e7449e 7 * @(#)kern_fork.c 7.29 (Berkeley) %G%
da7c5cc6 8 */
50108d5c 9
94368568
JB
10#include "param.h"
11#include "systm.h"
12#include "map.h"
5e00df3b 13#include "filedesc.h"
94368568 14#include "kernel.h"
ae2e0122 15#include "malloc.h"
94368568 16#include "proc.h"
ae2e0122 17#include "resourcevar.h"
c4ec2128 18#include "vnode.h"
94368568 19#include "seg.h"
94368568
JB
20#include "file.h"
21#include "acct.h"
56a12c82 22#include "ktrace.h"
50108d5c 23
c9714ae3
KM
24/* ARGSUSED */
25fork(p, uap, retval)
26 struct proc *p;
f6fca708 27 void *uap;
c9714ae3 28 int retval[];
50108d5c
SL
29{
30
d9c2f47f 31 return (fork1(p, 0, retval));
50108d5c
SL
32}
33
c9714ae3
KM
34/* ARGSUSED */
35vfork(p, uap, retval)
36 struct proc *p;
f6fca708 37 void *uap;
c9714ae3 38 int retval[];
50108d5c
SL
39{
40
d9c2f47f 41 return (fork1(p, 1, retval));
50108d5c
SL
42}
43
ae2e0122
MK
44int nprocs = 1; /* process 0 */
45
c9714ae3
KM
46fork1(p1, isvfork, retval)
47 register struct proc *p1;
48 int isvfork, retval[];
50108d5c 49{
c9714ae3 50 register struct proc *p2;
ae2e0122
MK
51 register int count, uid;
52 static int nextpid, pidchecked = 0;
50108d5c 53
ae2e0122
MK
54 count = 0;
55 if ((uid = p1->p_ucred->cr_uid) != 0) {
c9714ae3 56 for (p2 = allproc; p2; p2 = p2->p_nxt)
ae2e0122
MK
57 if (p2->p_ucred->cr_uid == uid)
58 count++;
c9714ae3 59 for (p2 = zombproc; p2; p2 = p2->p_nxt)
ae2e0122
MK
60 if (p2->p_ucred->cr_uid == uid)
61 count++;
50108d5c
SL
62 }
63 /*
ae2e0122
MK
64 * Although process entries are dynamically entries,
65 * we still keep a global limit on the maximum number
66 * we will create. Don't allow a nonprivileged user
67 * to exceed its current limit or to bring us within one
68 * of the global limit; don't let root exceed the limit.
69 * nprocs is the current number of processes,
70 * maxproc is the limit.
50108d5c 71 */
ae2e0122 72 if (nprocs >= maxproc || uid == 0 && nprocs >= maxproc + 1) {
50108d5c 73 tablefull("proc");
c9714ae3 74 return (EAGAIN);
50108d5c 75 }
ae2e0122
MK
76 if (count > p1->p_rlimit[RLIMIT_NPROC].rlim_cur)
77 return (EAGAIN);
50108d5c 78
50108d5c 79 /*
ae2e0122
MK
80 * Find an unused process ID.
81 * We remember a range of unused IDs ready to use
82 * (from nextpid+1 through pidchecked-1).
50108d5c 83 */
ae2e0122 84 nextpid++;
1d348849 85retry:
ae2e0122
MK
86 /*
87 * If the process ID prototype has wrapped around,
88 * restart somewhat above 0, as the low-numbered procs
89 * tend to include daemons that don't exit.
90 */
91 if (nextpid >= PID_MAX) {
92 nextpid = 100;
1d348849 93 pidchecked = 0;
50108d5c 94 }
ae2e0122 95 if (nextpid >= pidchecked) {
1d348849 96 int doingzomb = 0;
e9539440 97
27ed98f2 98 pidchecked = PID_MAX;
1d348849 99 /*
ae2e0122 100 * Scan the active and zombie procs to check whether this pid
1d348849 101 * is in use. Remember the lowest pid that's greater
ae2e0122 102 * than nextpid, so we can avoid checking for a while.
1d348849 103 */
ae2e0122 104 p2 = allproc;
1d348849 105again:
ae2e0122
MK
106 for (; p2 != NULL; p2 = p2->p_nxt) {
107 if (p2->p_pid == nextpid ||
108 p2->p_pgrp->pg_id == nextpid) {
109 nextpid++;
110 if (nextpid >= pidchecked)
1d348849
MK
111 goto retry;
112 }
ae2e0122
MK
113 if (p2->p_pid > nextpid && pidchecked > p2->p_pid)
114 pidchecked = p2->p_pid;
115 if (p2->p_pgrp->pg_id > nextpid &&
116 pidchecked > p2->p_pgrp->pg_id)
117 pidchecked = p2->p_pgrp->pg_id;
1d348849
MK
118 }
119 if (!doingzomb) {
120 doingzomb = 1;
ae2e0122 121 p2 = zombproc;
1d348849
MK
122 goto again;
123 }
50108d5c 124 }
50108d5c 125
ae2e0122
MK
126
127 /*
128 * Allocate new proc.
129 * Link onto allproc (this should probably be delayed).
130 */
131 MALLOC(p2, struct proc *, sizeof(struct proc), M_PROC, M_WAITOK);
132 nprocs++;
133 p2->p_nxt = allproc;
134 p2->p_nxt->p_prev = &p2->p_nxt; /* allproc is never NULL */
135 p2->p_prev = &allproc;
136 allproc = p2;
137 p2->p_link = NULL; /* shouldn't be necessary */
138 p2->p_rlink = NULL; /* shouldn't be necessary */
1d348849 139
50108d5c
SL
140 /*
141 * Make a proc table entry for the new process.
ae2e0122
MK
142 * Start by zeroing the section of proc that is zero-initialized,
143 * then copy the section that is copied directly from the parent.
50108d5c 144 */
ae2e0122
MK
145 bzero(&p2->p_startzero,
146 (unsigned) ((caddr_t)&p2->p_endzero - (caddr_t)&p2->p_startzero));
147 bcopy(&p1->p_startcopy, &p2->p_startcopy,
148 (unsigned) ((caddr_t)&p2->p_endcopy - (caddr_t)&p2->p_startcopy));
89616760
KM
149 p2->p_spare[0] = 0; /* XXX - should be in zero range */
150 p2->p_spare[1] = 0; /* XXX - should be in zero range */
151 p2->p_spare[2] = 0; /* XXX - should be in zero range */
152 p2->p_spare[3] = 0; /* XXX - should be in zero range */
ae2e0122
MK
153
154 /*
155 * Duplicate sub-structures as needed.
156 * Increase reference counts on shared objects.
6795ddce 157 * The p_stats and p_sigacts substructs are set in vm_fork.
ae2e0122
MK
158 */
159 MALLOC(p2->p_cred, struct pcred *, sizeof(struct pcred),
160 M_SUBPROC, M_WAITOK);
161 bcopy(p1->p_cred, p2->p_cred, sizeof(*p2->p_cred));
53e7449e 162 p2->p_cred->p_refcnt = 1;
ae2e0122
MK
163 crhold(p1->p_ucred);
164
165 p2->p_fd = fdcopy(p1);
ae2e0122
MK
166 /*
167 * If p_limit is still copy-on-write, bump refcnt,
168 * otherwise get a copy that won't be modified.
169 * (If PL_SHAREMOD is clear, the structure is shared
170 * copy-on-write.)
171 */
172 if (p1->p_limit->p_lflags & PL_SHAREMOD)
173 p2->p_limit = limcopy(p1->p_limit);
174 else {
175 p2->p_limit = p1->p_limit;
176 p2->p_limit->p_refcnt++;
98111078 177 }
ae2e0122 178
6795ddce 179 p2->p_flag = SLOAD | (p1->p_flag & SHPUX);
ae2e0122
MK
180 if (p1->p_session->s_ttyvp != NULL && p1->p_flag & SCTTY)
181 p2->p_flag |= SCTTY;
182 if (isvfork)
183 p2->p_flag |= SPPWAIT;
184 p2->p_stat = SIDL;
185 p2->p_pid = nextpid;
56a12c82 186 {
ae2e0122 187 struct proc **hash = &pidhash[PIDHASH(p2->p_pid)];
56a12c82 188
ae2e0122
MK
189 p2->p_hash = *hash;
190 *hash = p2;
56a12c82 191 }
ae2e0122
MK
192 p2->p_pgrpnxt = p1->p_pgrpnxt;
193 p1->p_pgrpnxt = p2;
194 p2->p_pptr = p1;
195 p2->p_osptr = p1->p_cptr;
196 if (p1->p_cptr)
197 p1->p_cptr->p_ysptr = p2;
198 p1->p_cptr = p2;
199#ifdef KTRACE
50108d5c 200 /*
ae2e0122
MK
201 * Copy traceflag and tracefile if enabled.
202 * If not inherited, these were zeroed above.
50108d5c 203 */
ae2e0122
MK
204 if (p1->p_traceflag&KTRFAC_INHERIT) {
205 p2->p_traceflag = p1->p_traceflag;
206 if ((p2->p_tracep = p1->p_tracep) != NULL)
207 VREF(p2->p_tracep);
208 }
209#endif
210
ae2e0122
MK
211#if defined(tahoe)
212 p2->p_vmspace->p_ckey = p1->p_vmspace->p_ckey; /* XXX move this */
9d4095a1 213#endif
50108d5c
SL
214
215 /*
50108d5c
SL
216 * This begins the section where we must prevent the parent
217 * from being swapped.
218 */
ae2e0122 219 p1->p_flag |= SKEEP;
6795ddce
MK
220 /*
221 * Set return values for child before vm_fork,
222 * so they can be copied to child stack.
223 * We return parent pid, and mark as child in retval[1].
f6fca708
MK
224 * NOTE: the kernel stack may be at a different location in the child
225 * process, and thus addresses of automatic variables (including retval)
226 * may be invalid after vm_fork returns in the child process.
6795ddce
MK
227 */
228 retval[0] = p1->p_pid;
229 retval[1] = 1;
ae2e0122
MK
230 if (vm_fork(p1, p2, isvfork)) {
231 /*
6795ddce 232 * Child process. Set start time and get to work.
ae2e0122 233 */
d848aba6 234 (void) splclock();
ae2e0122 235 p2->p_stats->p_start = time;
d848aba6 236 (void) spl0();
ae2e0122
MK
237 p2->p_acflag = AFORK;
238 return (0);
d848aba6 239 }
50108d5c
SL
240
241 /*
242 * Make child runnable and add to run queue.
243 */
ae2e0122
MK
244 (void) splhigh();
245 p2->p_stat = SRUN;
246 setrq(p2);
50108d5c
SL
247 (void) spl0();
248
50108d5c
SL
249 /*
250 * Now can be swapped.
251 */
ae2e0122 252 p1->p_flag &= ~SKEEP;
50108d5c
SL
253
254 /*
f6fca708 255 * Preserve synchronization semantics of vfork.
ae2e0122
MK
256 * If waiting for child to exec or exit, set SPPWAIT
257 * on child, and sleep on our proc (in case of exit).
50108d5c 258 */
ae2e0122
MK
259 if (isvfork)
260 while (p2->p_flag & SPPWAIT)
6795ddce 261 tsleep((caddr_t)p1, PWAIT, "ppwait", 0);
50108d5c
SL
262
263 /*
6795ddce
MK
264 * Return child pid to parent process,
265 * marking us as parent via retval[1].
50108d5c 266 */
ae2e0122 267 retval[0] = p2->p_pid;
6795ddce 268 retval[1] = 0;
50108d5c
SL
269 return (0);
270}