diff options
author | Lin Ming <ming.m.lin@intel.com> | 2009-08-13 10:43:27 +0800 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2009-08-27 13:10:35 -0400 |
commit | a5fe1a03f7720b8da8364a1737e1e5a357904e99 (patch) | |
tree | 2b84668217bc55d8a3bb98d053e92ff93b34dd36 /include/acpi | |
parent | 422bef879e84104fee6dc68ded0e371dbeb5f88e (diff) | |
download | linux-a5fe1a03f7720b8da8364a1737e1e5a357904e99.tar.gz linux-a5fe1a03f7720b8da8364a1737e1e5a357904e99.tar.bz2 linux-a5fe1a03f7720b8da8364a1737e1e5a357904e99.zip |
ACPICA: fix leak of acpi_os_validate_address
http://bugzilla.kernel.org/show_bug.cgi?id=13620
If the dynamic region is created and added to resource list over and over again,
it has the potential to be a memory leak by growing the list every time.
This patch fixes the memory leak, as below
1) add a new field "count" to struct acpi_res_list.
When inserting, if the region(addr, len) is already in the resource
list, we just increase "count", otherwise, the region is inserted
with count=1.
When deleting, the "count" is decreased, if it's decreased to 0,
the region is deleted from the resource list.
With "count", the region with same address and length can only be
inserted to the resource list once, so prevent potential memory leak.
2) add a new function acpi_os_invalidate_address, which is called when
region is deleted.
Signed-off-by: Lin Ming <ming.m.lin@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'include/acpi')
-rw-r--r-- | include/acpi/acpiosxf.h | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/include/acpi/acpiosxf.h b/include/acpi/acpiosxf.h index ab0b85cf21f3..eb0e7189075f 100644 --- a/include/acpi/acpiosxf.h +++ b/include/acpi/acpiosxf.h @@ -245,6 +245,9 @@ acpi_status acpi_osi_invalidate(char* interface); acpi_status acpi_os_validate_address(u8 space_id, acpi_physical_address address, acpi_size length, char *name); +acpi_status +acpi_os_invalidate_address(u8 space_id, acpi_physical_address address, + acpi_size length); u64 acpi_os_get_timer(void); |