diff options
| author | Andrew Turner <andrew@FreeBSD.org> | 2022-05-09 14:28:56 +0000 |
|---|---|---|
| committer | Andrew Turner <andrew@FreeBSD.org> | 2022-06-07 14:20:18 +0000 |
| commit | 3f10d87df48a49136ea9ceefbe8171f24546f27c (patch) | |
| tree | fe08868bb748f3965c53ba686640788c13f0ef17 | |
| parent | 6173c7833be4d3bcc8e76031a96c49039a77878e (diff) | |
| download | src-3f10d87df48a49136ea9ceefbe8171f24546f27c.tar.gz src-3f10d87df48a49136ea9ceefbe8171f24546f27c.zip | |
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
(cherry picked from commit 11a6ecd4258b9108fb19420ec5db297f6d99a842)
| -rw-r--r-- | sys/kern/kern_umtx.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/sys/kern/kern_umtx.c b/sys/kern/kern_umtx.c index b76d080b8e06..dd1622c476c5 100644 --- a/sys/kern/kern_umtx.c +++ b/sys/kern/kern_umtx.c @@ -2224,6 +2224,17 @@ do_lock_pi(struct thread *td, struct umutex *m, uint32_t flags, } /* + * 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. */ |
