This allows importing reservation objects from dma-bufs.
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
        ret = ttm_bo_init(&ast->ttm.bdev, &astbo->bo, size,
                          ttm_bo_type_device, &astbo->placement,
                          align >> PAGE_SHIFT, false, NULL, acc_size,
-                         NULL, ast_bo_ttm_destroy);
+                         NULL, NULL, ast_bo_ttm_destroy);
        if (ret)
                return ret;
 
 
        ret = ttm_bo_init(&bochs->ttm.bdev, &bochsbo->bo, size,
                          ttm_bo_type_device, &bochsbo->placement,
                          align >> PAGE_SHIFT, false, NULL, acc_size,
-                         NULL, bochs_bo_ttm_destroy);
+                         NULL, NULL, bochs_bo_ttm_destroy);
        if (ret)
                return ret;
 
 
        ret = ttm_bo_init(&cirrus->ttm.bdev, &cirrusbo->bo, size,
                          ttm_bo_type_device, &cirrusbo->placement,
                          align >> PAGE_SHIFT, false, NULL, acc_size,
-                         NULL, cirrus_bo_ttm_destroy);
+                         NULL, NULL, cirrus_bo_ttm_destroy);
        if (ret)
                return ret;
 
 
        ret = ttm_bo_init(&mdev->ttm.bdev, &mgabo->bo, size,
                          ttm_bo_type_device, &mgabo->placement,
                          align >> PAGE_SHIFT, false, NULL, acc_size,
-                         NULL, mgag200_bo_ttm_destroy);
+                         NULL, NULL, mgag200_bo_ttm_destroy);
        if (ret)
                return ret;
 
 
        ret = ttm_bo_init(&drm->ttm.bdev, &nvbo->bo, size,
                          type, &nvbo->placement,
                          align >> PAGE_SHIFT, false, NULL, acc_size, sg,
-                         nouveau_bo_del_ttm);
+                         NULL, nouveau_bo_del_ttm);
        if (ret) {
                /* ttm will call nouveau_bo_del_ttm if it fails.. */
                return ret;
 
 
        r = ttm_bo_init(&qdev->mman.bdev, &bo->tbo, size, type,
                        &bo->placement, 0, !kernel, NULL, size,
-                       NULL, &qxl_ttm_bo_destroy);
+                       NULL, NULL, &qxl_ttm_bo_destroy);
        if (unlikely(r != 0)) {
                if (r != -ERESTARTSYS)
                        dev_err(qdev->dev,
 
        down_read(&rdev->pm.mclk_lock);
        r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type,
                        &bo->placement, page_align, !kernel, NULL,
-                       acc_size, sg, &radeon_ttm_bo_destroy);
+                       acc_size, sg, NULL, &radeon_ttm_bo_destroy);
        up_read(&rdev->pm.mclk_lock);
        if (unlikely(r != 0)) {
                return r;
 
                struct file *persistent_swap_storage,
                size_t acc_size,
                struct sg_table *sg,
+               struct reservation_object *resv,
                void (*destroy) (struct ttm_buffer_object *))
 {
        int ret = 0;
        bo->persistent_swap_storage = persistent_swap_storage;
        bo->acc_size = acc_size;
        bo->sg = sg;
-       bo->resv = &bo->ttm_resv;
-       reservation_object_init(bo->resv);
+       if (resv) {
+               bo->resv = resv;
+               lockdep_assert_held(&bo->resv->lock.base);
+       } else {
+               bo->resv = &bo->ttm_resv;
+               reservation_object_init(&bo->ttm_resv);
+       }
        atomic_inc(&bo->glob->bo_count);
        drm_vma_node_reset(&bo->vma_node);
 
                ret = drm_vma_offset_add(&bdev->vma_manager, &bo->vma_node,
                                         bo->mem.num_pages);
 
-       locked = ww_mutex_trylock(&bo->resv->lock);
-       WARN_ON(!locked);
+       /* passed reservation objects should already be locked,
+        * since otherwise lockdep will be angered in radeon.
+        */
+       if (!resv) {
+               locked = ww_mutex_trylock(&bo->resv->lock);
+               WARN_ON(!locked);
+       }
 
        if (likely(!ret))
                ret = ttm_bo_validate(bo, placement, interruptible, false);
 
-       ttm_bo_unreserve(bo);
+       if (!resv)
+               ttm_bo_unreserve(bo);
 
        if (unlikely(ret))
                ttm_bo_unref(&bo);
        acc_size = ttm_bo_acc_size(bdev, size, sizeof(struct ttm_buffer_object));
        ret = ttm_bo_init(bdev, bo, size, type, placement, page_alignment,
                          interruptible, persistent_swap_storage, acc_size,
-                         NULL, NULL);
+                         NULL, NULL, NULL);
        if (likely(ret == 0))
                *p_bo = bo;
 
 
        ret = ttm_bo_init(bdev, &vmw_bo->base, size,
                          ttm_bo_type_device, placement,
                          0, interruptible,
-                         NULL, acc_size, NULL, bo_free);
+                         NULL, acc_size, NULL, NULL, bo_free);
        return ret;
 }
 
 
  * point to the shmem object backing a GEM object if TTM is used to back a
  * GEM user interface.
  * @acc_size: Accounted size for this object.
+ * @resv: Pointer to a reservation_object, or NULL to let ttm allocate one.
  * @destroy: Destroy function. Use NULL for kfree().
  *
  * This function initializes a pre-allocated struct ttm_buffer_object.
                        struct file *persistent_swap_storage,
                        size_t acc_size,
                        struct sg_table *sg,
+                       struct reservation_object *resv,
                        void (*destroy) (struct ttm_buffer_object *));
 
 /**