ACPICA: Fix a long-standing bug in local cache
Since 20060317, the pointer to next object is the first element in its common header. Remove bogus LinkOffset from ACPI_MEMORY_LIST and directly use NextObject. Signed-off-by: Jung-uk Kim <jkim@FreeBSD.org> Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Lv Zheng <lv.zheng@intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
98b5c9934c
commit
3cf24497f4
|
@ -85,7 +85,6 @@ acpi_os_create_cache(char *cache_name,
|
||||||
/* Populate the cache object and return it */
|
/* Populate the cache object and return it */
|
||||||
|
|
||||||
ACPI_MEMSET(cache, 0, sizeof(struct acpi_memory_list));
|
ACPI_MEMSET(cache, 0, sizeof(struct acpi_memory_list));
|
||||||
cache->link_offset = 8;
|
|
||||||
cache->list_name = cache_name;
|
cache->list_name = cache_name;
|
||||||
cache->object_size = object_size;
|
cache->object_size = object_size;
|
||||||
cache->max_depth = max_depth;
|
cache->max_depth = max_depth;
|
||||||
|
@ -108,7 +107,7 @@ acpi_os_create_cache(char *cache_name,
|
||||||
|
|
||||||
acpi_status acpi_os_purge_cache(struct acpi_memory_list * cache)
|
acpi_status acpi_os_purge_cache(struct acpi_memory_list * cache)
|
||||||
{
|
{
|
||||||
char *next;
|
void *next;
|
||||||
acpi_status status;
|
acpi_status status;
|
||||||
|
|
||||||
ACPI_FUNCTION_ENTRY();
|
ACPI_FUNCTION_ENTRY();
|
||||||
|
@ -128,10 +127,9 @@ acpi_status acpi_os_purge_cache(struct acpi_memory_list * cache)
|
||||||
|
|
||||||
/* Delete and unlink one cached state object */
|
/* Delete and unlink one cached state object */
|
||||||
|
|
||||||
next = *(ACPI_CAST_INDIRECT_PTR(char,
|
next =
|
||||||
&(((char *)cache->
|
((struct acpi_object_common *)cache->list_head)->
|
||||||
list_head)[cache->
|
next_object;
|
||||||
link_offset])));
|
|
||||||
ACPI_FREE(cache->list_head);
|
ACPI_FREE(cache->list_head);
|
||||||
|
|
||||||
cache->list_head = next;
|
cache->list_head = next;
|
||||||
|
@ -221,9 +219,7 @@ acpi_os_release_object(struct acpi_memory_list * cache, void *object)
|
||||||
|
|
||||||
/* Put the object at the head of the cache list */
|
/* Put the object at the head of the cache list */
|
||||||
|
|
||||||
*(ACPI_CAST_INDIRECT_PTR(char,
|
((struct acpi_object_common *)object)->next_object =
|
||||||
&(((char *)object)[cache->
|
|
||||||
link_offset]))) =
|
|
||||||
cache->list_head;
|
cache->list_head;
|
||||||
cache->list_head = object;
|
cache->list_head = object;
|
||||||
cache->current_depth++;
|
cache->current_depth++;
|
||||||
|
@ -272,10 +268,8 @@ void *acpi_os_acquire_object(struct acpi_memory_list *cache)
|
||||||
/* There is an object available, use it */
|
/* There is an object available, use it */
|
||||||
|
|
||||||
object = cache->list_head;
|
object = cache->list_head;
|
||||||
cache->list_head = *(ACPI_CAST_INDIRECT_PTR(char,
|
cache->list_head =
|
||||||
&(((char *)
|
((struct acpi_object_common *)object)->next_object;
|
||||||
object)[cache->
|
|
||||||
link_offset])));
|
|
||||||
|
|
||||||
cache->current_depth--;
|
cache->current_depth--;
|
||||||
|
|
||||||
|
|
|
@ -1128,7 +1128,6 @@ struct acpi_memory_list {
|
||||||
u16 object_size;
|
u16 object_size;
|
||||||
u16 max_depth;
|
u16 max_depth;
|
||||||
u16 current_depth;
|
u16 current_depth;
|
||||||
u16 link_offset;
|
|
||||||
|
|
||||||
#ifdef ACPI_DBG_TRACK_ALLOCATIONS
|
#ifdef ACPI_DBG_TRACK_ALLOCATIONS
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue