Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 10 May 2021 01:14:50 GMT
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 8e1c74210cec - stable/13 - Add thread_run_flash() helper
Message-ID:  <202105100114.14A1Eoic028644@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=8e1c74210cec0b81318b6f90648cb0e9387244ad

commit 8e1c74210cec0b81318b6f90648cb0e9387244ad
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2021-04-24 11:47:53 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2021-05-10 01:02:28 +0000

    Add thread_run_flash() helper
    
    (cherry picked from commit af928fded0705100e4f3926c99ed488f7ab6dcf1)
---
 sys/kern/kern_thread.c | 25 +++++++++++++++++++++++++
 sys/sys/proc.h         |  1 +
 2 files changed, 26 insertions(+)

diff --git a/sys/kern/kern_thread.c b/sys/kern/kern_thread.c
index 3561895d9fff..c16b6dd3c791 100644
--- a/sys/kern/kern_thread.c
+++ b/sys/kern/kern_thread.c
@@ -1514,6 +1514,31 @@ thread_unsuspend_one(struct thread *td, struct proc *p, bool boundary)
 	return (setrunnable(td, 0));
 }
 
+void
+thread_run_flash(struct thread *td)
+{
+	struct proc *p;
+
+	p = td->td_proc;
+	PROC_LOCK_ASSERT(p, MA_OWNED);
+
+	if (TD_ON_SLEEPQ(td))
+		sleepq_remove_nested(td);
+	else
+		thread_lock(td);
+
+	THREAD_LOCK_ASSERT(td, MA_OWNED);
+	KASSERT(TD_IS_SUSPENDED(td), ("Thread not suspended"));
+
+	TD_CLR_SUSPENDED(td);
+	PROC_SLOCK(p);
+	MPASS(p->p_suspcount > 0);
+	p->p_suspcount--;
+	PROC_SUNLOCK(p);
+	if (setrunnable(td, 0))
+		kick_proc0();
+}
+
 /*
  * Allow all threads blocked by single threading to continue running.
  */
diff --git a/sys/sys/proc.h b/sys/sys/proc.h
index 3e5a96185e0c..9de7be4628dd 100644
--- a/sys/sys/proc.h
+++ b/sys/sys/proc.h
@@ -1179,6 +1179,7 @@ void	thread_stopped(struct proc *p);
 void	childproc_stopped(struct proc *child, int reason);
 void	childproc_continued(struct proc *child);
 void	childproc_exited(struct proc *child);
+void	thread_run_flash(struct thread *td);
 int	thread_suspend_check(int how);
 bool	thread_suspend_check_needed(void);
 void	thread_suspend_switch(struct thread *, struct proc *p);



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