Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 28 Nov 2020 10:38:01 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r368123 - in stable/12/sys: kern sys
Message-ID:  <202011281038.0ASAc1tq044899@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Sat Nov 28 10:38:00 2020
New Revision: 368123
URL: https://svnweb.freebsd.org/changeset/base/368123

Log:
  MFC r367923:
  Stop using eventhandlers for itimers subsystem exec and exit hooks.

Modified:
  stable/12/sys/kern/kern_exec.c
  stable/12/sys/kern/kern_exit.c
  stable/12/sys/kern/kern_time.c
  stable/12/sys/sys/timers.h
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/kern/kern_exec.c
==============================================================================
--- stable/12/sys/kern/kern_exec.c	Sat Nov 28 10:36:19 2020	(r368122)
+++ stable/12/sys/kern/kern_exec.c	Sat Nov 28 10:38:00 2020	(r368123)
@@ -68,6 +68,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/sysctl.h>
 #include <sys/sysent.h>
 #include <sys/sysproto.h>
+#include <sys/timers.h>
 #include <sys/umtx.h>
 #include <sys/vnode.h>
 #include <sys/wait.h>
@@ -1108,6 +1109,7 @@ exec_new_vmspace(struct image_params *imgp, struct sys
 	imgp->sysent = sv;
 
 	umtx_exec(p);
+	itimers_exec(p);
 
 	EVENTHANDLER_DIRECT_INVOKE(process_exec, p, imgp);
 

Modified: stable/12/sys/kern/kern_exit.c
==============================================================================
--- stable/12/sys/kern/kern_exit.c	Sat Nov 28 10:36:19 2020	(r368122)
+++ stable/12/sys/kern/kern_exit.c	Sat Nov 28 10:38:00 2020	(r368123)
@@ -72,6 +72,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/sdt.h>
 #include <sys/shm.h>
 #include <sys/sem.h>
+#include <sys/timers.h>
 #include <sys/umtx.h>
 #ifdef KTRACE
 #include <sys/ktrace.h>
@@ -320,6 +321,8 @@ exit1(struct thread *td, int rval, int signo)
 			msleep(p, &ppeers_lock, PWAIT, "exit1", 0);
 		mtx_unlock(&ppeers_lock);
 	}
+
+	itimers_exit(p);
 
 	/*
 	 * Check if any loadable modules need anything done at process exit.

Modified: stable/12/sys/kern/kern_time.c
==============================================================================
--- stable/12/sys/kern/kern_time.c	Sat Nov 28 10:36:19 2020	(r368122)
+++ stable/12/sys/kern/kern_time.c	Sat Nov 28 10:38:00 2020	(r368123)
@@ -43,7 +43,6 @@ __FBSDID("$FreeBSD$");
 #include <sys/lock.h>
 #include <sys/mutex.h>
 #include <sys/sysproto.h>
-#include <sys/eventhandler.h>
 #include <sys/resourcevar.h>
 #include <sys/signalvar.h>
 #include <sys/kernel.h>
@@ -99,8 +98,6 @@ static void	itimer_enter(struct itimer *);
 static void	itimer_leave(struct itimer *);
 static struct itimer *itimer_find(struct proc *, int);
 static void	itimers_alloc(struct proc *);
-static void	itimers_event_hook_exec(void *arg, struct proc *p, struct image_params *imgp);
-static void	itimers_event_hook_exit(void *arg, struct proc *p);
 static int	realtimer_create(struct itimer *);
 static int	realtimer_gettime(struct itimer *, struct itimerspec *);
 static int	realtimer_settime(struct itimer *, int,
@@ -109,7 +106,7 @@ static int	realtimer_delete(struct itimer *);
 static void	realtimer_clocktime(clockid_t, struct timespec *);
 static void	realtimer_expire(void *);
 
-int		register_posix_clock(int, struct kclock *);
+static int	register_posix_clock(int, const struct kclock *);
 void		itimer_fire(struct itimer *it);
 int		itimespecfix(struct timespec *ts);
 
@@ -1089,12 +1086,11 @@ ppsratecheck(struct timeval *lasttime, int *curpps, in
 static void
 itimer_start(void)
 {
-	struct kclock rt_clock = {
+	static const struct kclock rt_clock = {
 		.timer_create  = realtimer_create,
 		.timer_delete  = realtimer_delete,
 		.timer_settime = realtimer_settime,
 		.timer_gettime = realtimer_gettime,
-		.event_hook    = NULL
 	};
 
 	itimer_zone = uma_zcreate("itimer", sizeof(struct itimer),
@@ -1104,14 +1100,10 @@ itimer_start(void)
 	p31b_setcfg(CTL_P1003_1B_TIMERS, 200112L);
 	p31b_setcfg(CTL_P1003_1B_DELAYTIMER_MAX, INT_MAX);
 	p31b_setcfg(CTL_P1003_1B_TIMER_MAX, TIMER_MAX);
-	EVENTHANDLER_REGISTER(process_exit, itimers_event_hook_exit,
-		(void *)ITIMER_EV_EXIT, EVENTHANDLER_PRI_ANY);
-	EVENTHANDLER_REGISTER(process_exec, itimers_event_hook_exec,
-		(void *)ITIMER_EV_EXEC, EVENTHANDLER_PRI_ANY);
 }
 
-int
-register_posix_clock(int clockid, struct kclock *clk)
+static int
+register_posix_clock(int clockid, const struct kclock *clk)
 {
 	if ((unsigned)clockid >= MAX_CLOCKS) {
 		printf("%s: invalid clockid\n", __func__);
@@ -1717,46 +1709,41 @@ itimers_alloc(struct proc *p)
 	}
 }
 
-static void
-itimers_event_hook_exec(void *arg, struct proc *p, struct image_params *imgp __unused)
-{
-	itimers_event_hook_exit(arg, p);
-}
-
 /* Clean up timers when some process events are being triggered. */
 static void
-itimers_event_hook_exit(void *arg, struct proc *p)
+itimers_event_exit_exec(int start_idx, struct proc *p)
 {
 	struct itimers *its;
 	struct itimer *it;
-	int event = (int)(intptr_t)arg;
 	int i;
 
-	if (p->p_itimers != NULL) {
-		its = p->p_itimers;
-		for (i = 0; i < MAX_CLOCKS; ++i) {
-			if (posix_clocks[i].event_hook != NULL)
-				CLOCK_CALL(i, event_hook, (p, i, event));
-		}
-		/*
-		 * According to susv3, XSI interval timers should be inherited
-		 * by new image.
-		 */
-		if (event == ITIMER_EV_EXEC)
-			i = 3;
-		else if (event == ITIMER_EV_EXIT)
-			i = 0;
-		else
-			panic("unhandled event");
-		for (; i < TIMER_MAX; ++i) {
-			if ((it = its->its_timers[i]) != NULL)
-				kern_ktimer_delete(curthread, i);
-		}
-		if (its->its_timers[0] == NULL &&
-		    its->its_timers[1] == NULL &&
-		    its->its_timers[2] == NULL) {
-			free(its, M_SUBPROC);
-			p->p_itimers = NULL;
-		}
+	its = p->p_itimers;
+	if (its == NULL)
+		return;
+
+	for (i = start_idx; i < TIMER_MAX; ++i) {
+		if ((it = its->its_timers[i]) != NULL)
+			kern_ktimer_delete(curthread, i);
 	}
+	if (its->its_timers[0] == NULL && its->its_timers[1] == NULL &&
+	    its->its_timers[2] == NULL) {
+		free(its, M_SUBPROC);
+		p->p_itimers = NULL;
+	}
+}
+
+void
+itimers_exec(struct proc *p)
+{
+	/*
+	 * According to susv3, XSI interval timers should be inherited
+	 * by new image.
+	 */
+	itimers_event_exit_exec(3, p);
+}
+
+void
+itimers_exit(struct proc *p)
+{
+	itimers_event_exit_exec(0, p);
 }

Modified: stable/12/sys/sys/timers.h
==============================================================================
--- stable/12/sys/sys/timers.h	Sat Nov 28 10:36:19 2020	(r368122)
+++ stable/12/sys/sys/timers.h	Sat Nov 28 10:38:00 2020	(r368123)
@@ -107,13 +107,10 @@ struct	kclock {
 	int (*timer_delete)(struct itimer * timer);
 	int (*timer_gettime)(struct itimer * timer,
 		struct itimerspec * cur_value);
-	void (*event_hook)(struct proc *p, clockid_t clock_id, int event);
 };
 
-/* Event values for event_hook() */
-#define	ITIMER_EV_EXEC	0
-#define	ITIMER_EV_EXIT	1
-
+void	itimers_exec(struct proc *p);
+void	itimers_exit(struct proc *p);
 int	itimer_accept(struct proc *p, int tid, ksiginfo_t *ksi);
 #endif
 #endif /* !_SYS_TIMERS_H_ */



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