git: 057e390dadaf - stable/13 - Stop arming realtime posix process timers on suspend or terminate

Konstantin Belousov kib at FreeBSD.org
Fri Apr 23 11:15:23 UTC 2021


The branch stable/13 has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=057e390dadaf942bb2bfb66a2c3d68f79ff6506a

commit 057e390dadaf942bb2bfb66a2c3d68f79ff6506a
Author:     Konstantin Belousov <kib at FreeBSD.org>
AuthorDate: 2021-03-11 08:16:51 +0000
Commit:     Konstantin Belousov <kib at FreeBSD.org>
CommitDate: 2021-04-23 11:14:09 +0000

    Stop arming realtime posix process timers on suspend or terminate
    
    (cherry picked from commit 4d27d8d2f3b8ae4ef3efc86b220c7ff2dbdbac5a)
---
 sys/kern/kern_time.c | 48 +++++++++++++++++++++++++++++++++++++++---------
 sys/sys/timers.h     |  1 +
 2 files changed, 40 insertions(+), 9 deletions(-)

diff --git a/sys/kern/kern_time.c b/sys/kern/kern_time.c
index 3010ee326105..d3b19111b0f3 100644
--- a/sys/kern/kern_time.c
+++ b/sys/kern/kern_time.c
@@ -895,6 +895,8 @@ void
 itimer_proc_continue(struct proc *p)
 {
 	struct timeval ctv;
+	struct itimer *it;
+	int id;
 
 	PROC_LOCK_ASSERT(p, MA_OWNED);
 
@@ -906,6 +908,23 @@ itimer_proc_continue(struct proc *p)
 		else
 			realitexpire_reset_callout(p, NULL);
 	}
+
+	if (p->p_itimers != NULL) {
+		for (id = 3; id < TIMER_MAX; id++) {
+			it = p->p_itimers->its_timers[id];
+			if (it == NULL)
+				continue;
+			if ((it->it_flags & ITF_PSTOPPED) != 0) {
+				ITIMER_LOCK(it);
+				if ((it->it_flags & ITF_PSTOPPED) != 0) {
+					it->it_flags &= ~ITF_PSTOPPED;
+					if ((it->it_flags & ITF_DELETING) == 0)
+						realtimer_expire(it);
+				}
+				ITIMER_UNLOCK(it);
+			}
+		}
+	}
 }
 
 /*
@@ -1651,6 +1670,7 @@ realtimer_expire(void *arg)
 	struct timespec cts, ts;
 	struct timeval tv;
 	struct itimer *it;
+	struct proc *p;
 	uint64_t interval, now, overruns, value;
 
 	it = (struct itimer *)arg;
@@ -1689,10 +1709,15 @@ realtimer_expire(void *arg)
 			timespecclear(&it->it_time.it_value);
 		}
 		if (timespecisset(&it->it_time.it_value)) {
-			timespecsub(&it->it_time.it_value, &cts, &ts);
-			TIMESPEC_TO_TIMEVAL(&tv, &ts);
-			callout_reset(&it->it_callout, tvtohz(&tv),
-			    realtimer_expire, it);
+			p = it->it_proc;
+			if (P_SHOULDSTOP(p) || P_KILLED(p)) {
+				it->it_flags |= ITF_PSTOPPED;
+			} else {
+				timespecsub(&it->it_time.it_value, &cts, &ts);
+				TIMESPEC_TO_TIMEVAL(&tv, &ts);
+				callout_reset(&it->it_callout, tvtohz(&tv),
+				    realtimer_expire, it);
+			}
 		}
 		itimer_enter(it);
 		ITIMER_UNLOCK(it);
@@ -1700,11 +1725,16 @@ realtimer_expire(void *arg)
 		ITIMER_LOCK(it);
 		itimer_leave(it);
 	} else if (timespecisset(&it->it_time.it_value)) {
-		ts = it->it_time.it_value;
-		timespecsub(&ts, &cts, &ts);
-		TIMESPEC_TO_TIMEVAL(&tv, &ts);
-		callout_reset(&it->it_callout, tvtohz(&tv), realtimer_expire,
-		    it);
+		p = it->it_proc;
+		if (P_SHOULDSTOP(p) || P_KILLED(p)) {
+			it->it_flags |= ITF_PSTOPPED;
+		} else {
+			ts = it->it_time.it_value;
+			timespecsub(&ts, &cts, &ts);
+			TIMESPEC_TO_TIMEVAL(&tv, &ts);
+			callout_reset(&it->it_callout, tvtohz(&tv),
+			    realtimer_expire, it);
+		}
 	}
 }
 
diff --git a/sys/sys/timers.h b/sys/sys/timers.h
index aa1912149452..5d6f0c95afa2 100644
--- a/sys/sys/timers.h
+++ b/sys/sys/timers.h
@@ -82,6 +82,7 @@ struct itimer {
 
 #define	ITF_DELETING	0x01
 #define	ITF_WANTED	0x02
+#define	ITF_PSTOPPED	0x04
 
 #define	ITCF_ONWORKLIST	0x01
 


More information about the dev-commits-src-all mailing list