Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 23 Nov 2020 17:29:25 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r367959 - in head/sys: kern sys
Message-ID:  <202011231729.0ANHTPX9005663@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Mon Nov 23 17:29:25 2020
New Revision: 367959
URL: https://svnweb.freebsd.org/changeset/base/367959

Log:
  Provide ABI modules hooks for process exec/exit and thread exit.
  
  Exec and exit are same as corresponding eventhandler hooks.
  
  Thread exit hook is called somewhat earlier, while thread is still
  owned by the process and enough context is available.  Note that the
  process lock is owned when the hook is called.
  
  Reviewed by:	markj
  Sponsored by:	The FreeBSD Foundation
  Differential revision:	https://reviews.freebsd.org/D27309

Modified:
  head/sys/kern/kern_exec.c
  head/sys/kern/kern_exit.c
  head/sys/kern/kern_kthread.c
  head/sys/kern/kern_thr.c
  head/sys/sys/sysent.h

Modified: head/sys/kern/kern_exec.c
==============================================================================
--- head/sys/kern/kern_exec.c	Mon Nov 23 17:00:06 2020	(r367958)
+++ head/sys/kern/kern_exec.c	Mon Nov 23 17:29:25 2020	(r367959)
@@ -1051,6 +1051,8 @@ exec_new_vmspace(struct image_params *imgp, struct sys
 	sigfastblock_clear(td);
 	umtx_exec(p);
 	itimers_exec(p);
+	if (sv->sv_onexec != NULL)
+		sv->sv_onexec(p, imgp);
 
 	EVENTHANDLER_DIRECT_INVOKE(process_exec, p, imgp);
 

Modified: head/sys/kern/kern_exit.c
==============================================================================
--- head/sys/kern/kern_exit.c	Mon Nov 23 17:00:06 2020	(r367958)
+++ head/sys/kern/kern_exit.c	Mon Nov 23 17:29:25 2020	(r367959)
@@ -72,6 +72,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/sdt.h>
 #include <sys/shm.h>
 #include <sys/sem.h>
+#include <sys/sysent.h>
 #include <sys/timers.h>
 #include <sys/umtx.h>
 #ifdef KTRACE
@@ -327,6 +328,9 @@ exit1(struct thread *td, int rval, int signo)
 
 	itimers_exit(p);
 
+	if (p->p_sysent->sv_onexit != NULL)
+		p->p_sysent->sv_onexit(p);
+
 	/*
 	 * Check if any loadable modules need anything done at process exit.
 	 * E.g. SYSV IPC stuff.
@@ -560,6 +564,9 @@ exit1(struct thread *td, int rval, int signo)
 	/* Save exit status. */
 	PROC_LOCK(p);
 	p->p_xthread = td;
+
+	if (p->p_sysent->sv_ontdexit != NULL)
+		p->p_sysent->sv_ontdexit(td);
 
 #ifdef KDTRACE_HOOKS
 	/*

Modified: head/sys/kern/kern_kthread.c
==============================================================================
--- head/sys/kern/kern_kthread.c	Mon Nov 23 17:00:06 2020	(r367958)
+++ head/sys/kern/kern_kthread.c	Mon Nov 23 17:29:25 2020	(r367959)
@@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/resourcevar.h>
 #include <sys/rwlock.h>
 #include <sys/signalvar.h>
+#include <sys/sysent.h>
 #include <sys/sx.h>
 #include <sys/umtx.h>
 #include <sys/unistd.h>
@@ -355,6 +356,10 @@ kthread_exit(void)
 		PROC_UNLOCK(p);
 		kproc_exit(0);
 	}
+
+	if (p->p_sysent->sv_ontdexit != NULL)
+		p->p_sysent->sv_ontdexit(td);
+
 	tidhash_remove(td);
 	umtx_thread_exit(td);
 	tdsigcleanup(td);

Modified: head/sys/kern/kern_thr.c
==============================================================================
--- head/sys/kern/kern_thr.c	Mon Nov 23 17:00:06 2020	(r367958)
+++ head/sys/kern/kern_thr.c	Mon Nov 23 17:29:25 2020	(r367959)
@@ -353,6 +353,9 @@ kern_thr_exit(struct thread *td)
 		return (0);
 	}
 
+	if (p->p_sysent->sv_ontdexit != NULL)
+		p->p_sysent->sv_ontdexit(td);
+
 	td->td_dbgflags |= TDB_EXIT;
 	if (p->p_ptevents & PTRACE_LWP) {
 		p->p_pendingexits++;

Modified: head/sys/sys/sysent.h
==============================================================================
--- head/sys/sys/sysent.h	Mon Nov 23 17:00:06 2020	(r367958)
+++ head/sys/sys/sysent.h	Mon Nov 23 17:29:25 2020	(r367959)
@@ -145,6 +145,9 @@ struct sysentvec {
 	u_long		*sv_hwcap2;	/* Value passed in AT_HWCAP2. */
 	const char	*(*sv_machine_arch)(struct proc *);
 	vm_offset_t	sv_fxrng_gen_base;
+	void		(*sv_onexec)(struct proc *, struct image_params *);
+	void		(*sv_onexit)(struct proc *);
+	void		(*sv_ontdexit)(struct thread *td);
 };
 
 #define	SV_ILP32	0x000100	/* 32-bit executable. */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202011231729.0ANHTPX9005663>