|
@@ -125,12 +125,20 @@ acpi_memory_get_resource(struct acpi_resource *resource, void *context)
|
|
|
return AE_OK;
|
|
|
}
|
|
|
|
|
|
+static void
|
|
|
+acpi_memory_free_device_resources(struct acpi_memory_device *mem_device)
|
|
|
+{
|
|
|
+ struct acpi_memory_info *info, *n;
|
|
|
+
|
|
|
+ list_for_each_entry_safe(info, n, &mem_device->res_list, list)
|
|
|
+ kfree(info);
|
|
|
+ INIT_LIST_HEAD(&mem_device->res_list);
|
|
|
+}
|
|
|
+
|
|
|
static int
|
|
|
acpi_memory_get_device_resources(struct acpi_memory_device *mem_device)
|
|
|
{
|
|
|
acpi_status status;
|
|
|
- struct acpi_memory_info *info, *n;
|
|
|
-
|
|
|
|
|
|
if (!list_empty(&mem_device->res_list))
|
|
|
return 0;
|
|
@@ -138,9 +146,7 @@ acpi_memory_get_device_resources(struct acpi_memory_device *mem_device)
|
|
|
status = acpi_walk_resources(mem_device->device->handle, METHOD_NAME__CRS,
|
|
|
acpi_memory_get_resource, mem_device);
|
|
|
if (ACPI_FAILURE(status)) {
|
|
|
- list_for_each_entry_safe(info, n, &mem_device->res_list, list)
|
|
|
- kfree(info);
|
|
|
- INIT_LIST_HEAD(&mem_device->res_list);
|
|
|
+ acpi_memory_free_device_resources(mem_device);
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
@@ -363,6 +369,15 @@ static void acpi_memory_device_notify(acpi_handle handle, u32 event, void *data)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+static void acpi_memory_device_free(struct acpi_memory_device *mem_device)
|
|
|
+{
|
|
|
+ if (!mem_device)
|
|
|
+ return;
|
|
|
+
|
|
|
+ acpi_memory_free_device_resources(mem_device);
|
|
|
+ kfree(mem_device);
|
|
|
+}
|
|
|
+
|
|
|
static int acpi_memory_device_add(struct acpi_device *device)
|
|
|
{
|
|
|
int result;
|
|
@@ -427,7 +442,7 @@ static int acpi_memory_device_remove(struct acpi_device *device, int type)
|
|
|
if (result)
|
|
|
return result;
|
|
|
|
|
|
- kfree(mem_device);
|
|
|
+ acpi_memory_device_free(mem_device);
|
|
|
|
|
|
return 0;
|
|
|
}
|