Introduce killjobc()

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Introduce killjobc()

Martin Pieuchot
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?

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 | Threaded
Open this post in threaded view
|

Re: Introduce killjobc()

Sebastian Benoit-3
Martin Pieuchot([hidden email]) 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 | Threaded
Open this post in threaded view
|

Re: Introduce killjobc()

Ted Unangst-6
In reply to this post by Martin Pieuchot
Martin Pieuchot wrote:
> 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?

i misread subject as kill objc, but ok anyway.