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

William Tu u9012063 at gmail.com
Fri Sep 13 17:15:31 UTC 2019


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.

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));
+    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));
+        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