mirror of
git://sourceware.org/git/glibc.git
synced 2025-01-18 12:16:13 +08:00
affinity-inheritance: Overallocate CPU sets
Some kernels on S390 appear to return a CPU affinity mask based on configured processors rather than the ones online. Overallocate the CPU set to match that, but operate only on the ones online. Signed-off-by: Siddhesh Poyarekar <siddhesh@sourceware.org> Co-authored-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
This commit is contained in:
parent
2ac7701888
commit
09ea1afec7
@ -34,10 +34,11 @@ set_my_affinity (size_t size, const cpu_set_t *set)
|
||||
}
|
||||
|
||||
static void
|
||||
verify_my_affinity (int nproc, size_t size, const cpu_set_t *expected_set)
|
||||
verify_my_affinity (int nproc, int nproc_configured, size_t size,
|
||||
const cpu_set_t *expected_set)
|
||||
{
|
||||
cpu_set_t *set = CPU_ALLOC (nproc);
|
||||
cpu_set_t *xor_set = CPU_ALLOC (nproc);
|
||||
cpu_set_t *set = CPU_ALLOC (nproc_configured);
|
||||
cpu_set_t *xor_set = CPU_ALLOC (nproc_configured);
|
||||
|
||||
if (set == NULL || xor_set== NULL)
|
||||
FAIL_EXIT1 ("verify_my_affinity: Failed to allocate cpuset: %m\n");
|
||||
|
@ -42,6 +42,7 @@
|
||||
struct test_param
|
||||
{
|
||||
int nproc;
|
||||
int nproc_configured;
|
||||
cpu_set_t *set;
|
||||
size_t size;
|
||||
bool entry;
|
||||
@ -70,7 +71,8 @@ child_test (void *arg)
|
||||
struct test_param *param = arg;
|
||||
|
||||
printf ("%d:%d child\n", getpid (), gettid ());
|
||||
verify_my_affinity (param->nproc, param->size, param->set);
|
||||
verify_my_affinity (param->nproc, param->nproc_configured, param->size,
|
||||
param->set);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -93,7 +95,8 @@ do_one_test (void *arg)
|
||||
else
|
||||
{
|
||||
/* Verification for the first level. */
|
||||
verify_my_affinity (param->nproc, param->size, param->set);
|
||||
verify_my_affinity (param->nproc, param->nproc_configured, param->size,
|
||||
param->set);
|
||||
|
||||
/* Launch the second level test, launching CHILD_TEST as a subprocess and
|
||||
then as a subthread. Use a different mask to see if it gets
|
||||
@ -129,13 +132,17 @@ do_one_test (void *arg)
|
||||
static int
|
||||
do_test (void)
|
||||
{
|
||||
/* Large enough in case the kernel decides to return the larger mask. This
|
||||
seems to happen on some kernels for S390x. */
|
||||
int num_configured_cpus = get_nprocs_conf ();
|
||||
int num_cpus = get_nprocs ();
|
||||
|
||||
struct test_param param =
|
||||
{
|
||||
.nproc = num_cpus,
|
||||
.set = CPU_ALLOC (num_cpus),
|
||||
.size = CPU_ALLOC_SIZE (num_cpus),
|
||||
.nproc_configured = num_configured_cpus,
|
||||
.set = CPU_ALLOC (num_configured_cpus),
|
||||
.size = CPU_ALLOC_SIZE (num_configured_cpus),
|
||||
.entry = true,
|
||||
};
|
||||
|
||||
|
@ -34,10 +34,11 @@ set_my_affinity (size_t size, const cpu_set_t *set)
|
||||
}
|
||||
|
||||
static void
|
||||
verify_my_affinity (int nproc, size_t size, const cpu_set_t *expected_set)
|
||||
verify_my_affinity (int nproc, int nproc_configured, size_t size,
|
||||
const cpu_set_t *expected_set)
|
||||
{
|
||||
cpu_set_t *set = CPU_ALLOC (nproc);
|
||||
cpu_set_t *xor_set = CPU_ALLOC (nproc);
|
||||
cpu_set_t *set = CPU_ALLOC (nproc_configured);
|
||||
cpu_set_t *xor_set = CPU_ALLOC (nproc_configured);
|
||||
|
||||
if (set == NULL || xor_set== NULL)
|
||||
FAIL_EXIT1 ("verify_my_affinity: Failed to allocate cpuset: %m\n");
|
||||
|
Loading…
Reference in New Issue
Block a user