The branch main has been updated by hselasky:

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

commit ef0f7ae934b04a4f90e051d701ba539dd04e7d5b
Author:     Hans Petter Selasky <hsela...@freebsd.org>
AuthorDate: 2021-05-21 08:27:20 +0000
Commit:     Hans Petter Selasky <hsela...@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. */
_______________________________________________
dev-commits-src-main@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-main
To unsubscribe, send any mail to "dev-commits-src-main-unsubscr...@freebsd.org"

Reply via email to