aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_object.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_object.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index 8fddea4bc146..81d40e3bfbdb 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -239,15 +239,20 @@ int amdgpu_bo_create_kernel(struct amdgpu_device *adev,
239 u32 domain, struct amdgpu_bo **bo_ptr, 239 u32 domain, struct amdgpu_bo **bo_ptr,
240 u64 *gpu_addr, void **cpu_addr) 240 u64 *gpu_addr, void **cpu_addr)
241{ 241{
242 bool free = false;
242 int r; 243 int r;
243 244
244 r = amdgpu_bo_create(adev, size, align, true, domain, 245 if (!*bo_ptr) {
245 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED | 246 r = amdgpu_bo_create(adev, size, align, true, domain,
246 AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS, 247 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |
247 NULL, NULL, bo_ptr); 248 AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS,
248 if (r) { 249 NULL, NULL, bo_ptr);
249 dev_err(adev->dev, "(%d) failed to allocate kernel bo\n", r); 250 if (r) {
250 return r; 251 dev_err(adev->dev, "(%d) failed to allocate kernel bo\n",
252 r);
253 return r;
254 }
255 free = true;
251 } 256 }
252 257
253 r = amdgpu_bo_reserve(*bo_ptr, false); 258 r = amdgpu_bo_reserve(*bo_ptr, false);
@@ -278,7 +283,8 @@ error_unreserve:
278 amdgpu_bo_unreserve(*bo_ptr); 283 amdgpu_bo_unreserve(*bo_ptr);
279 284
280error_free: 285error_free:
281 amdgpu_bo_unref(bo_ptr); 286 if (free)
287 amdgpu_bo_unref(bo_ptr);
282 288
283 return r; 289 return r;
284} 290}