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: Thomas Hellstrom <thellstrom@vmware.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
a0ae5864d4
commit
aa123268c2
@ -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)
|
|||||||
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);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user