2022-04-26 00:50 (UTC-0700), Tyler Retzlaff:
> Implement functions for getting/setting thread affinity.
> Threads can be pinned to specific cores by setting their
> affinity attribute.
> 
> Windows error codes are translated to errno-style error codes.
> The possible return values are chosen so that we have as
> much semantic compatibility between platforms as possible.
> 
> note: convert_cpuset_to_affinity has a limitation that all cpus of
> the set belong to the same processor group.
> 
> Signed-off-by: Narcisa Vasile <navas...@microsoft.com>
> Signed-off-by: Tyler Retzlaff <roret...@linux.microsoft.com>

Acked-by: Dmitry Kozlyuk <dmitry.kozl...@gmail.com>
with two minor issues below.

> +static int
> +eal_query_group_affinity(void)
> +{
> +     SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *infos = NULL;
> +     unsigned int *cpu_count = &cpu_map.cpu_count;
> +     DWORD infos_size = 0;
> +     int ret = 0;
> +     USHORT group_count;
> +     KAFFINITY affinity;
> +     USHORT group_no;
> +     unsigned int i;
> +
> +     if (!GetLogicalProcessorInformationEx(RelationGroup, NULL,
> +                     &infos_size)) {
> +             DWORD error = GetLastError();
> +             if (error != ERROR_INSUFFICIENT_BUFFER) {
> +                     log_early("Cannot get group information size, error 
> %lu\n", error);

This code is now called not only at initialization,
but also after the logging is set up,
in which case this line will not go into a redirected destination.

I think there should not be log_early() at all in EAL,
rte_log() could work from the very beginning.
We're not in the kernel, stderr is available at once.

So I would work around with a static flag maybe.

[...]
> +static int
> +convert_cpuset_to_affinity(const rte_cpuset_t *cpuset,
> +             PGROUP_AFFINITY affinity)
> +{
> +     int ret = 0;
> +     PGROUP_AFFINITY cpu_affinity = NULL;
> +     unsigned int cpu_idx;
> +
> +     memset(affinity, 0, sizeof(GROUP_AFFINITY));
> +     affinity->Group = (USHORT)-1;
> +
> +     /* Check that all cpus of the set belong to the same processor group and
> +      * accumulate thread affinity to be applied.
> +      */
> +     for (cpu_idx = 0; cpu_idx < CPU_SETSIZE; cpu_idx++) {
> +             if (!CPU_ISSET(cpu_idx, cpuset))
> +                     continue;
> +
> +             cpu_affinity = eal_get_cpu_affinity(cpu_idx);
> +
> +             if (affinity->Group == (USHORT)-1) {
> +                     affinity->Group = cpu_affinity->Group;
> +             } else if (affinity->Group != cpu_affinity->Group) {
> +                     ret = ENOTSUP;

Maybe worth a dedug log because the limitation is non-obvious.

Reply via email to