以编程方式确定 NUMA 节点或 PCI 总线、设备、通用 PCI 设备的功能编号

Posted

技术标签:

【中文标题】以编程方式确定 NUMA 节点或 PCI 总线、设备、通用 PCI 设备的功能编号【英文标题】:Programmatically determine NUMA node or PCI bus, device, function number of generic PCI device 【发布时间】:2021-10-07 21:16:44 【问题描述】:

我几乎需要和Programmatically determine NUMA node or PCI bus, device, function number of Direct3D9Ex device一样的东西

我正在寻找一种以编程方式确定特定 PCI 设备连接到哪个 NUMA 节点的方法,以便我可以为该节点上的主机到设备传输分配内存。

因此,我的代码会打开一个设备文件,例如/dev/mydev0/dev/mydev1 等。我可以拥有其中的几个设备文件,它们可以位于不同的 NUMA 节点上。我需要弄清楚的是应用程序代码中该设备所属的NUMA节点(如果有)。

我正在为这些设备编写设备驱动程序。我了解device_create 返回的struct device 的指针具有该字段

#ifdef CONFIG_NUMA;
  int numa_node;
#endif;

我的想法是通过自定义驱动程序中的自定义 ioctl 调用导出该值。

我要问的是,是否有更标准的方法可以将 /dev 条目映射到 NUMA 节点,以便 应用程序 可以解决这个问题并使用类似 numa_bind 这样的东西内存分配发生在正确的节点上。

我还了解到,我可以使用lspci 检查 PCI 设备的 NUMA 节点。根据/dev 条目,我不知道如何使用它。

谢谢!

【问题讨论】:

【参考方案1】:

Sysfs 来救援!假设你的设备是/dev/fb0,那么

$ cat  /sys/class/graphics/fb0/device/numa_node
0

会给你NUMA节点。

在文本模式下打开/sys/class/graphics/fb0/device/numa_node 并从中读取将产生"0\n"0x300x0A)。

【讨论】:

以上是关于以编程方式确定 NUMA 节点或 PCI 总线、设备、通用 PCI 设备的功能编号的主要内容,如果未能解决你的问题,请参考以下文章

是否有规范的编程方式来查询属于 NUMA 节点的核心集?

网络适​​配器 NUMA

lspci详解分析

linux驱动---用I/O命令访问PCI总线设备配置空间

计算机组成原理 — PCI-E 总线

了解Linux内核NUMA机制