[ovs-dev] [PATCH] netdev-afxdp: Detect numa node id.

Eelco Chaudron echaudro at redhat.com
Thu Sep 26 12:18:15 UTC 2019



On 13 Sep 2019, at 19:15, William Tu wrote:

> The patch detects the numa node id from the name of the netdev,
> by reading the '/sys/class/net/<devname>/device/numa_node'.
> If not available, ex: virtual device, or any error happens,
> return numa id 0.

See comments below, but I think the main problem that should be fixed is 
allocating the memory pool on the correct numa.
So replacing the xmalloc_pagealign() in xsk_configure() with something 
that is numa aware like numa_alloc_onnode().
numa_alloc_onnode() will require libnuma.

Also, you might need to update the “Limitations/Known Issues” 
section in the afxdp.rst file.

> Signed-off-by: William Tu <u9012063 at gmail.com>
> ---
>  lib/netdev-afxdp.c | 38 +++++++++++++++++++++++++++++++++-----
>  1 file changed, 33 insertions(+), 5 deletions(-)
>
> diff --git a/lib/netdev-afxdp.c b/lib/netdev-afxdp.c
> index e5b058d08a09..a94d77468cb7 100644
> --- a/lib/netdev-afxdp.c
> +++ b/lib/netdev-afxdp.c
> @@ -552,11 +552,39 @@ out:
>  int
>  netdev_afxdp_get_numa_id(const struct netdev *netdev)
>  {
> -    /* FIXME: Get netdev's PCIe device ID, then find
> -     * its NUMA node id.
> -     */
> -    VLOG_INFO("FIXME: Device %s always use numa id 0.",
> -              netdev_get_name(netdev));
> +    const char *numa_node_path;
> +    long int node_id;
> +    char buffer[4];
> +    FILE *stream;
> +    int n;
> +
> +    numa_node_path = xasprintf("/sys/class/net/%s/device/numa_node",
> +                               netdev_get_name(netdev));

numa_node_path gets allocated by xasprintf() but it’s never free’ed.

> +    stream = fopen(numa_node_path, "r");
> +    if (!stream) {
> +        /* Virtual device does not have this info. */
> +        VLOG_WARN_RL(&rl, "Open %s failed: %s, use numa_id 0",
> +                     numa_node_path, ovs_strerror(errno));

Should this be a INFO? Nothing we can do about it for virtual 
interfaces.

> +        return 0;
> +    }
> +
> +    n = fread(buffer, 1, sizeof buffer, stream);
> +    if (!n) {
> +        goto error;
> +    }
> +
> +    node_id = strtol(buffer, NULL, 10);
> +    if (node_id < 0 || node_id > 2) {
> +        goto error;
> +    }
> +
> +    fclose(stream);
> +    return (int)node_id;
> +
> +error:
> +    VLOG_WARN_RL(&rl, "Error detecting numa node of %s, use numa_id 
> 0",
> +                 numa_node_path);
> +    fclose(stream);
>      return 0;
>  }
>
> -- 
> 2.7.4


More information about the dev mailing list