Some error paths didn't unreserve the BO. This resulted in a deadlock down the road on the next attempt to reserve the (still reserved) BO.
Unified · Split
| @@ -458,14 +458,16 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, · 457 unmodified lines | ||
| 458 | 458 | /* make sure object fit at this offset */ |
| 459 | 459 | eoffset = soffset + size; |
| 460 | 460 | if (soffset >= eoffset) { |
| 461 | − return -EINVAL; | |
| 461 | + r = -EINVAL; | |
| 462 | + goto error_unreserve; | |
| 462 | 463 | } |
| 463 | 464 | |
| 464 | 465 | last_pfn = eoffset / RADEON_GPU_PAGE_SIZE; |
| 465 | 466 | if (last_pfn > rdev->vm_manager.max_pfn) { |
| 466 | 467 | dev_err(rdev->dev, "va above limit (0x%08X > 0x%08X)\n", |
| 467 | 468 | last_pfn, rdev->vm_manager.max_pfn); |
| 468 | − return -EINVAL; | |
| 469 | + r = -EINVAL; | |
| 470 | + goto error_unreserve; | |
| 469 | 471 | } |
| 470 | 472 | |
| 471 | 473 | } else { |
| @@ -486,7 +488,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, · 14 unmodified lines | ||
| 486 | 488 | "(bo %p 0x%010lx 0x%010lx)\n", bo_va->bo, |
| 487 | 489 | soffset, tmp->bo, tmp->it.start, tmp->it.last); |
| 488 | 490 | mutex_unlock(&vm->mutex); |
| 489 | − return -EINVAL; | |
| 491 | + r = -EINVAL; | |
| 492 | + goto error_unreserve; | |
| 490 | 493 | } |
| 491 | 494 | } |
| 492 | 495 | |
| @@ -497,7 +500,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, · 4 unmodified lines | ||
| 497 | 500 | tmp = kzalloc(sizeof(struct radeon_bo_va), GFP_KERNEL); |
| 498 | 501 | if (!tmp) { |
| 499 | 502 | mutex_unlock(&vm->mutex); |
| 500 | − return -ENOMEM; | |
| 503 | + r = -ENOMEM; | |
| 504 | + goto error_unreserve; | |
| 501 | 505 | } |
| 502 | 506 | tmp->it.start = bo_va->it.start; |
| 503 | 507 | tmp->it.last = bo_va->it.last; |
| @@ -555,7 +559,6 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, · 51 unmodified lines | ||
| 555 | 559 | r = radeon_vm_clear_bo(rdev, pt); |
| 556 | 560 | if (r) { |
| 557 | 561 | radeon_bo_unref(&pt); |
| 558 | − radeon_bo_reserve(bo_va->bo, false); | |
| 559 | 562 | return r; |
| 560 | 563 | } |
| 561 | 564 | |
| @@ -575,6 +578,10 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, · 13 unmodified lines | ||
| 575 | 578 | |
| 576 | 579 | mutex_unlock(&vm->mutex); |
| 577 | 580 | return 0; |
| 581 | + | |
| 582 | +error_unreserve: | |
| 583 | + radeon_bo_unreserve(bo_va->bo); | |
| 584 | + return r; | |
| 578 | 585 | } |
| 579 | 586 | |
| 580 | 587 | /** |