static int nodeDeviceSysfsGetPCISRIOVCaps(const char *sysfsPath, virNodeDevCapDataPtr data) { size_t i; int ret; /* this could be a refresh, so clear out the old data */ for (i = 0; i < data->pci_dev.num_virtual_functions; i++) VIR_FREE(data->pci_dev.virtual_functions[i]); VIR_FREE(data->pci_dev.virtual_functions); data->pci_dev.num_virtual_functions = 0; data->pci_dev.flags &= ~VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION; data->pci_dev.flags &= ~VIR_NODE_DEV_CAP_FLAG_PCI_PHYSICAL_FUNCTION; if (!virPCIGetPhysicalFunction(sysfsPath, &data->pci_dev.physical_function)) data->pci_dev.flags |= VIR_NODE_DEV_CAP_FLAG_PCI_PHYSICAL_FUNCTION; ret = virPCIGetVirtualFunctions(sysfsPath, &data->pci_dev.virtual_functions, &data->pci_dev.num_virtual_functions); if (ret < 0) return ret; if (data->pci_dev.num_virtual_functions > 0) data->pci_dev.flags |= VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION; return ret; }
static int gather_pci_cap(LibHalContext *ctx, const char *udi, union _virNodeDevCapData *d) { char *sysfs_path; if (get_str_prop(ctx, udi, "pci.linux.sysfs_path", &sysfs_path) == 0) { char *p = strrchr(sysfs_path, '/'); if (p) { (void)virStrToLong_ui(p+1, &p, 16, &d->pci_dev.domain); (void)virStrToLong_ui(p+1, &p, 16, &d->pci_dev.bus); (void)virStrToLong_ui(p+1, &p, 16, &d->pci_dev.slot); (void)virStrToLong_ui(p+1, &p, 16, &d->pci_dev.function); } if (!virPCIGetPhysicalFunction(sysfs_path, &d->pci_dev.physical_function)) d->pci_dev.flags |= VIR_NODE_DEV_CAP_FLAG_PCI_PHYSICAL_FUNCTION; int ret = virPCIGetVirtualFunctions(sysfs_path, &d->pci_dev.virtual_functions, &d->pci_dev.num_virtual_functions); if (ret < 0) { VIR_FREE(sysfs_path); return -1; } if (d->pci_dev.num_virtual_functions > 0) d->pci_dev.flags |= VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION; VIR_FREE(sysfs_path); } (void)get_int_prop(ctx, udi, "pci.vendor_id", (int *)&d->pci_dev.vendor); if (get_str_prop(ctx, udi, "pci.vendor", &d->pci_dev.vendor_name) != 0) (void)get_str_prop(ctx, udi, "info.vendor", &d->pci_dev.vendor_name); (void)get_int_prop(ctx, udi, "pci.product_id", (int *)&d->pci_dev.product); if (get_str_prop(ctx, udi, "pci.product", &d->pci_dev.product_name) != 0) (void)get_str_prop(ctx, udi, "info.product", &d->pci_dev.product_name); return 0; }