Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 23 May 2021 08:55:55 GMT
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: ef0f7ae934b0 - main - The old thread priority must be stored as part of the EPOCH(9) tracker.
Message-ID:  <202105230855.14N8ttJM063434@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by hselasky:

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

commit ef0f7ae934b04a4f90e051d701ba539dd04e7d5b
Author:     Hans Petter Selasky <hselasky@FreeBSD.org>
AuthorDate: 2021-05-21 08:27:20 +0000
Commit:     Hans Petter Selasky <hselasky@FreeBSD.org>
CommitDate: 2021-05-23 08:53:25 +0000

    The old thread priority must be stored as part of the EPOCH(9) tracker.
    
    Else recursive use of EPOCH(9) may cause the wrong priority to be restored.
    
    Bump the __FreeBSD_version due to changing the thread and epoch tracker
    structure.
    
    Differential Revision:  https://reviews.freebsd.org/D30375
    Reviewed by:    markj@
    MFC after:      1 week
    Sponsored by:   Mellanox Technologies // NVIDIA Networking
---
 sys/kern/subr_epoch.c | 6 +++---
 sys/sys/epoch.h       | 1 +
 sys/sys/param.h       | 2 +-
 sys/sys/proc.h        | 1 -
 4 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/sys/kern/subr_epoch.c b/sys/kern/subr_epoch.c
index 798dbdc4360e..651fd8b419f0 100644
--- a/sys/kern/subr_epoch.c
+++ b/sys/kern/subr_epoch.c
@@ -457,7 +457,7 @@ _epoch_enter_preempt(epoch_t epoch, epoch_tracker_t et EPOCH_FILE_LINE)
 	THREAD_NO_SLEEPING();
 	critical_enter();
 	sched_pin();
-	td->td_pre_epoch_prio = td->td_priority;
+	et->et_old_priority = td->td_priority;
 	er = epoch_currecord(epoch);
 	/* Record-level tracking is reserved for non-preemptible epochs. */
 	MPASS(er->er_td == NULL);
@@ -510,8 +510,8 @@ _epoch_exit_preempt(epoch_t epoch, epoch_tracker_t et EPOCH_FILE_LINE)
 	ck_epoch_end(&er->er_record, &et->et_section);
 	TAILQ_REMOVE(&er->er_tdlist, et, et_link);
 	er->er_gen++;
-	if (__predict_false(td->td_pre_epoch_prio != td->td_priority))
-		epoch_adjust_prio(td, td->td_pre_epoch_prio);
+	if (__predict_false(et->et_old_priority != td->td_priority))
+		epoch_adjust_prio(td, et->et_old_priority);
 	critical_exit();
 #ifdef EPOCH_TRACE
 	epoch_trace_exit(td, epoch, et, file, line);
diff --git a/sys/sys/epoch.h b/sys/sys/epoch.h
index 25d2bb3dc6e3..85c791d3df6c 100644
--- a/sys/sys/epoch.h
+++ b/sys/sys/epoch.h
@@ -55,6 +55,7 @@ struct epoch_tracker {
 	TAILQ_ENTRY(epoch_tracker) et_link;
 	struct thread *et_td;
 	ck_epoch_section_t et_section;
+	uint8_t et_old_priority;
 #ifdef EPOCH_TRACE
 	struct epoch *et_epoch;
 	SLIST_ENTRY(epoch_tracker) et_tlink;
diff --git a/sys/sys/param.h b/sys/sys/param.h
index 68808f3e2185..81971777e87b 100644
--- a/sys/sys/param.h
+++ b/sys/sys/param.h
@@ -76,7 +76,7 @@
  * cannot include sys/param.h and should only be updated here.
  */
 #undef __FreeBSD_version
-#define __FreeBSD_version 1400013
+#define __FreeBSD_version 1400014
 
 /*
  * __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,
diff --git a/sys/sys/proc.h b/sys/sys/proc.h
index 926f0de14b84..8098bb9468ec 100644
--- a/sys/sys/proc.h
+++ b/sys/sys/proc.h
@@ -325,7 +325,6 @@ struct thread {
 	u_char		td_pri_class;	/* (t) Scheduling class. */
 	u_char		td_user_pri;	/* (t) User pri from estcpu and nice. */
 	u_char		td_base_user_pri; /* (t) Base user pri */
-	u_char		td_pre_epoch_prio; /* (k) User pri on entry to epoch */
 	uintptr_t	td_rb_list;	/* (k) Robust list head. */
 	uintptr_t	td_rbp_list;	/* (k) Robust priv list head. */
 	uintptr_t	td_rb_inact;	/* (k) Current in-action mutex loc. */



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