61 lines
2.1 KiB
Diff
61 lines
2.1 KiB
Diff
From 888d867aa6f8fe384b37c0915eed07bb3a970fc4 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org>
|
|
Date: Thu, 1 Jul 2021 19:07:47 +0200
|
|
Subject: [PATCH] drm/gud: Free buffers on device removal
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
[ drm-misc commit f8ac863b6a93863334cefb94285daaa6617381b5 ]
|
|
|
|
Free transfer and compression buffers on device removal instead of at
|
|
DRM device removal time. This ensures that the usual 2x8MB buffers are
|
|
released when the device is unplugged and not kept around should
|
|
userspace keep the DRM device fd open.
|
|
|
|
At least Ubuntu 20.04 doesn't release the DRM device on unplug.
|
|
|
|
The damage_lock mutex is not destroyed because it is used outside the
|
|
drm_dev_enter/exit block in gud_pipe_update(). AFAICT it's possible for
|
|
an open fbdev descriptor to trigger a commit after the USB device is gone.
|
|
|
|
v2: Don't destroy damage_lock
|
|
|
|
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
|
|
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20210701170748.58009-1-noralf@tronnes.org
|
|
---
|
|
drivers/gpu/drm/gud/gud_drv.c | 9 +++++----
|
|
1 file changed, 5 insertions(+), 4 deletions(-)
|
|
|
|
--- a/drivers/gpu/drm/gud/gud_drv.c
|
|
+++ b/drivers/gpu/drm/gud/gud_drv.c
|
|
@@ -407,14 +407,15 @@ static struct drm_driver gud_drm_driver
|
|
.minor = 0,
|
|
};
|
|
|
|
-static void gud_free_buffers_and_mutex(struct drm_device *drm, void *unused)
|
|
+static void gud_free_buffers_and_mutex(void *data)
|
|
{
|
|
- struct gud_device *gdrm = to_gud_device(drm);
|
|
+ struct gud_device *gdrm = data;
|
|
|
|
vfree(gdrm->compress_buf);
|
|
+ gdrm->compress_buf = NULL;
|
|
kfree(gdrm->bulk_buf);
|
|
+ gdrm->bulk_buf = NULL;
|
|
mutex_destroy(&gdrm->ctrl_lock);
|
|
- mutex_destroy(&gdrm->damage_lock);
|
|
}
|
|
|
|
static int gud_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
|
@@ -468,7 +469,7 @@ static int gud_probe(struct usb_interfac
|
|
INIT_WORK(&gdrm->work, gud_flush_work);
|
|
gud_clear_damage(gdrm);
|
|
|
|
- ret = drmm_add_action_or_reset(drm, gud_free_buffers_and_mutex, NULL);
|
|
+ ret = devm_add_action(dev, gud_free_buffers_and_mutex, gdrm);
|
|
if (ret)
|
|
return ret;
|
|
|