git: f5a145cb0a5f - stable/13 - PP mutexes: lock: Check if priority is too high against base one

From: Olivier Certner <olce_at_FreeBSD.org>
Date: Thu, 09 May 2024 13:30:19 UTC
The branch stable/13 has been updated by olce:

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

commit f5a145cb0a5f5ca0eef54d35d60f765639c8f30a
Author:     Olivier Certner <olce@FreeBSD.org>
AuthorDate: 2024-02-22 08:53:51 +0000
Commit:     Olivier Certner <olce@FreeBSD.org>
CommitDate: 2024-05-09 13:29:18 +0000

    PP mutexes: lock: Check if priority is too high against base one
    
    Doing this instead of using the current (user) priority, which includes
    current lendings, prevents gratuitous failures for threads involved in
    multiple locking groups, where each group is defined as the threads that
    can lock a particular PP or PI mutex.  No deadlock can occur in this
    case.  Indeed, if a thread holds such a lock A giving it a higher
    priority than the ceiling of some other lock B that is PP, and B is
    acquired by another thread, effectively the latter may not be able to
    run but this situation can only last until the first thread releases A,
    which it will do eventually.
    
    Reviewed by:            kib
    Approved by:            emaste (mentor)
    MFC after:              2 weeks
    Sponsored by:           The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D44044
    
    (cherry picked from commit 9ac3ac9ece6269365ac314fa5fdb484e96d4a32e)
    
    Approved by:            emaste (mentor)
---
 sys/kern/kern_umtx.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/sys/kern/kern_umtx.c b/sys/kern/kern_umtx.c
index 5767a137b536..05a47f405d30 100644
--- a/sys/kern/kern_umtx.c
+++ b/sys/kern/kern_umtx.c
@@ -2552,7 +2552,7 @@ do_lock_pp(struct thread *td, struct umutex *m, uint32_t flags,
 		}
 
 		mtx_lock(&umtx_lock);
-		if (UPRI(td) < PRI_MIN_REALTIME + ceiling) {
+		if (td->td_base_user_pri < PRI_MIN_REALTIME + ceiling) {
 			mtx_unlock(&umtx_lock);
 			error = EINVAL;
 			goto out;