1 // SPDX-License-Identifier: GPL-2.0 2 #include <err.h> 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <sys/prctl.h> 6 7 #include "futex.h" 8 9 #ifndef PR_FUTEX_HASH 10 #define PR_FUTEX_HASH 78 11 # define PR_FUTEX_HASH_SET_SLOTS 1 12 # define PR_FUTEX_HASH_GET_SLOTS 2 13 #endif // PR_FUTEX_HASH 14 15 void futex_set_nbuckets_param(struct bench_futex_parameters *params) 16 { 17 int ret; 18 19 if (params->nbuckets < 0) 20 return; 21 22 ret = prctl(PR_FUTEX_HASH, PR_FUTEX_HASH_SET_SLOTS, params->nbuckets, 0); 23 if (ret) { 24 printf("Requesting %d hash buckets failed: %d/%m\n", 25 params->nbuckets, ret); 26 err(EXIT_FAILURE, "prctl(PR_FUTEX_HASH)"); 27 } 28 } 29 30 void futex_print_nbuckets(struct bench_futex_parameters *params) 31 { 32 char *futex_hash_mode; 33 int ret; 34 35 ret = prctl(PR_FUTEX_HASH, PR_FUTEX_HASH_GET_SLOTS); 36 if (params->nbuckets >= 0) { 37 if (ret != params->nbuckets) { 38 if (ret < 0) { 39 printf("Can't query number of buckets: %m\n"); 40 err(EXIT_FAILURE, "prctl(PR_FUTEX_HASH)"); 41 } 42 printf("Requested number of hash buckets does not currently used.\n"); 43 printf("Requested: %d in usage: %d\n", params->nbuckets, ret); 44 err(EXIT_FAILURE, "prctl(PR_FUTEX_HASH)"); 45 } 46 if (params->nbuckets == 0) 47 ret = asprintf(&futex_hash_mode, "Futex hashing: global hash"); 48 else 49 ret = asprintf(&futex_hash_mode, "Futex hashing: %d hash buckets", 50 params->nbuckets); 51 } else { 52 if (ret <= 0) { 53 ret = asprintf(&futex_hash_mode, "Futex hashing: global hash"); 54 } else { 55 ret = asprintf(&futex_hash_mode, "Futex hashing: auto resized to %d buckets", 56 ret); 57 } 58 } 59 if (ret < 0) 60 err(EXIT_FAILURE, "ENOMEM, futex_hash_mode"); 61 printf("%s\n", futex_hash_mode); 62 free(futex_hash_mode); 63 } 64