In multi-socket systems, it's useful to see which node a particular
PCI device belongs to. Linux provides this information through sysfs,
but some users don't like poking through sysfs themselves to find it,
and it's pretty straightforward to report it in lspci.
I should note that when there is no NUMA node for a particular device,
Linux reports -1. I've chosen to continue that convention in pciutils,
and simply omit the information if the device does not belong to a NUMA
node (eg on single-socket systems, or devices which are not preferentially
attached to a particular node, like Nehalem-based systems).
d->access = a;
d->methods = a->methods;
d->hdrtype = -1;
+ d->numa_node = -1;
if (d->methods->init_dev)
d->methods->init_dev(d);
return d;
u16 vendor_id, device_id; /* Identity of the device */
u16 device_class; /* PCI device class */
int irq; /* IRQ number */
+ int numa_node; /* NUMA node */
pciaddr_t base_addr[6]; /* Base addresses including flags in lower bits */
pciaddr_t size[6]; /* Region sizes */
pciaddr_t rom_base_addr; /* Expansion ROM base address */
{
sysfs_get_resources(d);
d->irq = sysfs_get_value(d, "irq");
+ d->numa_node = sysfs_get_value(d, "numa_node");
/*
* We could read these faster from the config registers, but we want to give
* the kernel a chance to fix up ID's and especially classes of broken devices.
printf(", latency %d", latency);
if (irq)
printf(", IRQ " PCIIRQ_FMT, irq);
+ if (p->numa_node != -1)
+ printf(", NUMA node %d", p->numa_node);
putchar('\n');
}