The branch main has been updated by andrew:

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

commit 11a6ecd4258b9108fb19420ec5db297f6d99a842
Author:     Andrew Turner <[email protected]>
AuthorDate: 2022-05-09 14:28:56 +0000
Commit:     Andrew Turner <[email protected]>
CommitDate: 2022-05-19 10:30:21 +0000

    Handle cas failure when the compare succeeds
    
    When locking a priority inherit mutex we perform a compare and swap
    operation to try and acquire the mutex. This may fail even when the
    compare succeeds.
    
    Check and handle this case.
    
    PR:             263825
    Reviewed by:    kib, markj
    Sponsored by:   The FreeBSD Foundation
    Differential Revision: https://reviews.freebsd.org/D35150
---
 sys/kern/kern_umtx.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/sys/kern/kern_umtx.c b/sys/kern/kern_umtx.c
index 2f666bdcdc7b..d63381d76eb8 100644
--- a/sys/kern/kern_umtx.c
+++ b/sys/kern/kern_umtx.c
@@ -2262,6 +2262,17 @@ do_lock_pi(struct thread *td, struct umutex *m, uint32_t 
flags,
                        break;
                }
 
+               /*
+                * Nobody owns it, but the acquire failed. This can happen
+                * with ll/sc atomics.
+                */
+               if (owner == UMUTEX_UNOWNED) {
+                       error = thread_check_susp(td, true);
+                       if (error != 0)
+                               break;
+                       continue;
+               }
+
                /*
                 * Avoid overwriting a possible error from sleep due
                 * to the pending signal with suspension check result.

Reply via email to