mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-18 22:14:16 +00:00
- Make sure the switch to the global hash is requested always under a lock so
that two threads requesting that simultaneously cannot get to inconsistent state - Reject negative NUMA nodes earlier in the futex NUMA interface handling code - Selftests fixes -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEzv7L6UO9uDPlPSfHEsHwGGHeVUoFAmhXudYACgkQEsHwGGHe VUqtnxAAosFnuc5wJUJnZoqNQFQAQZruINu6CbxCd17aeeJ4aGu1A+aMfBQdPTiW jtKgvE/ES6c+mz4Nuj/YaiSKK2TnuNPcC1OcCHZTZ4UYwHMHKnjFspgAmzxL7Hpm of4iXDCdf5B36Y0eGO1521/KJj7MvU/z5Oe4rvaTv3MSL1XwjRfeG5XUHBk4iHgk SUS9VaEXDoR4mJjByC1yeVeRWR1ntvItT4OeMCATBeGTccVnr4xSVA9eTJyzl+n0 3bBGIElijD9qJtL2ahTxm11kwy34uKC8mQPhr7FwzPcaih4xVHv0ys9cBWcn8ulH YDeK+rxA/eLlM6sL3jy8hskDWE6LvYpy52JgigImdhgUNSbFjkIb4gio8FnHRwyJ VgoHsmjXxnzIlvu5RCzYXzGwAIBemwSrkzcRPUuE0HBf7yVvYPKorjxSEJa2lGAV WAZkGn1ftEfWf/DtFBxTu/cjGLWoscEfT9yaJqWjayVMoVW3FO7yBUgdPTC0x18x d1QPhwZWSu1TyYzPs7t/jAvrxng2OpZyc2mxaUKyBjdr83Myz5FSin+6hhjP+36z MmAbahTxncjeyiyNdhweZJBGg2vGNCahTSbfc9+AxGa7c1WuhjYAmPKdAosvutPN 6VdE9Ty3QuIjsTlpqLuFMOnkMyTN1VjGtB7OO/TtH7LovNpAWp4= =HGVi -----END PGP SIGNATURE----- Merge tag 'locking_urgent_for_v6.16_rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip Pull locking fixes from Borislav Petkov: - Make sure the switch to the global hash is requested always under a lock so that two threads requesting that simultaneously cannot get to inconsistent state - Reject negative NUMA nodes earlier in the futex NUMA interface handling code - Selftests fixes * tag 'locking_urgent_for_v6.16_rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: futex: Verify under the lock if hash can be replaced futex: Handle invalid node numbers supplied by user selftests/futex: Set the home_node in futex_numa_mpol selftests/futex: getopt() requires int as return value.
This commit is contained in:
commit
aff2a7e23f
3 changed files with 20 additions and 6 deletions
|
@ -583,8 +583,8 @@ int get_futex_key(u32 __user *uaddr, unsigned int flags, union futex_key *key,
|
|||
if (futex_get_value(&node, naddr))
|
||||
return -EFAULT;
|
||||
|
||||
if (node != FUTEX_NO_NODE &&
|
||||
(node >= MAX_NUMNODES || !node_possible(node)))
|
||||
if ((node != FUTEX_NO_NODE) &&
|
||||
((unsigned int)node >= MAX_NUMNODES || !node_possible(node)))
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -1629,6 +1629,16 @@ again:
|
|||
mm->futex_phash_new = NULL;
|
||||
|
||||
if (fph) {
|
||||
if (cur && (!cur->hash_mask || cur->immutable)) {
|
||||
/*
|
||||
* If two threads simultaneously request the global
|
||||
* hash then the first one performs the switch,
|
||||
* the second one returns here.
|
||||
*/
|
||||
free = fph;
|
||||
mm->futex_phash_new = new;
|
||||
return -EBUSY;
|
||||
}
|
||||
if (cur && !new) {
|
||||
/*
|
||||
* If we have an existing hash, but do not yet have
|
||||
|
|
|
@ -144,7 +144,7 @@ int main(int argc, char *argv[])
|
|||
struct futex32_numa *futex_numa;
|
||||
int mem_size, i;
|
||||
void *futex_ptr;
|
||||
char c;
|
||||
int c;
|
||||
|
||||
while ((c = getopt(argc, argv, "chv:")) != -1) {
|
||||
switch (c) {
|
||||
|
@ -210,6 +210,10 @@ int main(int argc, char *argv[])
|
|||
ret = mbind(futex_ptr, mem_size, MPOL_BIND, &nodemask,
|
||||
sizeof(nodemask) * 8, 0);
|
||||
if (ret == 0) {
|
||||
ret = numa_set_mempolicy_home_node(futex_ptr, mem_size, i, 0);
|
||||
if (ret != 0)
|
||||
ksft_exit_fail_msg("Failed to set home node: %m, %d\n", errno);
|
||||
|
||||
ksft_print_msg("Node %d test\n", i);
|
||||
futex_numa->futex = 0;
|
||||
futex_numa->numa = FUTEX_NO_NODE;
|
||||
|
@ -220,8 +224,8 @@ int main(int argc, char *argv[])
|
|||
if (0)
|
||||
test_futex_mpol(futex_numa, 0);
|
||||
if (futex_numa->numa != i) {
|
||||
ksft_test_result_fail("Returned NUMA node is %d expected %d\n",
|
||||
futex_numa->numa, i);
|
||||
ksft_exit_fail_msg("Returned NUMA node is %d expected %d\n",
|
||||
futex_numa->numa, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -130,7 +130,7 @@ int main(int argc, char *argv[])
|
|||
pthread_mutexattr_t mutex_attr_pi;
|
||||
int use_global_hash = 0;
|
||||
int ret;
|
||||
char c;
|
||||
int c;
|
||||
|
||||
while ((c = getopt(argc, argv, "cghv:")) != -1) {
|
||||
switch (c) {
|
||||
|
|
Loading…
Add table
Reference in a new issue