Commit aa123268 authored by Thomas Hellstrom's avatar Thomas Hellstrom Committed by Dave Airlie

drm/ttm: Make sure a sync object doesn't disappear while we use it

The sync object may disappear as soon as we release the bo::lock, so
take a reference on it while we use it.
One option would be to call sync_object_flush() before releasing the bo::lock,
but that would put an atomic requirement on that function.
Signed-off-by: default avatarThomas Hellstrom <thellstrom@vmware.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent a0ae5864
...@@ -458,7 +458,7 @@ static void ttm_bo_cleanup_refs_or_queue(struct ttm_buffer_object *bo) ...@@ -458,7 +458,7 @@ static void ttm_bo_cleanup_refs_or_queue(struct ttm_buffer_object *bo)
struct ttm_bo_device *bdev = bo->bdev; struct ttm_bo_device *bdev = bo->bdev;
struct ttm_bo_global *glob = bo->glob; struct ttm_bo_global *glob = bo->glob;
struct ttm_bo_driver *driver; struct ttm_bo_driver *driver;
void *sync_obj; void *sync_obj = NULL;
void *sync_obj_arg; void *sync_obj_arg;
int put_count; int put_count;
int ret; int ret;
...@@ -493,17 +493,20 @@ static void ttm_bo_cleanup_refs_or_queue(struct ttm_buffer_object *bo) ...@@ -493,17 +493,20 @@ static void ttm_bo_cleanup_refs_or_queue(struct ttm_buffer_object *bo)
spin_lock(&glob->lru_lock); spin_lock(&glob->lru_lock);
} }
queue: queue:
sync_obj = bo->sync_obj;
sync_obj_arg = bo->sync_obj_arg;
driver = bdev->driver; driver = bdev->driver;
if (bo->sync_obj)
sync_obj = driver->sync_obj_ref(bo->sync_obj);
sync_obj_arg = bo->sync_obj_arg;
kref_get(&bo->list_kref); kref_get(&bo->list_kref);
list_add_tail(&bo->ddestroy, &bdev->ddestroy); list_add_tail(&bo->ddestroy, &bdev->ddestroy);
spin_unlock(&glob->lru_lock); spin_unlock(&glob->lru_lock);
spin_unlock(&bo->lock); spin_unlock(&bo->lock);
if (sync_obj) if (sync_obj) {
driver->sync_obj_flush(sync_obj, sync_obj_arg); driver->sync_obj_flush(sync_obj, sync_obj_arg);
driver->sync_obj_unref(&sync_obj);
}
schedule_delayed_work(&bdev->wq, schedule_delayed_work(&bdev->wq,
((HZ / 100) < 1) ? 1 : HZ / 100); ((HZ / 100) < 1) ? 1 : HZ / 100);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment