mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-29 17:25:38 +00:00
futex: Don't include process MM in futex key on no-MMU
[ Upstream commitc73801ae4f
] On no-MMU, all futexes are treated as private because there is no need to map a virtual address to physical to match the futex across processes. This doesn't quite work though, because private futexes include the current process's mm_struct as part of their key. This makes it impossible for one process to wake up a shared futex being waited on in another process. Fix this bug by excluding the mm_struct from the key. With a single address space, the futex address is already a unique key. Fixes:784bdf3bb6
("futex: Assume all mappings are private on !MMU systems") Signed-off-by: Ben Wolsieffer <ben.wolsieffer@hefring.com> Signed-off-by: Ingo Molnar <mingo@kernel.org> Acked-by: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Darren Hart <dvhart@infradead.org> Cc: Davidlohr Bueso <dave@stgolabs.net> Cc: André Almeida <andrealmeid@igalia.com> Link: https://lore.kernel.org/r/20231019204548.1236437-2-ben.wolsieffer@hefring.com Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
3c1a20c122
commit
dce53a017c
@ -248,7 +248,17 @@ int get_futex_key(u32 __user *uaddr, bool fshared, union futex_key *key,
|
||||
* but access_ok() should be faster than find_vma()
|
||||
*/
|
||||
if (!fshared) {
|
||||
key->private.mm = mm;
|
||||
/*
|
||||
* On no-MMU, shared futexes are treated as private, therefore
|
||||
* we must not include the current process in the key. Since
|
||||
* there is only one address space, the address is a unique key
|
||||
* on its own.
|
||||
*/
|
||||
if (IS_ENABLED(CONFIG_MMU))
|
||||
key->private.mm = mm;
|
||||
else
|
||||
key->private.mm = NULL;
|
||||
|
||||
key->private.address = address;
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user