| From 9b39b013037fbfa8d4b999345d9e904d8a336fc2 Mon Sep 17 00:00:00 2001 |
| From: Dave Airlie <airlied@redhat.com> |
| Date: Fri, 5 Apr 2019 13:17:13 +1000 |
| Subject: drm/udl: add a release method and delay modeset teardown |
| |
| From: Dave Airlie <airlied@redhat.com> |
| |
| commit 9b39b013037fbfa8d4b999345d9e904d8a336fc2 upstream. |
| |
| If we unplug a udl device, the usb callback with deinit the |
| mode_config struct, however userspace will still have an open |
| file descriptor and a framebuffer on that device. When userspace |
| closes the fd, we'll oops because it'll try and look stuff up |
| in the object idr which we've destroyed. |
| |
| This punts destroying the mode objects until release time instead. |
| |
| Cc: stable@vger.kernel.org |
| Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| Signed-off-by: Dave Airlie <airlied@redhat.com> |
| Link: https://patchwork.freedesktop.org/patch/msgid/20190405031715.5959-2-airlied@gmail.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/gpu/drm/udl/udl_drv.c | 1 + |
| drivers/gpu/drm/udl/udl_drv.h | 1 + |
| drivers/gpu/drm/udl/udl_main.c | 8 +++++++- |
| 3 files changed, 9 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/gpu/drm/udl/udl_drv.c |
| +++ b/drivers/gpu/drm/udl/udl_drv.c |
| @@ -51,6 +51,7 @@ static struct drm_driver driver = { |
| .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME, |
| .load = udl_driver_load, |
| .unload = udl_driver_unload, |
| + .release = udl_driver_release, |
| |
| /* gem hooks */ |
| .gem_free_object_unlocked = udl_gem_free_object, |
| --- a/drivers/gpu/drm/udl/udl_drv.h |
| +++ b/drivers/gpu/drm/udl/udl_drv.h |
| @@ -104,6 +104,7 @@ void udl_urb_completion(struct urb *urb) |
| |
| int udl_driver_load(struct drm_device *dev, unsigned long flags); |
| void udl_driver_unload(struct drm_device *dev); |
| +void udl_driver_release(struct drm_device *dev); |
| |
| int udl_fbdev_init(struct drm_device *dev); |
| void udl_fbdev_cleanup(struct drm_device *dev); |
| --- a/drivers/gpu/drm/udl/udl_main.c |
| +++ b/drivers/gpu/drm/udl/udl_main.c |
| @@ -378,6 +378,12 @@ void udl_driver_unload(struct drm_device |
| udl_free_urb_list(dev); |
| |
| udl_fbdev_cleanup(dev); |
| - udl_modeset_cleanup(dev); |
| kfree(udl); |
| } |
| + |
| +void udl_driver_release(struct drm_device *dev) |
| +{ |
| + udl_modeset_cleanup(dev); |
| + drm_dev_fini(dev); |
| + kfree(dev); |
| +} |