diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c index 5839fab374bf..7297ca3a0ba7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | |||
@@ -69,7 +69,8 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size, | |||
69 | } | 69 | } |
70 | } | 70 | } |
71 | retry: | 71 | retry: |
72 | r = amdgpu_bo_create(adev, size, alignment, kernel, initial_domain, flags, NULL, &robj); | 72 | r = amdgpu_bo_create(adev, size, alignment, kernel, initial_domain, |
73 | flags, NULL, NULL, &robj); | ||
73 | if (r) { | 74 | if (r) { |
74 | if (r != -ERESTARTSYS) { | 75 | if (r != -ERESTARTSYS) { |
75 | if (initial_domain == AMDGPU_GEM_DOMAIN_VRAM) { | 76 | if (initial_domain == AMDGPU_GEM_DOMAIN_VRAM) { |
@@ -426,6 +427,10 @@ int amdgpu_gem_metadata_ioctl(struct drm_device *dev, void *data, | |||
426 | &args->data.data_size_bytes, | 427 | &args->data.data_size_bytes, |
427 | &args->data.flags); | 428 | &args->data.flags); |
428 | } else if (args->op == AMDGPU_GEM_METADATA_OP_SET_METADATA) { | 429 | } else if (args->op == AMDGPU_GEM_METADATA_OP_SET_METADATA) { |
430 | if (args->data.data_size_bytes > sizeof(args->data.data)) { | ||
431 | r = -EINVAL; | ||
432 | goto unreserve; | ||
433 | } | ||
429 | r = amdgpu_bo_set_tiling_flags(robj, args->data.tiling_info); | 434 | r = amdgpu_bo_set_tiling_flags(robj, args->data.tiling_info); |
430 | if (!r) | 435 | if (!r) |
431 | r = amdgpu_bo_set_metadata(robj, args->data.data, | 436 | r = amdgpu_bo_set_metadata(robj, args->data.data, |
@@ -433,6 +438,7 @@ int amdgpu_gem_metadata_ioctl(struct drm_device *dev, void *data, | |||
433 | args->data.flags); | 438 | args->data.flags); |
434 | } | 439 | } |
435 | 440 | ||
441 | unreserve: | ||
436 | amdgpu_bo_unreserve(robj); | 442 | amdgpu_bo_unreserve(robj); |
437 | out: | 443 | out: |
438 | drm_gem_object_unreference_unlocked(gobj); | 444 | drm_gem_object_unreference_unlocked(gobj); |
@@ -454,11 +460,12 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev, | |||
454 | struct ttm_validate_buffer tv, *entry; | 460 | struct ttm_validate_buffer tv, *entry; |
455 | struct amdgpu_bo_list_entry *vm_bos; | 461 | struct amdgpu_bo_list_entry *vm_bos; |
456 | struct ww_acquire_ctx ticket; | 462 | struct ww_acquire_ctx ticket; |
457 | struct list_head list; | 463 | struct list_head list, duplicates; |
458 | unsigned domain; | 464 | unsigned domain; |
459 | int r; | 465 | int r; |
460 | 466 | ||
461 | INIT_LIST_HEAD(&list); | 467 | INIT_LIST_HEAD(&list); |
468 | INIT_LIST_HEAD(&duplicates); | ||
462 | 469 | ||
463 | tv.bo = &bo_va->bo->tbo; | 470 | tv.bo = &bo_va->bo->tbo; |
464 | tv.shared = true; | 471 | tv.shared = true; |
@@ -468,7 +475,8 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev, | |||
468 | if (!vm_bos) | 475 | if (!vm_bos) |
469 | return; | 476 | return; |
470 | 477 | ||
471 | r = ttm_eu_reserve_buffers(&ticket, &list, true, NULL); | 478 | /* Provide duplicates to avoid -EALREADY */ |
479 | r = ttm_eu_reserve_buffers(&ticket, &list, true, &duplicates); | ||
472 | if (r) | 480 | if (r) |
473 | goto error_free; | 481 | goto error_free; |
474 | 482 | ||
@@ -651,7 +659,7 @@ int amdgpu_mode_dumb_create(struct drm_file *file_priv, | |||
651 | int r; | 659 | int r; |
652 | 660 | ||
653 | args->pitch = amdgpu_align_pitch(adev, args->width, args->bpp, 0) * ((args->bpp + 1) / 8); | 661 | args->pitch = amdgpu_align_pitch(adev, args->width, args->bpp, 0) * ((args->bpp + 1) / 8); |
654 | args->size = args->pitch * args->height; | 662 | args->size = (u64)args->pitch * args->height; |
655 | args->size = ALIGN(args->size, PAGE_SIZE); | 663 | args->size = ALIGN(args->size, PAGE_SIZE); |
656 | 664 | ||
657 | r = amdgpu_gem_object_create(adev, args->size, 0, | 665 | r = amdgpu_gem_object_create(adev, args->size, 0, |