@@ -208,16 +208,19 @@ pci_uio_map_resource_by_index(struct rte_pci_device *dev, int res_idx,
static int
pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
{
+ struct rte_pci_device_internal *pdev;
struct rte_pci_device *dev;
struct pci_bar_io bar;
unsigned i, max;
- dev = malloc(sizeof(*dev));
- if (dev == NULL) {
+ pdev = malloc(sizeof(*pdev));
+ if (pdev == NULL) {
+ RTE_LOG(ERR, EAL, "Cannot allocate memory for internal pci device\n");
return -1;
}
- memset(dev, 0, sizeof(*dev));
+ memset(pdev, 0, sizeof(*pdev));
+ dev = &pdev->device;
dev->device.bus = &rte_pci_bus.bus;
dev->addr.domain = conf->pc_sel.pc_domain;
@@ -303,7 +306,7 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
memmove(dev2->mem_resource,
dev->mem_resource,
sizeof(dev->mem_resource));
- pci_free(dev);
+ pci_free(pdev);
}
return 0;
}
@@ -313,7 +316,7 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
return 0;
skipdev:
- pci_free(dev);
+ pci_free(pdev);
return 0;
}
@@ -211,22 +211,26 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr *addr)
{
char filename[PATH_MAX];
unsigned long tmp;
+ struct rte_pci_device_internal *pdev;
struct rte_pci_device *dev;
char driver[PATH_MAX];
int ret;
- dev = malloc(sizeof(*dev));
- if (dev == NULL)
+ pdev = malloc(sizeof(*pdev));
+ if (pdev == NULL) {
+ RTE_LOG(ERR, EAL, "Cannot allocate memory for internal pci device\n");
return -1;
+ }
- memset(dev, 0, sizeof(*dev));
+ memset(pdev, 0, sizeof(*pdev));
+ dev = &pdev->device;
dev->device.bus = &rte_pci_bus.bus;
dev->addr = *addr;
/* get vendor id */
snprintf(filename, sizeof(filename), "%s/vendor", dirname);
if (eal_parse_sysfs_value(filename, &tmp) < 0) {
- pci_free(dev);
+ pci_free(pdev);
return -1;
}
dev->id.vendor_id = (uint16_t)tmp;
@@ -234,7 +238,7 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr *addr)
/* get device id */
snprintf(filename, sizeof(filename), "%s/device", dirname);
if (eal_parse_sysfs_value(filename, &tmp) < 0) {
- pci_free(dev);
+ pci_free(pdev);
return -1;
}
dev->id.device_id = (uint16_t)tmp;
@@ -243,7 +247,7 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr *addr)
snprintf(filename, sizeof(filename), "%s/subsystem_vendor",
dirname);
if (eal_parse_sysfs_value(filename, &tmp) < 0) {
- pci_free(dev);
+ pci_free(pdev);
return -1;
}
dev->id.subsystem_vendor_id = (uint16_t)tmp;
@@ -252,7 +256,7 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr *addr)
snprintf(filename, sizeof(filename), "%s/subsystem_device",
dirname);
if (eal_parse_sysfs_value(filename, &tmp) < 0) {
- pci_free(dev);
+ pci_free(pdev);
return -1;
}
dev->id.subsystem_device_id = (uint16_t)tmp;
@@ -261,7 +265,7 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr *addr)
snprintf(filename, sizeof(filename), "%s/class",
dirname);
if (eal_parse_sysfs_value(filename, &tmp) < 0) {
- pci_free(dev);
+ pci_free(pdev);
return -1;
}
/* the least 24 bits are valid: class, subclass, program interface */
@@ -297,7 +301,7 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr *addr)
snprintf(filename, sizeof(filename), "%s/resource", dirname);
if (pci_parse_sysfs_resource(filename, dev) < 0) {
RTE_LOG(ERR, EAL, "%s(): cannot parse resource\n", __func__);
- pci_free(dev);
+ pci_free(pdev);
return -1;
}
@@ -306,7 +310,7 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr *addr)
ret = pci_get_kernel_driver_by_path(filename, driver, sizeof(driver));
if (ret < 0) {
RTE_LOG(ERR, EAL, "Fail to get kernel driver\n");
- pci_free(dev);
+ pci_free(pdev);
return -1;
}
@@ -320,7 +324,7 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr *addr)
else
dev->kdrv = RTE_PCI_KDRV_UNKNOWN;
} else {
- pci_free(dev);
+ pci_free(pdev);
return 0;
}
/* device is valid, add in list (sorted) */
@@ -375,7 +379,7 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr *addr)
pci_common_set(dev2);
}
}
- pci_free(dev);
+ pci_free(pdev);
}
return 0;
}
@@ -121,12 +121,12 @@ pci_common_set(struct rte_pci_device *dev)
}
void
-pci_free(struct rte_pci_device *dev)
+pci_free(struct rte_pci_device_internal *pdev)
{
- if (dev == NULL)
+ if (pdev == NULL)
return;
- free(dev->bus_info);
- free(dev);
+ free(pdev->device.bus_info);
+ free(pdev);
}
/* map a particular resource from a file */
@@ -465,7 +465,7 @@ pci_cleanup(void)
rte_intr_instance_free(dev->vfio_req_intr_handle);
dev->vfio_req_intr_handle = NULL;
- pci_free(dev);
+ pci_free(RTE_PCI_DEVICE_INTERNAL(dev));
}
return error;
@@ -681,7 +681,7 @@ pci_unplug(struct rte_device *dev)
if (ret == 0) {
rte_pci_remove_device(pdev);
rte_devargs_remove(dev->devargs);
- pci_free(pdev);
+ pci_free(RTE_PCI_DEVICE_INTERNAL(pdev));
}
return ret;
}
@@ -13,6 +13,14 @@
#include <rte_os_shim.h>
#include <rte_pci.h>
+/*
+ * Convert struct rte_pci_device to struct rte_pci_device_internal
+ */
+#define RTE_PCI_DEVICE_INTERNAL(ptr) \
+ container_of(ptr, struct rte_pci_device_internal, device)
+#define RTE_PCI_DEVICE_INTERNAL_CONST(ptr) \
+ container_of(ptr, const struct rte_pci_device_internal, device)
+
/**
* Structure describing the PCI bus
*/
@@ -34,6 +42,10 @@ extern struct rte_pci_bus rte_pci_bus;
struct rte_pci_driver;
struct rte_pci_device;
+struct rte_pci_device_internal {
+ struct rte_pci_device device;
+};
+
/**
* Scan the content of the PCI bus, and the devices in the devices
* list
@@ -53,7 +65,7 @@ pci_common_set(struct rte_pci_device *dev);
* Free a PCI device.
*/
void
-pci_free(struct rte_pci_device *dev);
+pci_free(struct rte_pci_device_internal *pdev);
/**
* Validate whether a device with given PCI address should be ignored or not.