lkml.org 
[lkml]   [2019]   [Sep]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.3 05/87] drm/kms: Catch mode_object lifetime errors
    Date
    From: Daniel Vetter <daniel.vetter@ffwll.ch>

    [ Upstream commit 4f5368b5541a902f6596558b05f5c21a9770dd32 ]

    Only dynamic mode objects, i.e. those which are refcounted and have a free
    callback, can be added while the overall drm_device is visible to
    userspace. All others must be added before drm_dev_register and
    removed after drm_dev_unregister.

    Small issue around drivers still using the load/unload callbacks, we
    need to make sure we set dev->registered so that load/unload code in
    these callbacks doesn't trigger false warnings. Only a small
    adjustement in drm_dev_register was needed.

    Motivated by some irc discussions about object ids of dynamic objects
    like blobs become invalid, and me going on a bit an audit spree.

    Reviewed-by: Sean Paul <sean@poorly.run>
    Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20190614061723.1173-1-daniel.vetter@ffwll.ch
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/gpu/drm/drm_drv.c | 4 ++--
    drivers/gpu/drm/drm_mode_object.c | 4 ++++
    2 files changed, 6 insertions(+), 2 deletions(-)

    diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
    index 9d00947ca447f..e652305d8f98a 100644
    --- a/drivers/gpu/drm/drm_drv.c
    +++ b/drivers/gpu/drm/drm_drv.c
    @@ -978,14 +978,14 @@ int drm_dev_register(struct drm_device *dev, unsigned long flags)
    if (ret)
    goto err_minors;

    - dev->registered = true;
    -
    if (dev->driver->load) {
    ret = dev->driver->load(dev, flags);
    if (ret)
    goto err_minors;
    }

    + dev->registered = true;
    +
    if (drm_core_check_feature(dev, DRIVER_MODESET))
    drm_modeset_register_all(dev);

    diff --git a/drivers/gpu/drm/drm_mode_object.c b/drivers/gpu/drm/drm_mode_object.c
    index 1c6e511359624..c355ba8e6d5dd 100644
    --- a/drivers/gpu/drm/drm_mode_object.c
    +++ b/drivers/gpu/drm/drm_mode_object.c
    @@ -42,6 +42,8 @@ int __drm_mode_object_add(struct drm_device *dev, struct drm_mode_object *obj,
    {
    int ret;

    + WARN_ON(dev->registered && !obj_free_cb);
    +
    mutex_lock(&dev->mode_config.idr_mutex);
    ret = idr_alloc(&dev->mode_config.object_idr, register_obj ? obj : NULL,
    1, 0, GFP_KERNEL);
    @@ -102,6 +104,8 @@ void drm_mode_object_register(struct drm_device *dev,
    void drm_mode_object_unregister(struct drm_device *dev,
    struct drm_mode_object *object)
    {
    + WARN_ON(dev->registered && !object->free_cb);
    +
    mutex_lock(&dev->mode_config.idr_mutex);
    if (object->id) {
    idr_remove(&dev->mode_config.object_idr, object->id);
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-09-24 18:43    [W:4.292 / U:0.208 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site