Print this page
OS-4818 contract template disappears on exec
OS-4937 lxbrand ptracer count updates can race
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Joshua M. Clulow <jmc@joyent.com>
OS-4188 NULL dereference in lwp_hash_in
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Joshua M. Clulow <jmc@joyent.com>
OS-4129 lxbrand should not abuse p_brand_data for storing exit signal
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Joshua M. Clulow <jmc@joyent.com>
OS-3149 lx brand always sends SIGCHLD to parent processes, regardless of how clone was invoked
OS-2887 lxbrand add WALL, WCLONE, WNOTHREAD support to waitid
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>


   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved.

  24  */
  25 
  26 /*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T     */
  27 /*        All Rights Reserved   */
  28 
  29 #ifndef _SYS_PROC_H
  30 #define _SYS_PROC_H
  31 
  32 #include <sys/time.h>
  33 #include <sys/thread.h>
  34 #include <sys/cred.h>
  35 #include <sys/user.h>
  36 #include <sys/watchpoint.h>
  37 #include <sys/timer.h>
  38 #if defined(__x86)
  39 #include <sys/tss.h>
  40 #include <sys/segments.h>
  41 #endif
  42 #include <sys/utrap.h>
  43 #include <sys/model.h>


 331 
 332         avl_tree_t      p_ct_held;      /* held contracts */
 333         struct ct_equeue **p_ct_equeue; /* process-type event queues */
 334 
 335         struct cont_process *p_ct_process; /* process contract */
 336         list_node_t     p_ct_member;    /* process contract membership */
 337         sigqueue_t      *p_killsqp;     /* sigqueue pointer for SIGKILL */
 338 
 339         int             p_dtrace_probes; /* are there probes for this proc? */
 340         uint64_t        p_dtrace_count; /* number of DTrace tracepoints */
 341                                         /* (protected by P_PR_LOCK) */
 342         void            *p_dtrace_helpers; /* DTrace helpers, if any */
 343         struct pool     *p_pool;        /* pointer to containing pool */
 344         kcondvar_t      p_poolcv;       /* synchronization with pools */
 345         uint_t          p_poolcnt;      /* # threads inside pool barrier */
 346         uint_t          p_poolflag;     /* pool-related flags (see below) */
 347         uintptr_t       p_portcnt;      /* event ports counter */
 348         struct zone     *p_zone;        /* zone in which process lives */
 349         struct vnode    *p_execdir;     /* directory that p_exec came from */
 350         struct brand    *p_brand;       /* process's brand  */
 351         void            *p_brand_data;  /* per-process brand state */
 352 



 353         /* additional lock to protect p_sessp (but not its contents) */
 354         kmutex_t p_splock;
 355         rctl_qty_t      p_locked_mem;   /* locked memory charged to proc */
 356                                         /* protected by p_lock */
 357         rctl_qty_t      p_crypto_mem;   /* /dev/crypto memory charged to proc */
 358                                         /* protected by p_lock */
 359         clock_t p_ttime;                /* buffered task time */
 360 
 361         /*
 362          * The user structure
 363          */
 364         struct user p_user;             /* (see sys/user.h) */
 365 } proc_t;
 366 
 367 #define PROC_T                          /* headers relying on proc_t are OK */
 368 
 369 #ifdef _KERNEL
 370 
 371 /* active process chain */
 372 
 373 extern proc_t *practive;
 374 
 375 /* Well known processes */
 376 
 377 extern proc_t *proc_sched;              /* memory scheduler */
 378 extern proc_t *proc_init;               /* init */
 379 extern proc_t *proc_pageout;            /* pageout daemon */
 380 extern proc_t *proc_fsflush;            /* filesystem sync-er */
 381 
 382 #endif /* _KERNEL */
 383 
 384 /*
 385  * Stuff to keep track of the number of processes each uid has.
 386  * It is tracked on a per-zone basis; that is, if users in different


 612 
 613 extern void sigcld(proc_t *, sigqueue_t *);
 614 extern void sigcld_delete(k_siginfo_t *);
 615 extern void sigcld_repost(void);
 616 extern int fsig(k_sigset_t *, kthread_t *);
 617 extern void psig(void);
 618 extern void stop(int, int);
 619 extern int stop_on_fault(uint_t, k_siginfo_t *);
 620 extern int issig(int);
 621 extern int jobstopped(proc_t *);
 622 extern void psignal(proc_t *, int);
 623 extern void tsignal(kthread_t *, int);
 624 extern void sigtoproc(proc_t *, kthread_t *, int);
 625 extern void trapsig(k_siginfo_t *, int);
 626 extern void realsigprof(int, int, int);
 627 extern int eat_signal(kthread_t *, int);
 628 extern int signal_is_blocked(kthread_t *, int);
 629 extern int sigcheck(proc_t *, kthread_t *);
 630 extern void sigdefault(proc_t *);
 631 

 632 extern void pid_setmin(void);
 633 extern pid_t pid_allocate(proc_t *, pid_t, int);
 634 extern int pid_rele(struct pid *);
 635 extern void pid_exit(proc_t *, struct task *);
 636 extern void proc_entry_free(struct pid *);
 637 extern proc_t *prfind(pid_t);
 638 extern proc_t *prfind_zone(pid_t, zoneid_t);
 639 extern proc_t *pgfind(pid_t);
 640 extern proc_t *pgfind_zone(pid_t, zoneid_t);
 641 extern proc_t *sprlock(pid_t);
 642 extern proc_t *sprlock_zone(pid_t, zoneid_t);
 643 extern int sprtrylock_proc(proc_t *);
 644 extern void sprwaitlock_proc(proc_t *);
 645 extern void sprlock_proc(proc_t *);
 646 extern void sprunlock(proc_t *);

 647 extern void pid_init(void);
 648 extern proc_t *pid_entry(int);
 649 extern int pid_slot(proc_t *);
 650 extern void signal(pid_t, int);
 651 extern void prsignal(struct pid *, int);
 652 extern int uread(proc_t *, void *, size_t, uintptr_t);
 653 extern int uwrite(proc_t *, void *, size_t, uintptr_t);
 654 
 655 extern void pgsignal(struct pid *, int);
 656 extern void pgjoin(proc_t *, struct pid *);
 657 extern void pgcreate(proc_t *);
 658 extern void pgexit(proc_t *);
 659 extern void pgdetach(proc_t *);
 660 extern int pgmembers(pid_t);
 661 
 662 extern  void    init_mstate(kthread_t *, int);
 663 extern  int     new_mstate(kthread_t *, int);
 664 extern  void    restore_mstate(kthread_t *);
 665 extern  void    term_mstate(kthread_t *);
 666 extern  void    estimate_msacct(kthread_t *, hrtime_t);


 742         id_t            lwpid);
 743 extern  kthread_t *idtot(proc_t *, id_t);
 744 extern  void    lwp_hash_in(proc_t *, lwpent_t *, tidhash_t *, uint_t, int);
 745 extern  void    lwp_hash_out(proc_t *, id_t);
 746 extern  lwpdir_t *lwp_hash_lookup(proc_t *, id_t);
 747 extern  lwpdir_t *lwp_hash_lookup_and_lock(proc_t *, id_t, kmutex_t **);
 748 extern  void    lwp_create_done(kthread_t *);
 749 extern  void    lwp_exit(void);
 750 extern  void    lwp_pcb_exit(void);
 751 extern  void    lwp_cleanup(void);
 752 extern  int     lwp_suspend(kthread_t *);
 753 extern  void    lwp_continue(kthread_t *);
 754 extern  void    holdlwp(void);
 755 extern  void    stoplwp(void);
 756 extern  int     holdlwps(int);
 757 extern  int     holdwatch(void);
 758 extern  void    pokelwps(proc_t *);
 759 extern  void    continuelwps(proc_t *);
 760 extern  int     exitlwps(int);
 761 extern  void    lwp_ctmpl_copy(klwp_t *, klwp_t *);
 762 extern  void    lwp_ctmpl_clear(klwp_t *);
 763 extern  klwp_t  *forklwp(klwp_t *, proc_t *, id_t);
 764 extern  void    lwp_load(klwp_t *, gregset_t, uintptr_t);
 765 extern  void    lwp_setrval(klwp_t *, int, int);
 766 extern  void    lwp_forkregs(klwp_t *, klwp_t *);
 767 extern  void    lwp_freeregs(klwp_t *, int);
 768 extern  caddr_t lwp_stk_init(klwp_t *, caddr_t);
 769 extern  void    lwp_stk_cache_init(void);
 770 extern  void    lwp_stk_fini(klwp_t *);
 771 extern  void    lwp_installctx(klwp_t *);
 772 extern  void    lwp_rtt(void);
 773 extern  void    lwp_rtt_initial(void);
 774 extern  int     lwp_setprivate(klwp_t *, int, uintptr_t);
 775 extern  void    lwp_stat_update(lwp_stat_id_t, long);
 776 extern  void    lwp_attach_brand_hdlrs(klwp_t *);
 777 extern  void    lwp_detach_brand_hdlrs(klwp_t *);
 778 
 779 #if defined(__sparcv9)
 780 extern  void    lwp_mmodel_newlwp(void);
 781 extern  void    lwp_mmodel_shared_as(caddr_t, size_t);
 782 #define LWP_MMODEL_NEWLWP()             lwp_mmodel_newlwp()




   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved.
  24  * Copyright (c) 2014 Joyent, Inc.  All rights reserved.
  25  */
  26 
  27 /*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T     */
  28 /*        All Rights Reserved   */
  29 
  30 #ifndef _SYS_PROC_H
  31 #define _SYS_PROC_H
  32 
  33 #include <sys/time.h>
  34 #include <sys/thread.h>
  35 #include <sys/cred.h>
  36 #include <sys/user.h>
  37 #include <sys/watchpoint.h>
  38 #include <sys/timer.h>
  39 #if defined(__x86)
  40 #include <sys/tss.h>
  41 #include <sys/segments.h>
  42 #endif
  43 #include <sys/utrap.h>
  44 #include <sys/model.h>


 332 
 333         avl_tree_t      p_ct_held;      /* held contracts */
 334         struct ct_equeue **p_ct_equeue; /* process-type event queues */
 335 
 336         struct cont_process *p_ct_process; /* process contract */
 337         list_node_t     p_ct_member;    /* process contract membership */
 338         sigqueue_t      *p_killsqp;     /* sigqueue pointer for SIGKILL */
 339 
 340         int             p_dtrace_probes; /* are there probes for this proc? */
 341         uint64_t        p_dtrace_count; /* number of DTrace tracepoints */
 342                                         /* (protected by P_PR_LOCK) */
 343         void            *p_dtrace_helpers; /* DTrace helpers, if any */
 344         struct pool     *p_pool;        /* pointer to containing pool */
 345         kcondvar_t      p_poolcv;       /* synchronization with pools */
 346         uint_t          p_poolcnt;      /* # threads inside pool barrier */
 347         uint_t          p_poolflag;     /* pool-related flags (see below) */
 348         uintptr_t       p_portcnt;      /* event ports counter */
 349         struct zone     *p_zone;        /* zone in which process lives */
 350         struct vnode    *p_execdir;     /* directory that p_exec came from */
 351         struct brand    *p_brand;       /* process's brand  */

 352 
 353         /* per-process brand state */
 354         void            *p_brand_data;
 355 
 356         /* additional lock to protect p_sessp (but not its contents) */
 357         kmutex_t p_splock;
 358         rctl_qty_t      p_locked_mem;   /* locked memory charged to proc */
 359                                         /* protected by p_lock */
 360         rctl_qty_t      p_crypto_mem;   /* /dev/crypto memory charged to proc */
 361                                         /* protected by p_lock */
 362         clock_t p_ttime;                /* buffered task time */
 363 
 364         /*
 365          * The user structure
 366          */
 367         struct user p_user;             /* (see sys/user.h) */
 368 } proc_t;

 369 #define PROC_T                          /* headers relying on proc_t are OK */
 370 
 371 #ifdef _KERNEL
 372 
 373 /* active process chain */
 374 
 375 extern proc_t *practive;
 376 
 377 /* Well known processes */
 378 
 379 extern proc_t *proc_sched;              /* memory scheduler */
 380 extern proc_t *proc_init;               /* init */
 381 extern proc_t *proc_pageout;            /* pageout daemon */
 382 extern proc_t *proc_fsflush;            /* filesystem sync-er */
 383 
 384 #endif /* _KERNEL */
 385 
 386 /*
 387  * Stuff to keep track of the number of processes each uid has.
 388  * It is tracked on a per-zone basis; that is, if users in different


 614 
 615 extern void sigcld(proc_t *, sigqueue_t *);
 616 extern void sigcld_delete(k_siginfo_t *);
 617 extern void sigcld_repost(void);
 618 extern int fsig(k_sigset_t *, kthread_t *);
 619 extern void psig(void);
 620 extern void stop(int, int);
 621 extern int stop_on_fault(uint_t, k_siginfo_t *);
 622 extern int issig(int);
 623 extern int jobstopped(proc_t *);
 624 extern void psignal(proc_t *, int);
 625 extern void tsignal(kthread_t *, int);
 626 extern void sigtoproc(proc_t *, kthread_t *, int);
 627 extern void trapsig(k_siginfo_t *, int);
 628 extern void realsigprof(int, int, int);
 629 extern int eat_signal(kthread_t *, int);
 630 extern int signal_is_blocked(kthread_t *, int);
 631 extern int sigcheck(proc_t *, kthread_t *);
 632 extern void sigdefault(proc_t *);
 633 
 634 extern struct pid *pid_find(pid_t pid);
 635 extern void pid_setmin(void);
 636 extern pid_t pid_allocate(proc_t *, pid_t, int);
 637 extern int pid_rele(struct pid *);
 638 extern void pid_exit(proc_t *, struct task *);
 639 extern void proc_entry_free(struct pid *);
 640 extern proc_t *prfind(pid_t);
 641 extern proc_t *prfind_zone(pid_t, zoneid_t);
 642 extern proc_t *pgfind(pid_t);
 643 extern proc_t *pgfind_zone(pid_t, zoneid_t);
 644 extern proc_t *sprlock(pid_t);
 645 extern proc_t *sprlock_zone(pid_t, zoneid_t);
 646 extern int sprtrylock_proc(proc_t *);
 647 extern void sprwaitlock_proc(proc_t *);
 648 extern void sprlock_proc(proc_t *);
 649 extern void sprunlock(proc_t *);
 650 extern void sprunprlock(proc_t *);
 651 extern void pid_init(void);
 652 extern proc_t *pid_entry(int);
 653 extern int pid_slot(proc_t *);
 654 extern void signal(pid_t, int);
 655 extern void prsignal(struct pid *, int);
 656 extern int uread(proc_t *, void *, size_t, uintptr_t);
 657 extern int uwrite(proc_t *, void *, size_t, uintptr_t);
 658 
 659 extern void pgsignal(struct pid *, int);
 660 extern void pgjoin(proc_t *, struct pid *);
 661 extern void pgcreate(proc_t *);
 662 extern void pgexit(proc_t *);
 663 extern void pgdetach(proc_t *);
 664 extern int pgmembers(pid_t);
 665 
 666 extern  void    init_mstate(kthread_t *, int);
 667 extern  int     new_mstate(kthread_t *, int);
 668 extern  void    restore_mstate(kthread_t *);
 669 extern  void    term_mstate(kthread_t *);
 670 extern  void    estimate_msacct(kthread_t *, hrtime_t);


 746         id_t            lwpid);
 747 extern  kthread_t *idtot(proc_t *, id_t);
 748 extern  void    lwp_hash_in(proc_t *, lwpent_t *, tidhash_t *, uint_t, int);
 749 extern  void    lwp_hash_out(proc_t *, id_t);
 750 extern  lwpdir_t *lwp_hash_lookup(proc_t *, id_t);
 751 extern  lwpdir_t *lwp_hash_lookup_and_lock(proc_t *, id_t, kmutex_t **);
 752 extern  void    lwp_create_done(kthread_t *);
 753 extern  void    lwp_exit(void);
 754 extern  void    lwp_pcb_exit(void);
 755 extern  void    lwp_cleanup(void);
 756 extern  int     lwp_suspend(kthread_t *);
 757 extern  void    lwp_continue(kthread_t *);
 758 extern  void    holdlwp(void);
 759 extern  void    stoplwp(void);
 760 extern  int     holdlwps(int);
 761 extern  int     holdwatch(void);
 762 extern  void    pokelwps(proc_t *);
 763 extern  void    continuelwps(proc_t *);
 764 extern  int     exitlwps(int);
 765 extern  void    lwp_ctmpl_copy(klwp_t *, klwp_t *);
 766 extern  void    lwp_ctmpl_clear(klwp_t *, boolean_t);
 767 extern  klwp_t  *forklwp(klwp_t *, proc_t *, id_t);
 768 extern  void    lwp_load(klwp_t *, gregset_t, uintptr_t);
 769 extern  void    lwp_setrval(klwp_t *, int, int);
 770 extern  void    lwp_forkregs(klwp_t *, klwp_t *);
 771 extern  void    lwp_freeregs(klwp_t *, int);
 772 extern  caddr_t lwp_stk_init(klwp_t *, caddr_t);
 773 extern  void    lwp_stk_cache_init(void);
 774 extern  void    lwp_stk_fini(klwp_t *);
 775 extern  void    lwp_installctx(klwp_t *);
 776 extern  void    lwp_rtt(void);
 777 extern  void    lwp_rtt_initial(void);
 778 extern  int     lwp_setprivate(klwp_t *, int, uintptr_t);
 779 extern  void    lwp_stat_update(lwp_stat_id_t, long);
 780 extern  void    lwp_attach_brand_hdlrs(klwp_t *);
 781 extern  void    lwp_detach_brand_hdlrs(klwp_t *);
 782 
 783 #if defined(__sparcv9)
 784 extern  void    lwp_mmodel_newlwp(void);
 785 extern  void    lwp_mmodel_shared_as(caddr_t, size_t);
 786 #define LWP_MMODEL_NEWLWP()             lwp_mmodel_newlwp()