Skip to contentSkip to conversation

acpi/apei: free lists of resources in einj and erst

PATCH In review Konstantin Khlebnikov 3 participants 3 messages Jul 10, 2015 – Jul 13, 2015

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 acpi/apei: free lists of resources in einj and erst

This patch adds missing apei_resources_fini and
plugs several tiny memory leaks.

---
 drivers/acpi/apei/apei-base.c |    2 ++
 drivers/acpi/apei/einj.c      |    7 +++----
 drivers/acpi/apei/erst.c      |    1 +
 3 files changed, 6 insertions(+), 4 deletions(-)
drivers/acpi/apei/apei-base.c +2 -0
index a85ac07f3da3..b9a5418e6938 100644
@@ -497,6 +497,7 @@ int apei_resources_request(struct apei_resources *resources,
 	rc = apei_resources_sub(resources, &nvs_resources);
 	if (rc)
 		goto nvs_res_fini;
+	apei_resources_fini(&nvs_resources);
 
 	if (arch_apei_filter_addr) {
 		apei_resources_init(&arch_res);
@@ -506,6 +507,7 @@ int apei_resources_request(struct apei_resources *resources,
 		rc = apei_resources_sub(resources, &arch_res);
 		if (rc)
 			goto arch_res_fini;
+		apei_resources_fini(&arch_res);
 	}
 
 	rc = -EINVAL;
drivers/acpi/apei/einj.c +3 -4
index a095d4f858da..ed02d9da4a3e 100644
@@ -379,10 +379,9 @@ static int __einj_error_trigger(u64 trigger_paddr, u32 type,
 			rc = apei_resources_add(&addr_resources,
 				trigger_param_region->address,
 				trigger_param_region->bit_width/8, true);
-			if (rc)
-				goto out_fini;
-			rc = apei_resources_sub(&trigger_resources,
-					&addr_resources);
+			if (!rc)
+				rc = apei_resources_sub(&trigger_resources,
+							&addr_resources);
 		}
 		apei_resources_fini(&addr_resources);
 		if (rc)
drivers/acpi/apei/erst.c +1 -0
index 3670bbab57a3..41ceeae3f6aa 100644
@@ -1190,6 +1190,7 @@ static int __init erst_init(void)
 	if (!erst_erange.vaddr)
 		goto err_release_erange;
 
+	apei_resources_fini(&erst_resources);
 	pr_info(
 	"Error Record Serialization Table (ERST) support is initialized.\n");
 
reviewer
#1 lore raw
drivers/acpi/apei/einj.c +3 -4
@@ -379,10 +379,9 @@ static int __einj_error_trigger(u64 trigger_paddr, u32 type,
 			rc = apei_resources_add(&addr_resources,
 				trigger_param_region->address,
 				trigger_param_region->bit_width/8, true);
-			if (rc)
-				goto out_fini;
-			rc = apei_resources_sub(&trigger_resources,
-					&addr_resources);
+			if (!rc)
+				rc = apei_resources_sub(&trigger_resources,
+							&addr_resources);
 		}
 		apei_resources_fini(&addr_resources);
 		if (rc)

This bit looks wrong ... the line right after the this diff ends is

			goto out_fini;

so we'll call apei_resources_fini() twice in the rc!=0 case.

-Tony

#2 lore raw
Quoted 17 lines · Tony
drivers/acpi/apei/einj.c +3 -4
@@ -379,10 +379,9 @@ static int __einj_error_trigger(u64 trigger_paddr, u32 type,
                        rc = apei_resources_add(&addr_resources,
                                trigger_param_region->address,
                                trigger_param_region->bit_width/8, true);
-                       if (rc)
-                               goto out_fini;
-                       rc = apei_resources_sub(&trigger_resources,
-                                       &addr_resources);
+                       if (!rc)
+                               rc = apei_resources_sub(&trigger_resources,
+                                                       &addr_resources);
                }
                apei_resources_fini(&addr_resources);
                if (rc)
Quoted 4 lines

This bit looks wrong ... the line right after the this diff ends is

                        goto out_fini;

so we'll call apei_resources_fini() twice in the rc!=0 case.

As I see it frees different struct apei_resources: here addr_resources and trigger_resources at the out_fini.

Anyway calling apei_resources_fini twice is safe: it removes and frees ranges from lists. If these lists are empty apei_resources_fini does nothing.

Quoted 2 lines

-Tony