[PATCH] drm/radeon: avoid segfault on device open when accel is not working.
Alex Deucher
alexdeucher at gmail.com
Wed May 7 14:42:57 PDT 2014
On Wed, May 7, 2014 at 4:35 PM, <j.glisse at gmail.com> wrote:
> From: Jérôme Glisse <jglisse at redhat.com>
>
> When accel is not working on device with virtual address space radeon
> segfault because the ib buffer is NULL and trying to map it inside the
> virtual address space trigger segfault. This patch only map the ib
> buffer if accel is working.
>
> Cc: <stable at vger.kernel.org>
> Signed-off-by: Jérôme Glisse <jglisse at redhat.com>
Probably also fixes:
https://bugzilla.kernel.org/show_bug.cgi?id=73931
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> drivers/gpu/drm/radeon/radeon_kms.c | 55 +++++++++++++++++++------------------
> 1 file changed, 29 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c
> index 0cc47f1..eaaedba 100644
> --- a/drivers/gpu/drm/radeon/radeon_kms.c
> +++ b/drivers/gpu/drm/radeon/radeon_kms.c
> @@ -577,28 +577,29 @@ int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
> return r;
> }
>
> - r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false);
> - if (r) {
> - radeon_vm_fini(rdev, &fpriv->vm);
> - kfree(fpriv);
> - return r;
> - }
> + if (rdev->accel_working) {
> + r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false);
> + if (r) {
> + radeon_vm_fini(rdev, &fpriv->vm);
> + kfree(fpriv);
> + return r;
> + }
>
> - /* map the ib pool buffer read only into
> - * virtual address space */
> - bo_va = radeon_vm_bo_add(rdev, &fpriv->vm,
> - rdev->ring_tmp_bo.bo);
> - r = radeon_vm_bo_set_addr(rdev, bo_va, RADEON_VA_IB_OFFSET,
> - RADEON_VM_PAGE_READABLE |
> - RADEON_VM_PAGE_SNOOPED);
> + /* map the ib pool buffer read only into
> + * virtual address space */
> + bo_va = radeon_vm_bo_add(rdev, &fpriv->vm,
> + rdev->ring_tmp_bo.bo);
> + r = radeon_vm_bo_set_addr(rdev, bo_va, RADEON_VA_IB_OFFSET,
> + RADEON_VM_PAGE_READABLE |
> + RADEON_VM_PAGE_SNOOPED);
>
> - radeon_bo_unreserve(rdev->ring_tmp_bo.bo);
> - if (r) {
> - radeon_vm_fini(rdev, &fpriv->vm);
> - kfree(fpriv);
> - return r;
> + radeon_bo_unreserve(rdev->ring_tmp_bo.bo);
> + if (r) {
> + radeon_vm_fini(rdev, &fpriv->vm);
> + kfree(fpriv);
> + return r;
> + }
> }
> -
> file_priv->driver_priv = fpriv;
> }
>
> @@ -626,13 +627,15 @@ void radeon_driver_postclose_kms(struct drm_device *dev,
> struct radeon_bo_va *bo_va;
> int r;
>
> - r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false);
> - if (!r) {
> - bo_va = radeon_vm_bo_find(&fpriv->vm,
> - rdev->ring_tmp_bo.bo);
> - if (bo_va)
> - radeon_vm_bo_rmv(rdev, bo_va);
> - radeon_bo_unreserve(rdev->ring_tmp_bo.bo);
> + if (rdev->accel_working) {
> + r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false);
> + if (!r) {
> + bo_va = radeon_vm_bo_find(&fpriv->vm,
> + rdev->ring_tmp_bo.bo);
> + if (bo_va)
> + radeon_vm_bo_rmv(rdev, bo_va);
> + radeon_bo_unreserve(rdev->ring_tmp_bo.bo);
> + }
> }
>
> radeon_vm_fini(rdev, &fpriv->vm);
> --
> 1.9.0
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
More information about the dri-devel
mailing list