git: 4f34dc64536f - main - linux(4): Replace casuword32 by casueword32.
Dmitry Chagin
dchagin at FreeBSD.org
Thu Jul 29 09:58:47 UTC 2021
The branch main has been updated by dchagin:
URL: https://cgit.FreeBSD.org/src/commit/?id=4f34dc64536f7de8324ca1a494aee88e64c7de70
commit 4f34dc64536f7de8324ca1a494aee88e64c7de70
Author: Dmitry Chagin <dchagin at FreeBSD.org>
AuthorDate: 2021-07-29 09:50:11 +0000
Commit: Dmitry Chagin <dchagin at FreeBSD.org>
CommitDate: 2021-07-29 09:50:11 +0000
linux(4): Replace casuword32 by casueword32.
Follow the r349951 (30b3018d), add check to react to stops and requests
to terminate between retries.
Reviewed by: kib
Differential Revision: https://reviews.freebsd.org/D31254
MFC after: 2 weeks
---
sys/compat/linux/linux_futex.c | 27 +++++++++++++++------------
1 file changed, 15 insertions(+), 12 deletions(-)
diff --git a/sys/compat/linux/linux_futex.c b/sys/compat/linux/linux_futex.c
index 441a26d4d317..82a1eb55d618 100644
--- a/sys/compat/linux/linux_futex.c
+++ b/sys/compat/linux/linux_futex.c
@@ -107,8 +107,8 @@ LIN_SDT_PROBE_DEFINE1(futex, release_futexes, copyin_error, "int");
#define GET_SHARED(a) (a->flags & FUTEX_SHARED) ? AUTO_SHARE : THREAD_SHARE
static int futex_atomic_op(struct thread *, int, uint32_t *);
-static int handle_futex_death(struct linux_emuldata *, uint32_t *,
- unsigned int);
+static int handle_futex_death(struct thread *td, struct linux_emuldata *,
+ uint32_t *, unsigned int);
static int fetch_robust_entry(struct linux_robust_list **,
struct linux_robust_list **, unsigned int *);
@@ -982,7 +982,7 @@ linux_get_robust_list(struct thread *td, struct linux_get_robust_list_args *args
}
static int
-handle_futex_death(struct linux_emuldata *em, uint32_t *uaddr,
+handle_futex_death(struct thread *td, struct linux_emuldata *em, uint32_t *uaddr,
unsigned int pi)
{
uint32_t uval, nval, mval;
@@ -994,20 +994,22 @@ retry:
return (EFAULT);
if ((uval & FUTEX_TID_MASK) == em->em_tid) {
mval = (uval & FUTEX_WAITERS) | FUTEX_OWNER_DIED;
- nval = casuword32(uaddr, uval, mval);
-
- if (nval == -1)
+ error = casueword32(uaddr, uval, &nval, mval);
+ if (error == -1)
return (EFAULT);
-
- if (nval != uval)
+ if (error == 1) {
+ error = thread_check_susp(td, false);
+ if (error != 0)
+ return (error);
goto retry;
+ }
if (!pi && (uval & FUTEX_WAITERS)) {
- error = futex_wake(curthread, uaddr, 1, true);
+ error = futex_wake(td, uaddr, 1, true);
if (error != 0)
return (error);
} else if (pi && (uval & FUTEX_WAITERS)) {
- error = futex_wake_pi(curthread, uaddr, true);
+ error = futex_wake_pi(td, uaddr, true);
if (error != 0)
return (error);
}
@@ -1067,7 +1069,7 @@ release_futexes(struct thread *td, struct linux_emuldata *em)
rc = fetch_robust_entry(&next_entry, PTRIN(&entry->next), &next_pi);
if (entry != pending)
- if (handle_futex_death(em,
+ if (handle_futex_death(td, em,
(uint32_t *)((caddr_t)entry + futex_offset), pi)) {
return;
}
@@ -1084,5 +1086,6 @@ release_futexes(struct thread *td, struct linux_emuldata *em)
}
if (pending)
- handle_futex_death(em, (uint32_t *)((caddr_t)pending + futex_offset), pip);
+ handle_futex_death(td, em,
+ (uint32_t *)((caddr_t)pending + futex_offset), pip);
}
More information about the dev-commits-src-all
mailing list