Free the client memory in the client free callback. Also move the
debugging output into the free callback: drm_client_release() puts
the reference on the DRM device, so pointers to the device should
be considered dangling afterwards.

Signed-off-by: Thomas Zimmermann <[email protected]>
---
 drivers/gpu/drm/clients/drm_log.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/clients/drm_log.c 
b/drivers/gpu/drm/clients/drm_log.c
index 116e0ef9ae5d..470df4148e96 100644
--- a/drivers/gpu/drm/clients/drm_log.c
+++ b/drivers/gpu/drm/clients/drm_log.c
@@ -293,19 +293,26 @@ static void drm_log_free_scanout(struct drm_client_dev 
*client)
        }
 }
 
-static void drm_log_client_unregister(struct drm_client_dev *client)
+static void drm_log_client_free(struct drm_client_dev *client)
 {
        struct drm_log *dlog = client_to_drm_log(client);
        struct drm_device *dev = client->dev;
 
+       kfree(dlog);
+
+       drm_dbg(dev, "Unregistered with drm log\n");
+}
+
+static void drm_log_client_unregister(struct drm_client_dev *client)
+{
+       struct drm_log *dlog = client_to_drm_log(client);
+
        unregister_console(&dlog->con);
 
        mutex_lock(&dlog->lock);
        drm_log_free_scanout(client);
        mutex_unlock(&dlog->lock);
        drm_client_release(client);
-       kfree(dlog);
-       drm_dbg(dev, "Unregistered with drm log\n");
 }
 
 static int drm_log_client_hotplug(struct drm_client_dev *client)
@@ -339,6 +346,7 @@ static int drm_log_client_resume(struct drm_client_dev 
*client, bool _console_lo
 
 static const struct drm_client_funcs drm_log_client_funcs = {
        .owner          = THIS_MODULE,
+       .free           = drm_log_client_free,
        .unregister     = drm_log_client_unregister,
        .hotplug        = drm_log_client_hotplug,
        .suspend        = drm_log_client_suspend,
-- 
2.51.0

Reply via email to