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
This commit is contained in:
Andrew Turner 2022-05-09 15:28:56 +01:00
parent 190abf86bb
commit 11a6ecd425

View File

@ -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.