Commit f3a63a71 authored by Michael Reese's avatar Michael Reese

sdb: dont leak memory when using static sdb tables

parent bb41553a
......@@ -243,39 +243,26 @@ struct sdb_static_crossbar* sdb_static_crossbar_from_file(const char* filename_p
return sdb_static_crossbar_from_file_real(filename_prefix, sdb_addr, 0);
}
// struct sdb_device* sdb_static_find_by_identity(struct sdb_static_crossbar *crossbar, uint64_t vendor_id, uint32_t device_id) {
// for (int i = 0; i < crossbar->num_records; ++i) {
// printf("sdb_static_find_by_identity record[%d].type = %x\n", i, crossbar->records[i].device.sdb_component.product.record_type);
// if (crossbar->records[i].device.sdb_component.product.vendor_id == vendor_id &&
// crossbar->records[i].device.sdb_component.product.device_id == device_id &&
// crossbar->records[i].device.sdb_component.product.record_type == 0x01) {
// // correct device found
// struct sdb_device *result = &crossbar->records[i].device;
// return result;
// } else if (crossbar->records[i].device.sdb_component.product.record_type == 0x02) {
// // bridge found
// struct sdb_static_crossbar * child = (struct sdb_static_crossbar*)crossbar->records[i].bridge.sdb_child;
// struct sdb_device *result = sdb_static_find_by_identity(child, vendor_id, device_id);
// if (result) {
// return result;
// }
// }
// }
// return NULL;
// }
void sdb_static_crossbar_free(struct sdb_static_crossbar* crossbar) {
// look for nested crossbars and free them recursively
for (int i = 0; i < crossbar->num_records; ++i) {
if (crossbar->records[i].device.sdb_component.product.record_type == 0x02) {
// bridge found, free underlying crossbar
struct sdb_static_crossbar* child = (struct sdb_static_crossbar*)crossbar->records[i].bridge.sdb_child;
sdb_static_crossbar_free(child);
}
}
free(crossbar);
}
eb_status_t sdb_static_find_by_identity(struct sdb_static_crossbar *crossbar, uint64_t vendor_id, uint32_t device_id, struct sdb_device *output, int *devices) {
int capacity = *devices;
*devices = 0;
for (int i = 0; i < crossbar->num_records; ++i) {
// printf("sdb_find_by_identity record[%d].type = %x\n", i, crossbar->records[i].device.sdb_component.product.record_type);
if (crossbar->records[i].device.sdb_component.product.vendor_id == vendor_id &&
crossbar->records[i].device.sdb_component.product.device_id == device_id &&
crossbar->records[i].device.sdb_component.product.record_type == 0x01) {
// correct device found
// printf("found device capacity = %d *devices = %d\n", capacity, *devices);
if (capacity > 0) {
*output = crossbar->records[i].device;
// print_sdb_device(crossbar->records[i].device);
......@@ -289,7 +276,6 @@ eb_status_t sdb_static_find_by_identity(struct sdb_static_crossbar *crossbar, ui
// call the function with the output pointer moved forward by the number of already found devices
int capacity_recursive = capacity;
sdb_static_find_by_identity(child, vendor_id, device_id, output, &capacity_recursive);
// printf("found %d devices in recursive call\n", capacity_recursive);
// capacity contains number of devices found after function call
*devices += capacity_recursive;
}
......@@ -304,10 +290,8 @@ eb_status_t sdb_static_find_by_identity_msi(struct sdb_static_crossbar *crossbar
// in order to find msi_first and msi_last, just take sdb_componnen.addr_fist and
// sdb_component.addr_last from the first .msi record found... don't know if that is always correct...
for (int i = 0; i < crossbar->num_records; ++i) {
// printf("sdb_find_by_identity record[%d].type = %x\n", i, crossbar->records[i].device.sdb_component.product.record_type);
if (crossbar->records[i].device.sdb_component.product.record_type == 0x03) {
// correct device found
// printf("found device capacity = %d *devices = %d\n", capacity, *devices);
msi_first = crossbar->records[i].msi.sdb_component.addr_first;
msi_last = crossbar->records[i].msi.sdb_component.addr_last;
break;
......
......@@ -40,6 +40,7 @@ struct sdb_static_crossbar {
};
EB_PRIVATE struct sdb_static_crossbar* sdb_static_crossbar_from_file(const char* filename_prefix, uint32_t sdb_addr);
EB_PRIVATE void sdb_static_crossbar_free(struct sdb_static_crossbar* crossbar);
EB_PRIVATE eb_status_t sdb_static_find_by_identity(struct sdb_static_crossbar *crossbar, uint64_t vendor_id, uint32_t device_id, struct sdb_device *output, int *devices);
EB_PRIVATE eb_status_t sdb_static_find_by_identity_msi(struct sdb_static_crossbar *crossbar, uint64_t vendor_id, uint32_t device_id, struct sdb_device *output, eb_address_t* output_msi_first, eb_address_t* output_msi_last, int *devices);
......
......@@ -858,10 +858,11 @@ eb_status_t eb_sdb_find_by_identity_msi(eb_device_t device, uint64_t vendor_id,
if (sdb_static_base_addr != NULL) {
sscanf(sdb_static_base_addr, "%lx", &base_addr);
}
// leak!!
struct sdb_static_crossbar *sdb_crossbar = sdb_static_crossbar_from_file(sdb_static_base_name, base_addr);
// call static version of sdb_find_by_identity_msi
return sdb_static_find_by_identity_msi(sdb_crossbar, vendor_id, device_id, output, output_msi_first, output_msi_last, devices);
eb_status_t result = sdb_static_find_by_identity_msi(sdb_crossbar, vendor_id, device_id, output, output_msi_first, output_msi_last, devices);
sdb_static_crossbar_free(sdb_crossbar);
return result;
}
return eb_sdb_find_by_identity_real(device, vendor_id, device_id, 0, 0, 0, output, output_msi_first, output_msi_last, devices, *devices);
}
......@@ -874,10 +875,11 @@ eb_status_t eb_sdb_find_by_identity(eb_device_t device, uint64_t vendor_id, uint
if (sdb_static_base_addr != NULL) {
sscanf(sdb_static_base_addr, "%lx", &base_addr);
}
// leak!!
struct sdb_static_crossbar *sdb_crossbar = sdb_static_crossbar_from_file(sdb_static_base_name, base_addr);
// call static version of sdb_find_by_identity
return sdb_static_find_by_identity(sdb_crossbar, vendor_id, device_id, output, devices);
eb_status_t result = sdb_static_find_by_identity(sdb_crossbar, vendor_id, device_id, output, devices);
sdb_static_crossbar_free(sdb_crossbar);
return result;
}
return eb_sdb_find_by_identity_real(device, vendor_id, device_id, 0, 0, 0, output, 0, 0, devices, 0);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment