[PATCH] tst-{pthread|sched}-affinity-inheritance: Only use online CPUs in affinity mask.

Florian Weimer fweimer@redhat.com
Thu Jan 22 17:27:47 GMT 2026


* Stefan Liebler:

> On s390x, the two tests are failing on a lpar with linux 6.18 booted with nosmt:
> FAIL:  misc/tst-sched-affinity-inheritance
> FAIL:  nptl/tst-pthread-affinity-inheritance
>
> Both tests were failing because they are claiming that the CPU affinity mask was
> not correctly inherited in the forked process/thread.
> The error already happened before forking, as the mask was set up to use
> CPUs 0-14 in set_cpu_mask().  But according to e.g. lscpu or the line
> "Cpus_allowed_list" in /proc/self/status, only the following CPUs were online:
> 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30
> while 1, 3, 5, ... were configured, but not online.
>
> Now the test first gets the current CPU mask at startup in do_test() and
> set_cpu_mask() only selects those online CPUs.

The “online” part is a bit confusing to me because I associated that
with /sys/devices/system/cpu/online.

Maybe “in-mask CPUs” is a good short alternative?

To be clear, checking the startup mask is the right thing to do.  I
think going to /sys and trying to pick up CPUs from there would be
confusing.

> diff --git a/nptl/tst-skeleton-affinity-inheritance.c b/nptl/tst-skeleton-affinity-inheritance.c
> index e1f328ae26..0910727cc3 100644
> --- a/nptl/tst-skeleton-affinity-inheritance.c
> +++ b/nptl/tst-skeleton-affinity-inheritance.c
> @@ -45,6 +45,7 @@ struct test_param
>    int nproc;
>    int nproc_configured;
>    cpu_set_t *set;
> +  cpu_set_t *set_at_startup;
>    size_t size;
>    bool entry;
>  };
> @@ -58,12 +59,53 @@ set_cpu_mask (struct test_param *param, bool entry)
>    if (entry && cpus > 1)
>      cpus--;
>  
> +  /* Only use CPUs which were online at start of the test process.  */
>    CPU_ZERO_S (param->size, param->set);
> -  while (cpus > 0)
> -    CPU_SET_S (--cpus, param->size, param->set);
> +  for (int cur = 0; cur < param->nproc_configured && cpus > 0; cur ++)
> +    {
> +      if (CPU_ISSET_S (cur, param->size, param->set_at_startup))
> +	{
> +	  CPU_SET_S (cur, param->size, param->set);
> +	  cpus --;
> +	}

Extra spaces: “cur ++“, “cpus --”

And I think the check against param->nproc_configured is not needed for
this loop.

> +static void
> +verify_my_affinity (int nproc_configured, size_t size,
> +		    const cpu_set_t *expected_set)
> +{
> +  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");

Missing space: “xor_set==”

Overall it looks okay to me, but I haven't tested it yet.

Thanks,
Florian



More information about the Libc-alpha mailing list