The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/kern/kern_fork.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: kern_fork.c,v 1.229 2022/07/01 09:54:36 prlw1 Exp $    */
    2 
    3 /*-
    4  * Copyright (c) 1999, 2001, 2004, 2006, 2007, 2008, 2019
    5  *     The NetBSD Foundation, Inc.
    6  * All rights reserved.
    7  *
    8  * This code is derived from software contributed to The NetBSD Foundation
    9  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
   10  * NASA Ames Research Center, by Charles M. Hannum, and by Andrew Doran.
   11  *
   12  * Redistribution and use in source and binary forms, with or without
   13  * modification, are permitted provided that the following conditions
   14  * are met:
   15  * 1. Redistributions of source code must retain the above copyright
   16  *    notice, this list of conditions and the following disclaimer.
   17  * 2. Redistributions in binary form must reproduce the above copyright
   18  *    notice, this list of conditions and the following disclaimer in the
   19  *    documentation and/or other materials provided with the distribution.
   20  *
   21  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   22  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   23  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   24  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
   25  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   31  * POSSIBILITY OF SUCH DAMAGE.
   32  */
   33 
   34 /*
   35  * Copyright (c) 1982, 1986, 1989, 1991, 1993
   36  *      The Regents of the University of California.  All rights reserved.
   37  * (c) UNIX System Laboratories, Inc.
   38  * All or some portions of this file are derived from material licensed
   39  * to the University of California by American Telephone and Telegraph
   40  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
   41  * the permission of UNIX System Laboratories, Inc.
   42  *
   43  * Redistribution and use in source and binary forms, with or without
   44  * modification, are permitted provided that the following conditions
   45  * are met:
   46  * 1. Redistributions of source code must retain the above copyright
   47  *    notice, this list of conditions and the following disclaimer.
   48  * 2. Redistributions in binary form must reproduce the above copyright
   49  *    notice, this list of conditions and the following disclaimer in the
   50  *    documentation and/or other materials provided with the distribution.
   51  * 3. Neither the name of the University nor the names of its contributors
   52  *    may be used to endorse or promote products derived from this software
   53  *    without specific prior written permission.
   54  *
   55  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   56  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   57  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   58  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   59  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   60  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   61  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   62  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   63  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   64  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   65  * SUCH DAMAGE.
   66  *
   67  *      @(#)kern_fork.c 8.8 (Berkeley) 2/14/95
   68  */
   69 
   70 #include <sys/cdefs.h>
   71 __KERNEL_RCSID(0, "$NetBSD: kern_fork.c,v 1.229 2022/07/01 09:54:36 prlw1 Exp $");
   72 
   73 #include "opt_ktrace.h"
   74 #include "opt_dtrace.h"
   75 
   76 #include <sys/param.h>
   77 #include <sys/systm.h>
   78 #include <sys/filedesc.h>
   79 #include <sys/kernel.h>
   80 #include <sys/pool.h>
   81 #include <sys/mount.h>
   82 #include <sys/proc.h>
   83 #include <sys/ras.h>
   84 #include <sys/resourcevar.h>
   85 #include <sys/vnode.h>
   86 #include <sys/file.h>
   87 #include <sys/acct.h>
   88 #include <sys/ktrace.h>
   89 #include <sys/sched.h>
   90 #include <sys/signalvar.h>
   91 #include <sys/syscall.h>
   92 #include <sys/kauth.h>
   93 #include <sys/atomic.h>
   94 #include <sys/syscallargs.h>
   95 #include <sys/uidinfo.h>
   96 #include <sys/sdt.h>
   97 #include <sys/ptrace.h>
   98 
   99 /*
  100  * DTrace SDT provider definitions
  101  */
  102 SDT_PROVIDER_DECLARE(proc);
  103 SDT_PROBE_DEFINE3(proc, kernel, , create,
  104     "struct proc *", /* new process */
  105     "struct proc *", /* parent process */
  106     "int" /* flags */);
  107 
  108 u_int   nprocs __cacheline_aligned = 1;         /* process 0 */
  109 
  110 /*
  111  * Number of ticks to sleep if fork() would fail due to process hitting
  112  * limits. Exported in miliseconds to userland via sysctl.
  113  */
  114 int     forkfsleep = 0;
  115 
  116 int
  117 sys_fork(struct lwp *l, const void *v, register_t *retval)
  118 {
  119 
  120         return fork1(l, 0, SIGCHLD, NULL, 0, NULL, NULL, retval);
  121 }
  122 
  123 /*
  124  * vfork(2) system call compatible with 4.4BSD (i.e. BSD with Mach VM).
  125  * Address space is not shared, but parent is blocked until child exit.
  126  */
  127 int
  128 sys_vfork(struct lwp *l, const void *v, register_t *retval)
  129 {
  130 
  131         return fork1(l, FORK_PPWAIT, SIGCHLD, NULL, 0, NULL, NULL,
  132             retval);
  133 }
  134 
  135 /*
  136  * New vfork(2) system call for NetBSD, which implements original 3BSD vfork(2)
  137  * semantics.  Address space is shared, and parent is blocked until child exit.
  138  */
  139 int
  140 sys___vfork14(struct lwp *l, const void *v, register_t *retval)
  141 {
  142 
  143         return fork1(l, FORK_PPWAIT|FORK_SHAREVM, SIGCHLD, NULL, 0,
  144             NULL, NULL, retval);
  145 }
  146 
  147 /*
  148  * Linux-compatible __clone(2) system call.
  149  */
  150 int
  151 sys___clone(struct lwp *l, const struct sys___clone_args *uap,
  152     register_t *retval)
  153 {
  154         /* {
  155                 syscallarg(int) flags;
  156                 syscallarg(void *) stack;
  157         } */
  158         int flags, sig;
  159 
  160         /*
  161          * We don't support the CLONE_PTRACE flag.
  162          */
  163         if (SCARG(uap, flags) & (CLONE_PTRACE))
  164                 return EINVAL;
  165 
  166         /*
  167          * Linux enforces CLONE_VM with CLONE_SIGHAND, do same.
  168          */
  169         if (SCARG(uap, flags) & CLONE_SIGHAND
  170             && (SCARG(uap, flags) & CLONE_VM) == 0)
  171                 return EINVAL;
  172 
  173         flags = 0;
  174 
  175         if (SCARG(uap, flags) & CLONE_VM)
  176                 flags |= FORK_SHAREVM;
  177         if (SCARG(uap, flags) & CLONE_FS)
  178                 flags |= FORK_SHARECWD;
  179         if (SCARG(uap, flags) & CLONE_FILES)
  180                 flags |= FORK_SHAREFILES;
  181         if (SCARG(uap, flags) & CLONE_SIGHAND)
  182                 flags |= FORK_SHARESIGS;
  183         if (SCARG(uap, flags) & CLONE_VFORK)
  184                 flags |= FORK_PPWAIT;
  185 
  186         sig = SCARG(uap, flags) & CLONE_CSIGNAL;
  187         if (sig < 0 || sig >= _NSIG)
  188                 return EINVAL;
  189 
  190         /*
  191          * Note that the Linux API does not provide a portable way of
  192          * specifying the stack area; the caller must know if the stack
  193          * grows up or down.  So, we pass a stack size of 0, so that the
  194          * code that makes this adjustment is a noop.
  195          */
  196         return fork1(l, flags, sig, SCARG(uap, stack), 0,
  197             NULL, NULL, retval);
  198 }
  199 
  200 /*
  201  * Print the 'table full' message once per 10 seconds.
  202  */
  203 static struct timeval fork_tfmrate = { 10, 0 };
  204 
  205 /*
  206  * Check if a process is traced and shall inform about FORK events.
  207  */
  208 static inline bool
  209 tracefork(struct proc *p, int flags)
  210 {
  211 
  212         return (p->p_slflag & (PSL_TRACEFORK|PSL_TRACED)) ==
  213             (PSL_TRACEFORK|PSL_TRACED) && (flags & FORK_PPWAIT) == 0;
  214 }
  215 
  216 /*
  217  * Check if a process is traced and shall inform about VFORK events.
  218  */
  219 static inline bool
  220 tracevfork(struct proc *p, int flags)
  221 {
  222 
  223         return (p->p_slflag & (PSL_TRACEVFORK|PSL_TRACED)) ==
  224             (PSL_TRACEVFORK|PSL_TRACED) && (flags & FORK_PPWAIT) != 0;
  225 }
  226 
  227 /*
  228  * Check if a process is traced and shall inform about VFORK_DONE events.
  229  */
  230 static inline bool
  231 tracevforkdone(struct proc *p, int flags)
  232 {
  233 
  234         return (p->p_slflag & (PSL_TRACEVFORK_DONE|PSL_TRACED)) ==
  235             (PSL_TRACEVFORK_DONE|PSL_TRACED) && (flags & FORK_PPWAIT);
  236 }
  237 
  238 /*
  239  * General fork call.  Note that another LWP in the process may call exec()
  240  * or exit() while we are forking.  It's safe to continue here, because
  241  * neither operation will complete until all LWPs have exited the process.
  242  */
  243 int
  244 fork1(struct lwp *l1, int flags, int exitsig, void *stack, size_t stacksize,
  245     void (*func)(void *), void *arg, register_t *retval)
  246 {
  247         struct proc     *p1, *p2, *parent;
  248         struct plimit   *p1_lim;
  249         uid_t           uid;
  250         struct lwp      *l2;
  251         int             count;
  252         vaddr_t         uaddr;
  253         int             tnprocs;
  254         int             error = 0;
  255 
  256         p1 = l1->l_proc;
  257         uid = kauth_cred_getuid(l1->l_cred);
  258         tnprocs = atomic_inc_uint_nv(&nprocs);
  259 
  260         /*
  261          * Although process entries are dynamically created, we still keep
  262          * a global limit on the maximum number we will create.
  263          */
  264         if (__predict_false(tnprocs >= maxproc))
  265                 error = -1;
  266         else
  267                 error = kauth_authorize_process(l1->l_cred,
  268                     KAUTH_PROCESS_FORK, p1, KAUTH_ARG(tnprocs), NULL, NULL);
  269 
  270         if (error) {
  271                 static struct timeval lasttfm;
  272                 atomic_dec_uint(&nprocs);
  273                 if (ratecheck(&lasttfm, &fork_tfmrate))
  274                         tablefull("proc", "increase kern.maxproc or NPROC");
  275                 if (forkfsleep)
  276                         kpause("forkmx", false, forkfsleep, NULL);
  277                 return EAGAIN;
  278         }
  279 
  280         /*
  281          * Enforce limits.
  282          */
  283         count = chgproccnt(uid, 1);
  284         if (__predict_false(count > p1->p_rlimit[RLIMIT_NPROC].rlim_cur)) {
  285                 if (kauth_authorize_process(l1->l_cred, KAUTH_PROCESS_RLIMIT,
  286                     p1, KAUTH_ARG(KAUTH_REQ_PROCESS_RLIMIT_BYPASS),
  287                     &p1->p_rlimit[RLIMIT_NPROC], KAUTH_ARG(RLIMIT_NPROC)) != 0) {
  288                         (void)chgproccnt(uid, -1);
  289                         atomic_dec_uint(&nprocs);
  290                         if (forkfsleep)
  291                                 kpause("forkulim", false, forkfsleep, NULL);
  292                         return EAGAIN;
  293                 }
  294         }
  295 
  296         /*
  297          * Allocate virtual address space for the U-area now, while it
  298          * is still easy to abort the fork operation if we're out of
  299          * kernel virtual address space.
  300          */
  301         uaddr = uvm_uarea_alloc();
  302         if (__predict_false(uaddr == 0)) {
  303                 (void)chgproccnt(uid, -1);
  304                 atomic_dec_uint(&nprocs);
  305                 return ENOMEM;
  306         }
  307 
  308         /* Allocate new proc. */
  309         p2 = proc_alloc();
  310         if (p2 == NULL) {
  311                 /* We were unable to allocate a process ID. */
  312                 uvm_uarea_free(uaddr);
  313                 mutex_enter(p1->p_lock);
  314                 uid = kauth_cred_getuid(p1->p_cred);
  315                 (void)chgproccnt(uid, -1);
  316                 mutex_exit(p1->p_lock);
  317                 atomic_dec_uint(&nprocs);
  318                 return EAGAIN;
  319         }
  320 
  321         /*
  322          * We are now committed to the fork.  From here on, we may
  323          * block on resources, but resource allocation may NOT fail.
  324          */
  325 
  326         /*
  327          * Make a proc table entry for the new process.
  328          * Start by zeroing the section of proc that is zero-initialized,
  329          * then copy the section that is copied directly from the parent.
  330          */
  331         memset(&p2->p_startzero, 0,
  332             (unsigned) ((char *)&p2->p_endzero - (char *)&p2->p_startzero));
  333         memcpy(&p2->p_startcopy, &p1->p_startcopy,
  334             (unsigned) ((char *)&p2->p_endcopy - (char *)&p2->p_startcopy));
  335 
  336         TAILQ_INIT(&p2->p_sigpend.sp_info);
  337 
  338         LIST_INIT(&p2->p_lwps);
  339         LIST_INIT(&p2->p_sigwaiters);
  340 
  341         /*
  342          * Duplicate sub-structures as needed.
  343          * Increase reference counts on shared objects.
  344          * Inherit flags we want to keep.  The flags related to SIGCHLD
  345          * handling are important in order to keep a consistent behaviour
  346          * for the child after the fork.  If we are a 32-bit process, the
  347          * child will be too.
  348          */
  349         p2->p_flag =
  350             p1->p_flag & (PK_SUGID | PK_NOCLDWAIT | PK_CLDSIGIGN | PK_32);
  351         p2->p_emul = p1->p_emul;
  352         p2->p_execsw = p1->p_execsw;
  353 
  354         if (flags & FORK_SYSTEM) {
  355                 /*
  356                  * Mark it as a system process.  Set P_NOCLDWAIT so that
  357                  * children are reparented to init(8) when they exit.
  358                  * init(8) can easily wait them out for us.
  359                  */
  360                 p2->p_flag |= (PK_SYSTEM | PK_NOCLDWAIT);
  361         }
  362 
  363         mutex_init(&p2->p_stmutex, MUTEX_DEFAULT, IPL_HIGH);
  364         mutex_init(&p2->p_auxlock, MUTEX_DEFAULT, IPL_NONE);
  365         rw_init(&p2->p_reflock);
  366         cv_init(&p2->p_waitcv, "wait");
  367         cv_init(&p2->p_lwpcv, "lwpwait");
  368 
  369         /*
  370          * Share a lock between the processes if they are to share signal
  371          * state: we must synchronize access to it.
  372          */
  373         if (flags & FORK_SHARESIGS) {
  374                 p2->p_lock = p1->p_lock;
  375                 mutex_obj_hold(p1->p_lock);
  376         } else
  377                 p2->p_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NONE);
  378 
  379         kauth_proc_fork(p1, p2);
  380 
  381         p2->p_raslist = NULL;
  382 #if defined(__HAVE_RAS)
  383         ras_fork(p1, p2);
  384 #endif
  385 
  386         /* bump references to the text vnode (for procfs) */
  387         p2->p_textvp = p1->p_textvp;
  388         if (p2->p_textvp)
  389                 vref(p2->p_textvp);
  390         if (p1->p_path)
  391                 p2->p_path = kmem_strdupsize(p1->p_path, NULL, KM_SLEEP);
  392         else
  393                 p2->p_path = NULL;
  394 
  395         if (flags & FORK_SHAREFILES)
  396                 fd_share(p2);
  397         else if (flags & FORK_CLEANFILES)
  398                 p2->p_fd = fd_init(NULL);
  399         else
  400                 p2->p_fd = fd_copy();
  401 
  402         /* XXX racy */
  403         p2->p_mqueue_cnt = p1->p_mqueue_cnt;
  404 
  405         if (flags & FORK_SHARECWD)
  406                 cwdshare(p2);
  407         else
  408                 p2->p_cwdi = cwdinit();
  409 
  410         /*
  411          * Note: p_limit (rlimit stuff) is copy-on-write, so normally
  412          * we just need increase pl_refcnt.
  413          */
  414         p1_lim = p1->p_limit;
  415         if (!p1_lim->pl_writeable) {
  416                 lim_addref(p1_lim);
  417                 p2->p_limit = p1_lim;
  418         } else {
  419                 p2->p_limit = lim_copy(p1_lim);
  420         }
  421 
  422         if (flags & FORK_PPWAIT) {
  423                 /* Mark ourselves as waiting for a child. */
  424                 p2->p_lflag = PL_PPWAIT;
  425                 l1->l_vforkwaiting = true;
  426                 p2->p_vforklwp = l1;
  427         } else {
  428                 p2->p_lflag = 0;
  429                 l1->l_vforkwaiting = false;
  430         }
  431         p2->p_sflag = 0;
  432         p2->p_slflag = 0;
  433         parent = (flags & FORK_NOWAIT) ? initproc : p1;
  434         p2->p_pptr = parent;
  435         p2->p_ppid = parent->p_pid;
  436         LIST_INIT(&p2->p_children);
  437 
  438         p2->p_aio = NULL;
  439 
  440 #ifdef KTRACE
  441         /*
  442          * Copy traceflag and tracefile if enabled.
  443          * If not inherited, these were zeroed above.
  444          */
  445         if (p1->p_traceflag & KTRFAC_INHERIT) {
  446                 mutex_enter(&ktrace_lock);
  447                 p2->p_traceflag = p1->p_traceflag;
  448                 if ((p2->p_tracep = p1->p_tracep) != NULL)
  449                         ktradref(p2);
  450                 mutex_exit(&ktrace_lock);
  451         }
  452 #endif
  453 
  454         /*
  455          * Create signal actions for the child process.
  456          */
  457         p2->p_sigacts = sigactsinit(p1, flags & FORK_SHARESIGS);
  458         mutex_enter(p1->p_lock);
  459         p2->p_sflag |=
  460             (p1->p_sflag & (PS_STOPFORK | PS_STOPEXEC | PS_NOCLDSTOP));
  461         sched_proc_fork(p1, p2);
  462         mutex_exit(p1->p_lock);
  463 
  464         p2->p_stflag = p1->p_stflag;
  465 
  466         /*
  467          * p_stats.
  468          * Copy parts of p_stats, and zero out the rest.
  469          */
  470         p2->p_stats = pstatscopy(p1->p_stats);
  471 
  472         /*
  473          * Set up the new process address space.
  474          */
  475         uvm_proc_fork(p1, p2, (flags & FORK_SHAREVM) ? true : false);
  476 
  477         /*
  478          * Finish creating the child process.
  479          * It will return through a different path later.
  480          */
  481         lwp_create(l1, p2, uaddr, (flags & FORK_PPWAIT) ? LWP_VFORK : 0,
  482             stack, stacksize, (func != NULL) ? func : child_return, arg, &l2,
  483             l1->l_class, &l1->l_sigmask, &l1->l_sigstk);
  484 
  485         /*
  486          * Inherit l_private from the parent.
  487          * Note that we cannot use lwp_setprivate() here since that
  488          * also sets the CPU TLS register, which is incorrect if the
  489          * process has changed that without letting the kernel know.
  490          */
  491         l2->l_private = l1->l_private;
  492 
  493         /*
  494          * If emulation has a process fork hook, call it now.
  495          */
  496         if (p2->p_emul->e_proc_fork)
  497                 (*p2->p_emul->e_proc_fork)(p2, l1, flags);
  498 
  499         /*
  500          * ...and finally, any other random fork hooks that subsystems
  501          * might have registered.
  502          */
  503         doforkhooks(p2, p1);
  504 
  505         SDT_PROBE(proc, kernel, , create, p2, p1, flags, 0, 0);
  506 
  507         /*
  508          * It's now safe for the scheduler and other processes to see the
  509          * child process.
  510          */
  511         mutex_enter(&proc_lock);
  512 
  513         if (p1->p_session->s_ttyvp != NULL && p1->p_lflag & PL_CONTROLT)
  514                 p2->p_lflag |= PL_CONTROLT;
  515 
  516         LIST_INSERT_HEAD(&parent->p_children, p2, p_sibling);
  517         p2->p_exitsig = exitsig;                /* signal for parent on exit */
  518 
  519         /*
  520          * Trace fork(2) and vfork(2)-like events on demand in a debugger.
  521          */
  522         if (tracefork(p1, flags) || tracevfork(p1, flags)) {
  523                 proc_changeparent(p2, p1->p_pptr);
  524                 SET(p2->p_slflag, PSL_TRACEDCHILD);
  525         }
  526 
  527         p2->p_oppid = p1->p_pid; /* Remember the original parent id. */
  528 
  529         LIST_INSERT_AFTER(p1, p2, p_pglist);
  530         LIST_INSERT_HEAD(&allproc, p2, p_list);
  531 
  532         p2->p_trace_enabled = trace_is_enabled(p2);
  533 #ifdef __HAVE_SYSCALL_INTERN
  534         (*p2->p_emul->e_syscall_intern)(p2);
  535 #endif
  536 
  537         /*
  538          * Update stats now that we know the fork was successful.
  539          */
  540         KPREEMPT_DISABLE(l1);
  541         CPU_COUNT(CPU_COUNT_FORKS, 1);
  542         if (flags & FORK_PPWAIT)
  543                 CPU_COUNT(CPU_COUNT_FORKS_PPWAIT, 1);
  544         if (flags & FORK_SHAREVM)
  545                 CPU_COUNT(CPU_COUNT_FORKS_SHAREVM, 1);
  546         KPREEMPT_ENABLE(l1);
  547 
  548         if (ktrpoint(KTR_EMUL))
  549                 p2->p_traceflag |= KTRFAC_TRC_EMUL;
  550 
  551         /*
  552          * Notify any interested parties about the new process.
  553          */
  554         if (!SLIST_EMPTY(&p1->p_klist)) {
  555                 mutex_exit(&proc_lock);
  556                 knote_proc_fork(p1, p2);
  557                 mutex_enter(&proc_lock);
  558         }
  559 
  560         /*
  561          * Make child runnable, set start time, and add to run queue except
  562          * if the parent requested the child to start in SSTOP state.
  563          */
  564         mutex_enter(p2->p_lock);
  565 
  566         /*
  567          * Start profiling.
  568          */
  569         if ((p2->p_stflag & PST_PROFIL) != 0) {
  570                 mutex_spin_enter(&p2->p_stmutex);
  571                 startprofclock(p2);
  572                 mutex_spin_exit(&p2->p_stmutex);
  573         }
  574 
  575         getmicrotime(&p2->p_stats->p_start);
  576         p2->p_acflag = AFORK;
  577         lwp_lock(l2);
  578         KASSERT(p2->p_nrlwps == 1);
  579         KASSERT(l2->l_stat == LSIDL);
  580         if (p2->p_sflag & PS_STOPFORK) {
  581                 p2->p_nrlwps = 0;
  582                 p2->p_stat = SSTOP;
  583                 p2->p_waited = 0;
  584                 p1->p_nstopchild++;
  585                 l2->l_stat = LSSTOP;
  586                 KASSERT(l2->l_wchan == NULL);
  587                 lwp_unlock(l2);
  588         } else {
  589                 p2->p_nrlwps = 1;
  590                 p2->p_stat = SACTIVE;
  591                 setrunnable(l2);
  592                 /* LWP now unlocked */
  593         }
  594 
  595         /*
  596          * Return child pid to parent process,
  597          * marking us as parent via retval[1].
  598          */
  599         if (retval != NULL) {
  600                 retval[0] = p2->p_pid;
  601                 retval[1] = 0;
  602         }
  603 
  604         mutex_exit(p2->p_lock);
  605 
  606         /*
  607          * Let the parent know that we are tracing its child.
  608          */
  609         if (tracefork(p1, flags) || tracevfork(p1, flags)) {
  610                 mutex_enter(p1->p_lock);
  611                 eventswitch(TRAP_CHLD,
  612                     tracefork(p1, flags) ? PTRACE_FORK : PTRACE_VFORK,
  613                     retval[0]);
  614                 mutex_enter(&proc_lock);
  615         }
  616 
  617         /*
  618          * Preserve synchronization semantics of vfork.  If waiting for
  619          * child to exec or exit, sleep until it clears p_vforkwaiting.
  620          */
  621         while (l1->l_vforkwaiting)
  622                 cv_wait(&l1->l_waitcv, &proc_lock);
  623 
  624         /*
  625          * Let the parent know that we are tracing its child.
  626          */
  627         if (tracevforkdone(p1, flags)) {
  628                 mutex_enter(p1->p_lock);
  629                 eventswitch(TRAP_CHLD, PTRACE_VFORK_DONE, retval[0]);
  630         } else
  631                 mutex_exit(&proc_lock);
  632 
  633         return 0;
  634 }
  635 
  636 /*
  637  * MI code executed in each newly spawned process before returning to userland.
  638  */
  639 void
  640 child_return(void *arg)
  641 {
  642         struct lwp *l = curlwp;
  643         struct proc *p = l->l_proc;
  644 
  645         if ((p->p_slflag & (PSL_TRACED|PSL_TRACEDCHILD)) ==
  646             (PSL_TRACED|PSL_TRACEDCHILD)) {
  647                 eventswitchchild(p, TRAP_CHLD, 
  648                     ISSET(p->p_lflag, PL_PPWAIT) ? PTRACE_VFORK : PTRACE_FORK);
  649         }
  650 
  651         md_child_return(l);
  652 
  653         /*
  654          * Return SYS_fork for all fork types, including vfork(2) and clone(2).
  655          *
  656          * This approach simplifies the code and avoids extra locking.
  657          */
  658         ktrsysret(SYS_fork, 0, 0);
  659 }

Cache object: bf99b4ef3ccb2a110dfad8b713987682


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.