drm/msm: Implement .gem_free_object_unlocked
We use a llist and a worker to delay the object cleanup. This avoids taking mmap_sem and struct_mutex in the wrong order when calling drm_gem_object_put_unlocked() from drm_gem_mmap(). Fixes lockdep problem with copy_from_user() in msm_ioctl_gem_submit(). Signed-off-by: Kristian H. Kristensen <hoegsberg@chromium.org> Signed-off-by: Rob Clark <robdclark@chromium.org>
This commit is contained in:

committed by
Rob Clark

parent
fb076b15d5
commit
48e7f18392
@@ -458,6 +458,9 @@ static int msm_drm_init(struct device *dev, struct drm_driver *drv)
|
||||
|
||||
priv->wq = alloc_ordered_workqueue("msm", 0);
|
||||
|
||||
INIT_WORK(&priv->free_work, msm_gem_free_work);
|
||||
init_llist_head(&priv->free_list);
|
||||
|
||||
INIT_LIST_HEAD(&priv->inactive_list);
|
||||
|
||||
drm_mode_config_init(ddev);
|
||||
@@ -1026,7 +1029,7 @@ static struct drm_driver msm_driver = {
|
||||
.irq_uninstall = msm_irq_uninstall,
|
||||
.enable_vblank = msm_enable_vblank,
|
||||
.disable_vblank = msm_disable_vblank,
|
||||
.gem_free_object = msm_gem_free_object,
|
||||
.gem_free_object_unlocked = msm_gem_free_object,
|
||||
.gem_vm_ops = &vm_ops,
|
||||
.dumb_create = msm_gem_dumb_create,
|
||||
.dumb_map_offset = msm_gem_dumb_map_offset,
|
||||
|
Reference in New Issue
Block a user