aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2021-05-21 08:27:20 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2021-06-02 12:03:21 +0000
commitc64d1bd7145b5d30c97d1cd99e584da529d95100 (patch)
tree2ae246041a9260f8394bf53684b6e5673ff12f3d
parente31579b8558db508dfc3f8fc276611a7c3c93aa1 (diff)
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 adding new member to the epoch tracker structure. Differential Revision: https://reviews.freebsd.org/D30375 Reviewed by: markj@ Sponsored by: Mellanox Technologies // NVIDIA Networking (cherry picked from commit ef0f7ae934b04a4f90e051d701ba539dd04e7d5b)
-rw-r--r--sys/kern/subr_epoch.c6
-rw-r--r--sys/sys/epoch.h1
-rw-r--r--sys/sys/param.h2
-rw-r--r--sys/sys/proc.h2
4 files changed, 6 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 127c04becf58..f9b67ef94bc0 100644
--- a/sys/sys/param.h
+++ b/sys/sys/param.h
@@ -60,7 +60,7 @@
* in the range 5 to 9.
*/
#undef __FreeBSD_version
-#define __FreeBSD_version 1300506 /* Master, propagated to newvers */
+#define __FreeBSD_version 1300507 /* Master, propagated to newvers */
/*
* __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,
diff --git a/sys/sys/proc.h b/sys/sys/proc.h
index 8e2a081eb027..05fdc83fd1e2 100644
--- a/sys/sys/proc.h
+++ b/sys/sys/proc.h
@@ -325,7 +325,7 @@ 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 */
+ u_char td_unused_0; /* no longer used field */
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. */