Martin Pieuchot(m...@openbsd.org) on 2018.02.09 21:31:55 +0100:
> Diff below moves some job control bits out of exit1().  It is extracted
> from guenther@'s proctreelk diff.  It's currently a noop so I'd like to
> get it in to reduce the locking diff.
> 
> ok?

ok
 
> Index: kern/kern_exit.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/kern_exit.c,v
> retrieving revision 1.163
> diff -u -p -r1.163 kern_exit.c
> --- kern/kern_exit.c  30 Dec 2017 20:47:00 -0000      1.163
> +++ kern/kern_exit.c  9 Feb 2018 20:27:17 -0000
> @@ -117,8 +117,7 @@ exit1(struct proc *p, int rv, int flags)
>  {
>       struct process *pr, *qr, *nqr;
>       struct rusage *rup;
> -     struct vnode *ovp;
> -     
> +
>       atomic_setbits_int(&p->p_flag, P_WEXIT);
>  
>       pr = p->p_p;
> @@ -184,44 +183,7 @@ exit1(struct proc *p, int rv, int flags)
>  #ifdef SYSVSEM
>               semexit(pr);
>  #endif
> -             if (SESS_LEADER(pr)) {
> -                     struct session *sp = pr->ps_session;
> -
> -                     if (sp->s_ttyvp) {
> -                             /*
> -                              * Controlling process.
> -                              * Signal foreground pgrp,
> -                              * drain controlling terminal
> -                              * and revoke access to controlling terminal.
> -                              */
> -                             if (sp->s_ttyp->t_session == sp) {
> -                                     if (sp->s_ttyp->t_pgrp)
> -                                             pgsignal(sp->s_ttyp->t_pgrp,
> -                                                 SIGHUP, 1);
> -                                     ttywait(sp->s_ttyp);
> -                                     /*
> -                                      * The tty could have been revoked
> -                                      * if we blocked.
> -                                      */
> -                                     if (sp->s_ttyvp)
> -                                             VOP_REVOKE(sp->s_ttyvp,
> -                                                 REVOKEALL);
> -                             }
> -                             ovp = sp->s_ttyvp;
> -                             sp->s_ttyvp = NULL;
> -                             if (ovp)
> -                                     vrele(ovp);
> -                             /*
> -                              * s_ttyp is not zero'd; we use this to
> -                              * indicate that the session once had a
> -                              * controlling terminal.  (for logging and
> -                              * informational purposes)
> -                              */
> -                     }
> -                     sp->s_leader = NULL;
> -             }
> -             fixjobc(pr, pr->ps_pgrp, 0);
> -
> +             killjobc(pr);
>  #ifdef ACCOUNTING
>               acct_process(p);
>  #endif
> Index: kern/kern_proc.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/kern_proc.c,v
> retrieving revision 1.79
> diff -u -p -r1.79 kern_proc.c
> --- kern/kern_proc.c  30 Dec 2017 20:47:00 -0000      1.79
> +++ kern/kern_proc.c  9 Feb 2018 20:26:55 -0000
> @@ -47,6 +47,7 @@
>  #include <sys/tty.h>
>  #include <sys/signalvar.h>
>  #include <sys/pool.h>
> +#include <sys/vnode.h>
>  
>  #define      UIHASH(uid)     (&uihashtbl[(uid) & uihash])
>  LIST_HEAD(uihashhead, uidinfo) *uihashtbl;
> @@ -380,6 +381,48 @@ fixjobc(struct process *pr, struct pgrp 
>                       else if (--hispgrp->pg_jobc == 0)
>                               orphanpg(hispgrp);
>               }
> +}
> +
> +void
> +killjobc(struct process *pr)
> +{
> +     if (SESS_LEADER(pr)) {
> +             struct session *sp = pr->ps_session;
> +
> +             if (sp->s_ttyvp) {
> +                     struct vnode *ovp;
> +
> +                     /*
> +                      * Controlling process.
> +                      * Signal foreground pgrp,
> +                      * drain controlling terminal
> +                      * and revoke access to controlling terminal.
> +                      */
> +                     if (sp->s_ttyp->t_session == sp) {
> +                             if (sp->s_ttyp->t_pgrp)
> +                                     pgsignal(sp->s_ttyp->t_pgrp, SIGHUP, 1);
> +                             ttywait(sp->s_ttyp);
> +                             /*
> +                              * The tty could have been revoked
> +                              * if we blocked.
> +                              */
> +                             if (sp->s_ttyvp)
> +                                     VOP_REVOKE(sp->s_ttyvp, REVOKEALL);
> +                     }
> +                     ovp = sp->s_ttyvp;
> +                     sp->s_ttyvp = NULL;
> +                     if (ovp)
> +                             vrele(ovp);
> +                     /*
> +                      * s_ttyp is not zero'd; we use this to
> +                      * indicate that the session once had a
> +                      * controlling terminal.  (for logging and
> +                      * informational purposes)
> +                      */
> +             }
> +             sp->s_leader = NULL;
> +     }
> +     fixjobc(pr, pr->ps_pgrp, 0);
>  }
>  
>  /* 
> Index: sys/proc.h
> ===================================================================
> RCS file: /cvs/src/sys/sys/proc.h,v
> retrieving revision 1.244
> diff -u -p -r1.244 proc.h
> --- sys/proc.h        19 Dec 2017 10:04:59 -0000      1.244
> +++ sys/proc.h        9 Feb 2018 20:24:30 -0000
> @@ -500,6 +500,7 @@ int       enterpgrp(struct process *, pid_t, s
>  void fixjobc(struct process *, struct pgrp *, int);
>  int  inferior(struct process *, struct process *);
>  void leavepgrp(struct process *);
> +void killjobc(struct process *);
>  void preempt(void);
>  void pgdelete(struct pgrp *);
>  void procinit(void);
> 

Reply via email to