Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/ttm: add reservation_object as argument to ttm_bo_init

This allows importing reservation objects from dma-bufs.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>

+28 -14
+1 -1
drivers/gpu/drm/ast/ast_ttm.c
··· 339 339 ret = ttm_bo_init(&ast->ttm.bdev, &astbo->bo, size, 340 340 ttm_bo_type_device, &astbo->placement, 341 341 align >> PAGE_SHIFT, false, NULL, acc_size, 342 - NULL, ast_bo_ttm_destroy); 342 + NULL, NULL, ast_bo_ttm_destroy); 343 343 if (ret) 344 344 return ret; 345 345
+1 -1
drivers/gpu/drm/bochs/bochs_mm.c
··· 377 377 ret = ttm_bo_init(&bochs->ttm.bdev, &bochsbo->bo, size, 378 378 ttm_bo_type_device, &bochsbo->placement, 379 379 align >> PAGE_SHIFT, false, NULL, acc_size, 380 - NULL, bochs_bo_ttm_destroy); 380 + NULL, NULL, bochs_bo_ttm_destroy); 381 381 if (ret) 382 382 return ret; 383 383
+1 -1
drivers/gpu/drm/cirrus/cirrus_ttm.c
··· 343 343 ret = ttm_bo_init(&cirrus->ttm.bdev, &cirrusbo->bo, size, 344 344 ttm_bo_type_device, &cirrusbo->placement, 345 345 align >> PAGE_SHIFT, false, NULL, acc_size, 346 - NULL, cirrus_bo_ttm_destroy); 346 + NULL, NULL, cirrus_bo_ttm_destroy); 347 347 if (ret) 348 348 return ret; 349 349
+1 -1
drivers/gpu/drm/mgag200/mgag200_ttm.c
··· 339 339 ret = ttm_bo_init(&mdev->ttm.bdev, &mgabo->bo, size, 340 340 ttm_bo_type_device, &mgabo->placement, 341 341 align >> PAGE_SHIFT, false, NULL, acc_size, 342 - NULL, mgag200_bo_ttm_destroy); 342 + NULL, NULL, mgag200_bo_ttm_destroy); 343 343 if (ret) 344 344 return ret; 345 345
+1 -1
drivers/gpu/drm/nouveau/nouveau_bo.c
··· 230 230 ret = ttm_bo_init(&drm->ttm.bdev, &nvbo->bo, size, 231 231 type, &nvbo->placement, 232 232 align >> PAGE_SHIFT, false, NULL, acc_size, sg, 233 - nouveau_bo_del_ttm); 233 + NULL, nouveau_bo_del_ttm); 234 234 if (ret) { 235 235 /* ttm will call nouveau_bo_del_ttm if it fails.. */ 236 236 return ret;
+1 -1
drivers/gpu/drm/qxl/qxl_object.c
··· 110 110 111 111 r = ttm_bo_init(&qdev->mman.bdev, &bo->tbo, size, type, 112 112 &bo->placement, 0, !kernel, NULL, size, 113 - NULL, &qxl_ttm_bo_destroy); 113 + NULL, NULL, &qxl_ttm_bo_destroy); 114 114 if (unlikely(r != 0)) { 115 115 if (r != -ERESTARTSYS) 116 116 dev_err(qdev->dev,
+1 -1
drivers/gpu/drm/radeon/radeon_object.c
··· 216 216 down_read(&rdev->pm.mclk_lock); 217 217 r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type, 218 218 &bo->placement, page_align, !kernel, NULL, 219 - acc_size, sg, &radeon_ttm_bo_destroy); 219 + acc_size, sg, NULL, &radeon_ttm_bo_destroy); 220 220 up_read(&rdev->pm.mclk_lock); 221 221 if (unlikely(r != 0)) { 222 222 return r;
+18 -6
drivers/gpu/drm/ttm/ttm_bo.c
··· 1068 1068 struct file *persistent_swap_storage, 1069 1069 size_t acc_size, 1070 1070 struct sg_table *sg, 1071 + struct reservation_object *resv, 1071 1072 void (*destroy) (struct ttm_buffer_object *)) 1072 1073 { 1073 1074 int ret = 0; ··· 1122 1121 bo->persistent_swap_storage = persistent_swap_storage; 1123 1122 bo->acc_size = acc_size; 1124 1123 bo->sg = sg; 1125 - bo->resv = &bo->ttm_resv; 1126 - reservation_object_init(bo->resv); 1124 + if (resv) { 1125 + bo->resv = resv; 1126 + lockdep_assert_held(&bo->resv->lock.base); 1127 + } else { 1128 + bo->resv = &bo->ttm_resv; 1129 + reservation_object_init(&bo->ttm_resv); 1130 + } 1127 1131 atomic_inc(&bo->glob->bo_count); 1128 1132 drm_vma_node_reset(&bo->vma_node); 1129 1133 ··· 1141 1135 ret = drm_vma_offset_add(&bdev->vma_manager, &bo->vma_node, 1142 1136 bo->mem.num_pages); 1143 1137 1144 - locked = ww_mutex_trylock(&bo->resv->lock); 1145 - WARN_ON(!locked); 1138 + /* passed reservation objects should already be locked, 1139 + * since otherwise lockdep will be angered in radeon. 1140 + */ 1141 + if (!resv) { 1142 + locked = ww_mutex_trylock(&bo->resv->lock); 1143 + WARN_ON(!locked); 1144 + } 1146 1145 1147 1146 if (likely(!ret)) 1148 1147 ret = ttm_bo_validate(bo, placement, interruptible, false); 1149 1148 1150 - ttm_bo_unreserve(bo); 1149 + if (!resv) 1150 + ttm_bo_unreserve(bo); 1151 1151 1152 1152 if (unlikely(ret)) 1153 1153 ttm_bo_unref(&bo); ··· 1211 1199 acc_size = ttm_bo_acc_size(bdev, size, sizeof(struct ttm_buffer_object)); 1212 1200 ret = ttm_bo_init(bdev, bo, size, type, placement, page_alignment, 1213 1201 interruptible, persistent_swap_storage, acc_size, 1214 - NULL, NULL); 1202 + NULL, NULL, NULL); 1215 1203 if (likely(ret == 0)) 1216 1204 *p_bo = bo; 1217 1205
+1 -1
drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
··· 430 430 ret = ttm_bo_init(bdev, &vmw_bo->base, size, 431 431 ttm_bo_type_device, placement, 432 432 0, interruptible, 433 - NULL, acc_size, NULL, bo_free); 433 + NULL, acc_size, NULL, NULL, bo_free); 434 434 return ret; 435 435 } 436 436
+2
include/drm/ttm/ttm_bo_api.h
··· 460 460 * point to the shmem object backing a GEM object if TTM is used to back a 461 461 * GEM user interface. 462 462 * @acc_size: Accounted size for this object. 463 + * @resv: Pointer to a reservation_object, or NULL to let ttm allocate one. 463 464 * @destroy: Destroy function. Use NULL for kfree(). 464 465 * 465 466 * This function initializes a pre-allocated struct ttm_buffer_object. ··· 488 487 struct file *persistent_swap_storage, 489 488 size_t acc_size, 490 489 struct sg_table *sg, 490 + struct reservation_object *resv, 491 491 void (*destroy) (struct ttm_buffer_object *)); 492 492 493 493 /**