[PATCH v2 01/10] platform/x86: classmate-laptop: Address memory leaks on driver removal

From: Rafael J. Wysocki

Date: Mon May 11 2026 - 16:17:45 EST


From: "Rafael J. Wysocki" <rafael.j.wysocki@xxxxxxxxx>

Switch over cmpc_accel_add_v4() and cmpc_accel_add() to using
devm_kzalloc() for allocating the accel object which will cause it
to be freed automatically on device removal, so it won't be leaked
any more.

This also simplifies the rollback paths in these functions somewhat.

Fixes: 529aa8cb0a59 ("classmate-laptop: add support for Classmate PC ACPI devices")
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx>
---

v1 -> v2:
* Use devm_kzalloc() for allocating memory at probe time instead of adding
kfree() calls to remove callbacks.

---
drivers/platform/x86/classmate-laptop.c | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)

diff --git a/drivers/platform/x86/classmate-laptop.c b/drivers/platform/x86/classmate-laptop.c
index e6eed3d65580..a5fe34211afb 100644
--- a/drivers/platform/x86/classmate-laptop.c
+++ b/drivers/platform/x86/classmate-laptop.c
@@ -400,7 +400,7 @@ static int cmpc_accel_add_v4(struct acpi_device *acpi)
struct input_dev *inputdev;
struct cmpc_accel *accel;

- accel = kmalloc_obj(*accel);
+ accel = devm_kzalloc(&acpi->dev, sizeof(*accel), GFP_KERNEL);
if (!accel)
return -ENOMEM;

@@ -411,7 +411,7 @@ static int cmpc_accel_add_v4(struct acpi_device *acpi)

error = device_create_file(&acpi->dev, &cmpc_accel_sensitivity_attr_v4);
if (error)
- goto failed_sensitivity;
+ return error;

accel->g_select = CMPC_ACCEL_G_SELECT_DEFAULT;
cmpc_accel_set_g_select_v4(acpi->handle, accel->g_select);
@@ -434,8 +434,6 @@ static int cmpc_accel_add_v4(struct acpi_device *acpi)
device_remove_file(&acpi->dev, &cmpc_accel_g_select_attr_v4);
failed_g_select:
device_remove_file(&acpi->dev, &cmpc_accel_sensitivity_attr_v4);
-failed_sensitivity:
- kfree(accel);
return error;
}

@@ -650,7 +648,7 @@ static int cmpc_accel_add(struct acpi_device *acpi)
struct input_dev *inputdev;
struct cmpc_accel *accel;

- accel = kmalloc_obj(*accel);
+ accel = devm_kzalloc(&acpi->dev, sizeof(*accel), GFP_KERNEL);
if (!accel)
return -ENOMEM;

@@ -659,7 +657,7 @@ static int cmpc_accel_add(struct acpi_device *acpi)

error = device_create_file(&acpi->dev, &cmpc_accel_sensitivity_attr);
if (error)
- goto failed_file;
+ return error;

error = cmpc_add_acpi_notify_device(acpi, "cmpc_accel",
cmpc_accel_idev_init);
@@ -673,8 +671,6 @@ static int cmpc_accel_add(struct acpi_device *acpi)

failed_input:
device_remove_file(&acpi->dev, &cmpc_accel_sensitivity_attr);
-failed_file:
- kfree(accel);
return error;
}