Thread (14 messages) read the whole thread 14 messages, 3 authors, 2014-02-21

RE: [PATCH] input synaptics-rmi4: Use put_device() and device_type.release() to free storage.

From: Christopher Heiny <hidden>
Date: 2014-02-21 23:29:11

Sorry for top posting - using web mail right now.

I think something like allocate_device and free_device will be needed sooner rather than later. I'll get a patch out for that in the next couple of days.

Chris

________________________________________
From: linux-input-owner@vger.kernel.org [linux-input-owner@vger.kernel.org] on behalf of Dmitry Torokhov [dmitry.torokhov@gmail.com]
Sent: Thursday, February 13, 2014 2:10 PM
To: Courtney Cavin
Cc: Christopher Heiny; Linux Input; Andrew Duggan; Vincent Huang; Vivian Ly; Daniel Rosenberg; Jean Delvare; Joerie de Gram; Linus Walleij; Benjamin Tissoires; David Herrmann; Jiri Kosina
Subject: Re: [PATCH] input synaptics-rmi4: Use put_device() and device_type.release() to free storage.

On Thu, Feb 13, 2014 at 01:59:31PM -0800, Courtney Cavin wrote:
On Thu, Feb 13, 2014 at 07:15:24AM +0100, Dmitry Torokhov wrote:
quoted
On Wed, Feb 12, 2014 at 06:31:04PM -0800, Christopher Heiny wrote:
quoted
Input: synaptics-rmi4 - Use put_device() and device_type.release()
to free storage.

From: Christopher Heiny <redacted>

For rmi_sensor and rmi_function device_types, use put_device() and
the assocated device_type.release() function to clean up related
structures and storage in the correct and safe order.

Allocate irq_mask as part of struct rmi_function.

Delete unused rmi_driver_irq_get_mask() function.
[...]
quoted
Input: synaptics-rmi4 - use put_device() to free devices

From: Christopher Heiny <redacted>

For rmi_sensor and rmi_function device_types, use put_device() and
the associated device_type->release() function to clean up related
structures and storage in the correct and safe order.

Allocate irq_mask as part of struct rmi_function.

Suggested-by: Courtney Cavin <redacted>
Signed-off-by: Christopher Heiny <redacted>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
 drivers/input/rmi4/rmi_bus.c    |   30 +++++++++++++++++++++---------
 drivers/input/rmi4/rmi_bus.h    |    7 ++++---
 drivers/input/rmi4/rmi_driver.c |   25 +++++++------------------
 3 files changed, 32 insertions(+), 30 deletions(-)
diff --git a/drivers/input/rmi4/rmi_bus.c b/drivers/input/rmi4/rmi_bus.c
[...]
quoted
@@ -142,6 +150,7 @@ EXPORT_SYMBOL(rmi_unregister_transport_device);
 static void rmi_release_function(struct device *dev)
 {
    struct rmi_function *fn = to_rmi_function(dev);
+
    kfree(fn);
 }
Ownership of this memory is a bit weird...

[...]
quoted
 void rmi_unregister_function(struct rmi_function *fn)
 {
+   device_del(&fn->dev);
    rmi_function_teardown_debugfs(fn);
-   device_unregister(&fn->dev);
+   put_device(&fn->dev);
 }
Here clearly the bus code owns it...
quoted
diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_driver.c
[...]
quoted
 static int rmi_create_function(struct rmi_device *rmi_dev,
-                         void *ctx, const struct pdt_entry *pdt)
+                          void *ctx, const struct pdt_entry *pdt)
 {
    struct device *dev = &rmi_dev->dev;
    struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev);
@@ -630,7 +629,9 @@ static int rmi_create_function(struct rmi_device *rmi_dev,
    dev_dbg(dev, "Initializing F%02X for %s.\n",
            pdt->function_number, pdata->sensor_name);

-   fn = kzalloc(sizeof(struct rmi_function), GFP_KERNEL);
+   fn = kzalloc(sizeof(struct rmi_function) +
+                   BITS_TO_LONGS(data->irq_count) * sizeof(unsigned long),
+                GFP_KERNEL);
But it's allocated in the chip driver...
quoted
    if (!fn) {
            dev_err(dev, "Failed to allocate memory for F%02X\n",
                    pdt->function_number);
@@ -646,22 +647,12 @@ static int rmi_create_function(struct rmi_device *rmi_dev,
    fn->irq_pos = *current_irq_count;
    *current_irq_count += fn->num_of_irqs;

-   fn->irq_mask = kzalloc(
-           BITS_TO_LONGS(data->irq_count) * sizeof(unsigned long),
-           GFP_KERNEL);
-   if (!fn->irq_mask) {
-           dev_err(dev, "%s: Failed to create irq_mask for F%02X.\n",
-                   __func__, pdt->function_number);
-           error = -ENOMEM;
-           goto err_free_mem;
-   }
-
    for (i = 0; i < fn->num_of_irqs; i++)
            set_bit(fn->irq_pos + i, fn->irq_mask);

    error = rmi_register_function(fn);
    if (error)
-           goto err_free_irq_mask;
+           goto err_put_fn;

    if (pdt->function_number == 0x01)
            data->f01_container = fn;
@@ -670,10 +661,8 @@ static int rmi_create_function(struct rmi_device *rmi_dev,

    return RMI_SCAN_CONTINUE;

-err_free_irq_mask:
-   kfree(fn->irq_mask);
-err_free_mem:
-   kfree(fn);
+err_put_fn:
+   put_device(&fn->dev);
And the chip driver now is expected to know it's a device, and trust
that the bus code knows how to free the memory.
Yeah. That is why for input devices I have a separate
input_allocate_device and input_free_device... But given that RMI is
pretty-much self-contained I think we can live with this.
As this clearly fixes a bug or two, I say we should take this patch
as-is and worry about proper ownership at some other time.

-Courtney
--
Dmitry
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help