* [PATCH] drm/radeon: Make sure radeon_vm_bo_set_addr always unreserves the BO
@ 2015-06-11 9:38 Michel Dänzer
2015-06-11 10:03 ` Christian König
2015-06-11 15:11 ` Alex Deucher
0 siblings, 2 replies; 3+ messages in thread
From: Michel Dänzer @ 2015-06-11 9:38 UTC (permalink / raw)
To: dri-devel
From: Michel Dänzer <michel.daenzer@amd.com>
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.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=90873
Cc: stable@vger.kernel.org
Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
---
drivers/gpu/drm/radeon/radeon_vm.c | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
index de42fc4..9c3377c 100644
--- a/drivers/gpu/drm/radeon/radeon_vm.c
+++ b/drivers/gpu/drm/radeon/radeon_vm.c
@@ -458,14 +458,16 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
/* make sure object fit at this offset */
eoffset = soffset + size;
if (soffset >= eoffset) {
- return -EINVAL;
+ r = -EINVAL;
+ goto error_unreserve;
}
last_pfn = eoffset / RADEON_GPU_PAGE_SIZE;
if (last_pfn > rdev->vm_manager.max_pfn) {
dev_err(rdev->dev, "va above limit (0x%08X > 0x%08X)\n",
last_pfn, rdev->vm_manager.max_pfn);
- return -EINVAL;
+ r = -EINVAL;
+ goto error_unreserve;
}
} else {
@@ -486,7 +488,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
"(bo %p 0x%010lx 0x%010lx)\n", bo_va->bo,
soffset, tmp->bo, tmp->it.start, tmp->it.last);
mutex_unlock(&vm->mutex);
- return -EINVAL;
+ r = -EINVAL;
+ goto error_unreserve;
}
}
@@ -497,7 +500,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
tmp = kzalloc(sizeof(struct radeon_bo_va), GFP_KERNEL);
if (!tmp) {
mutex_unlock(&vm->mutex);
- return -ENOMEM;
+ r = -ENOMEM;
+ goto error_unreserve;
}
tmp->it.start = bo_va->it.start;
tmp->it.last = bo_va->it.last;
@@ -555,7 +559,6 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
r = radeon_vm_clear_bo(rdev, pt);
if (r) {
radeon_bo_unref(&pt);
- radeon_bo_reserve(bo_va->bo, false);
return r;
}
@@ -575,6 +578,10 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
mutex_unlock(&vm->mutex);
return 0;
+
+error_unreserve:
+ radeon_bo_unreserve(bo_va->bo);
+ return r;
}
/**
--
2.1.4
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] drm/radeon: Make sure radeon_vm_bo_set_addr always unreserves the BO
2015-06-11 9:38 [PATCH] drm/radeon: Make sure radeon_vm_bo_set_addr always unreserves the BO Michel Dänzer
@ 2015-06-11 10:03 ` Christian König
2015-06-11 15:11 ` Alex Deucher
1 sibling, 0 replies; 3+ messages in thread
From: Christian König @ 2015-06-11 10:03 UTC (permalink / raw)
To: Michel Dänzer, dri-devel
On 11.06.2015 11:38, Michel Dänzer wrote:
> From: Michel Dänzer <michel.daenzer@amd.com>
>
> 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.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=90873
> Cc: stable@vger.kernel.org
> Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
I've already did the same change for amdgpu. Looks like I've forgotten
to port it back to Radeon, crap!
Patch is Reviewed-by: Christian König <christian.koenig@amd.com>
> ---
> drivers/gpu/drm/radeon/radeon_vm.c | 17 ++++++++++++-----
> 1 file changed, 12 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
> index de42fc4..9c3377c 100644
> --- a/drivers/gpu/drm/radeon/radeon_vm.c
> +++ b/drivers/gpu/drm/radeon/radeon_vm.c
> @@ -458,14 +458,16 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
> /* make sure object fit at this offset */
> eoffset = soffset + size;
> if (soffset >= eoffset) {
> - return -EINVAL;
> + r = -EINVAL;
> + goto error_unreserve;
> }
>
> last_pfn = eoffset / RADEON_GPU_PAGE_SIZE;
> if (last_pfn > rdev->vm_manager.max_pfn) {
> dev_err(rdev->dev, "va above limit (0x%08X > 0x%08X)\n",
> last_pfn, rdev->vm_manager.max_pfn);
> - return -EINVAL;
> + r = -EINVAL;
> + goto error_unreserve;
> }
>
> } else {
> @@ -486,7 +488,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
> "(bo %p 0x%010lx 0x%010lx)\n", bo_va->bo,
> soffset, tmp->bo, tmp->it.start, tmp->it.last);
> mutex_unlock(&vm->mutex);
> - return -EINVAL;
> + r = -EINVAL;
> + goto error_unreserve;
> }
> }
>
> @@ -497,7 +500,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
> tmp = kzalloc(sizeof(struct radeon_bo_va), GFP_KERNEL);
> if (!tmp) {
> mutex_unlock(&vm->mutex);
> - return -ENOMEM;
> + r = -ENOMEM;
> + goto error_unreserve;
> }
> tmp->it.start = bo_va->it.start;
> tmp->it.last = bo_va->it.last;
> @@ -555,7 +559,6 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
> r = radeon_vm_clear_bo(rdev, pt);
> if (r) {
> radeon_bo_unref(&pt);
> - radeon_bo_reserve(bo_va->bo, false);
> return r;
> }
>
> @@ -575,6 +578,10 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
>
> mutex_unlock(&vm->mutex);
> return 0;
> +
> +error_unreserve:
> + radeon_bo_unreserve(bo_va->bo);
> + return r;
> }
>
> /**
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] drm/radeon: Make sure radeon_vm_bo_set_addr always unreserves the BO
2015-06-11 9:38 [PATCH] drm/radeon: Make sure radeon_vm_bo_set_addr always unreserves the BO Michel Dänzer
2015-06-11 10:03 ` Christian König
@ 2015-06-11 15:11 ` Alex Deucher
1 sibling, 0 replies; 3+ messages in thread
From: Alex Deucher @ 2015-06-11 15:11 UTC (permalink / raw)
To: Michel Dänzer; +Cc: Maling list - DRI developers
On Thu, Jun 11, 2015 at 5:38 AM, Michel Dänzer <michel@daenzer.net> wrote:
> From: Michel Dänzer <michel.daenzer@amd.com>
>
> 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.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=90873
> Cc: stable@vger.kernel.org
> Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
Applied to my -fixes tree.
Thanks,
Alex
> ---
> drivers/gpu/drm/radeon/radeon_vm.c | 17 ++++++++++++-----
> 1 file changed, 12 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
> index de42fc4..9c3377c 100644
> --- a/drivers/gpu/drm/radeon/radeon_vm.c
> +++ b/drivers/gpu/drm/radeon/radeon_vm.c
> @@ -458,14 +458,16 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
> /* make sure object fit at this offset */
> eoffset = soffset + size;
> if (soffset >= eoffset) {
> - return -EINVAL;
> + r = -EINVAL;
> + goto error_unreserve;
> }
>
> last_pfn = eoffset / RADEON_GPU_PAGE_SIZE;
> if (last_pfn > rdev->vm_manager.max_pfn) {
> dev_err(rdev->dev, "va above limit (0x%08X > 0x%08X)\n",
> last_pfn, rdev->vm_manager.max_pfn);
> - return -EINVAL;
> + r = -EINVAL;
> + goto error_unreserve;
> }
>
> } else {
> @@ -486,7 +488,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
> "(bo %p 0x%010lx 0x%010lx)\n", bo_va->bo,
> soffset, tmp->bo, tmp->it.start, tmp->it.last);
> mutex_unlock(&vm->mutex);
> - return -EINVAL;
> + r = -EINVAL;
> + goto error_unreserve;
> }
> }
>
> @@ -497,7 +500,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
> tmp = kzalloc(sizeof(struct radeon_bo_va), GFP_KERNEL);
> if (!tmp) {
> mutex_unlock(&vm->mutex);
> - return -ENOMEM;
> + r = -ENOMEM;
> + goto error_unreserve;
> }
> tmp->it.start = bo_va->it.start;
> tmp->it.last = bo_va->it.last;
> @@ -555,7 +559,6 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
> r = radeon_vm_clear_bo(rdev, pt);
> if (r) {
> radeon_bo_unref(&pt);
> - radeon_bo_reserve(bo_va->bo, false);
> return r;
> }
>
> @@ -575,6 +578,10 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
>
> mutex_unlock(&vm->mutex);
> return 0;
> +
> +error_unreserve:
> + radeon_bo_unreserve(bo_va->bo);
> + return r;
> }
>
> /**
> --
> 2.1.4
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2015-06-11 15:11 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-06-11 9:38 [PATCH] drm/radeon: Make sure radeon_vm_bo_set_addr always unreserves the BO Michel Dänzer
2015-06-11 10:03 ` Christian König
2015-06-11 15:11 ` Alex Deucher
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.