Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
E
EtherBone Core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
image/svg+xml
Discourse
Discourse
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Projects
EtherBone Core
Commits
f3a63a71
Commit
f3a63a71
authored
Sep 14, 2020
by
Michael Reese
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
sdb: dont leak memory when using static sdb tables
parent
bb41553a
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
18 additions
and
31 deletions
+18
-31
sdb-static.c
api/glue/sdb-static.c
+11
-27
sdb-static.h
api/glue/sdb-static.h
+1
-0
sdb.c
api/glue/sdb.c
+6
-4
No files found.
api/glue/sdb-static.c
View file @
f3a63a71
...
...
@@ -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
;
...
...
api/glue/sdb-static.h
View file @
f3a63a71
...
...
@@ -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
);
...
...
api/glue/sdb.c
View file @
f3a63a71
...
...
@@ -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
);
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment