[PATCH] drm/radeon/kms: properly set accel working flag and bailout when false

Alex Deucher alexdeucher at gmail.com
Tue Feb 21 08:35:14 PST 2012


On Mon, Feb 20, 2012 at 5:57 PM,  <j.glisse at gmail.com> wrote:
> From: Jerome Glisse <jglisse at redhat.com>
>
> If accel is not working many subsystem such as the ib pool might not be
> initialized properly that can lead to segfault inside kernel when cs
> ioctl is call with non working acceleration. To avoid this make sure
> the accel working flag is false when an error in GPU startup happen and
> return EBUSY from cs ioctl if accel is not working.
>
> Signed-off-by: Jerome Glisse <jglisse at redhat.com>

Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

> ---
>  drivers/gpu/drm/radeon/evergreen.c |    1 +
>  drivers/gpu/drm/radeon/ni.c        |    1 +
>  drivers/gpu/drm/radeon/r100.c      |    8 +++++++-
>  drivers/gpu/drm/radeon/r300.c      |    8 +++++++-
>  drivers/gpu/drm/radeon/r420.c      |    8 +++++++-
>  drivers/gpu/drm/radeon/r520.c      |    8 +++++++-
>  drivers/gpu/drm/radeon/r600.c      |    1 +
>  drivers/gpu/drm/radeon/radeon_cs.c |    4 ++++
>  drivers/gpu/drm/radeon/rs400.c     |    8 +++++++-
>  drivers/gpu/drm/radeon/rs600.c     |    8 +++++++-
>  drivers/gpu/drm/radeon/rs690.c     |    8 +++++++-
>  drivers/gpu/drm/radeon/rv515.c     |    8 +++++++-
>  drivers/gpu/drm/radeon/rv770.c     |    1 +
>  13 files changed, 64 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
> index 1a816ea..cb86330 100644
> --- a/drivers/gpu/drm/radeon/evergreen.c
> +++ b/drivers/gpu/drm/radeon/evergreen.c
> @@ -3254,6 +3254,7 @@ int evergreen_resume(struct radeon_device *rdev)
>        r = evergreen_startup(rdev);
>        if (r) {
>                DRM_ERROR("evergreen startup failed on resume\n");
> +               rdev->accel_working = false;
>                return r;
>        }
>
> diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c
> index db09065..2509c50 100644
> --- a/drivers/gpu/drm/radeon/ni.c
> +++ b/drivers/gpu/drm/radeon/ni.c
> @@ -1547,6 +1547,7 @@ int cayman_resume(struct radeon_device *rdev)
>        r = cayman_startup(rdev);
>        if (r) {
>                DRM_ERROR("cayman startup failed on resume\n");
> +               rdev->accel_working = false;
>                return r;
>        }
>        return r;
> diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
> index bfd36ab..3563756 100644
> --- a/drivers/gpu/drm/radeon/r100.c
> +++ b/drivers/gpu/drm/radeon/r100.c
> @@ -3930,6 +3930,8 @@ static int r100_startup(struct radeon_device *rdev)
>
>  int r100_resume(struct radeon_device *rdev)
>  {
> +       int r;
> +
>        /* Make sur GART are not working */
>        if (rdev->flags & RADEON_IS_PCI)
>                r100_pci_gart_disable(rdev);
> @@ -3949,7 +3951,11 @@ int r100_resume(struct radeon_device *rdev)
>        radeon_surface_init(rdev);
>
>        rdev->accel_working = true;
> -       return r100_startup(rdev);
> +       r = r100_startup(rdev);
> +       if (r) {
> +               rdev->accel_working = false;
> +       }
> +       return r;
>  }
>
>  int r100_suspend(struct radeon_device *rdev)
> diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c
> index 3fc0d29..6829638 100644
> --- a/drivers/gpu/drm/radeon/r300.c
> +++ b/drivers/gpu/drm/radeon/r300.c
> @@ -1431,6 +1431,8 @@ static int r300_startup(struct radeon_device *rdev)
>
>  int r300_resume(struct radeon_device *rdev)
>  {
> +       int r;
> +
>        /* Make sur GART are not working */
>        if (rdev->flags & RADEON_IS_PCIE)
>                rv370_pcie_gart_disable(rdev);
> @@ -1452,7 +1454,11 @@ int r300_resume(struct radeon_device *rdev)
>        radeon_surface_init(rdev);
>
>        rdev->accel_working = true;
> -       return r300_startup(rdev);
> +       r = r300_startup(rdev);
> +       if (r) {
> +               rdev->accel_working = false;
> +       }
> +       return r;
>  }
>
>  int r300_suspend(struct radeon_device *rdev)
> diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c
> index 666e28f..b143230 100644
> --- a/drivers/gpu/drm/radeon/r420.c
> +++ b/drivers/gpu/drm/radeon/r420.c
> @@ -291,6 +291,8 @@ static int r420_startup(struct radeon_device *rdev)
>
>  int r420_resume(struct radeon_device *rdev)
>  {
> +       int r;
> +
>        /* Make sur GART are not working */
>        if (rdev->flags & RADEON_IS_PCIE)
>                rv370_pcie_gart_disable(rdev);
> @@ -316,7 +318,11 @@ int r420_resume(struct radeon_device *rdev)
>        radeon_surface_init(rdev);
>
>        rdev->accel_working = true;
> -       return r420_startup(rdev);
> +       r = r420_startup(rdev);
> +       if (r) {
> +               rdev->accel_working = false;
> +       }
> +       return r;
>  }
>
>  int r420_suspend(struct radeon_device *rdev)
> diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c
> index 4ae1615..25084e8 100644
> --- a/drivers/gpu/drm/radeon/r520.c
> +++ b/drivers/gpu/drm/radeon/r520.c
> @@ -218,6 +218,8 @@ static int r520_startup(struct radeon_device *rdev)
>
>  int r520_resume(struct radeon_device *rdev)
>  {
> +       int r;
> +
>        /* Make sur GART are not working */
>        if (rdev->flags & RADEON_IS_PCIE)
>                rv370_pcie_gart_disable(rdev);
> @@ -237,7 +239,11 @@ int r520_resume(struct radeon_device *rdev)
>        radeon_surface_init(rdev);
>
>        rdev->accel_working = true;
> -       return r520_startup(rdev);
> +       r = r520_startup(rdev);
> +       if (r) {
> +               rdev->accel_working = false;
> +       }
> +       return r;
>  }
>
>  int r520_init(struct radeon_device *rdev)
> diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
> index 4f08e5e..fbcd848 100644
> --- a/drivers/gpu/drm/radeon/r600.c
> +++ b/drivers/gpu/drm/radeon/r600.c
> @@ -2529,6 +2529,7 @@ int r600_resume(struct radeon_device *rdev)
>        r = r600_startup(rdev);
>        if (r) {
>                DRM_ERROR("r600 startup failed on resume\n");
> +               rdev->accel_working = false;
>                return r;
>        }
>
> diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
> index 435a3d9..e64bec4 100644
> --- a/drivers/gpu/drm/radeon/radeon_cs.c
> +++ b/drivers/gpu/drm/radeon/radeon_cs.c
> @@ -453,6 +453,10 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
>        int r;
>
>        radeon_mutex_lock(&rdev->cs_mutex);
> +       if (!rdev->accel_working) {
> +               radeon_mutex_unlock(&rdev->cs_mutex);
> +               return -EBUSY;
> +       }
>        /* initialize parser */
>        memset(&parser, 0, sizeof(struct radeon_cs_parser));
>        parser.filp = filp;
> diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c
> index b0ce84a..866a05b 100644
> --- a/drivers/gpu/drm/radeon/rs400.c
> +++ b/drivers/gpu/drm/radeon/rs400.c
> @@ -442,6 +442,8 @@ static int rs400_startup(struct radeon_device *rdev)
>
>  int rs400_resume(struct radeon_device *rdev)
>  {
> +       int r;
> +
>        /* Make sur GART are not working */
>        rs400_gart_disable(rdev);
>        /* Resume clock before doing reset */
> @@ -462,7 +464,11 @@ int rs400_resume(struct radeon_device *rdev)
>        radeon_surface_init(rdev);
>
>        rdev->accel_working = true;
> -       return rs400_startup(rdev);
> +       r = rs400_startup(rdev);
> +       if (r) {
> +               rdev->accel_working = false;
> +       }
> +       return r;
>  }
>
>  int rs400_suspend(struct radeon_device *rdev)
> diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c
> index ec46eb4..a436ff1 100644
> --- a/drivers/gpu/drm/radeon/rs600.c
> +++ b/drivers/gpu/drm/radeon/rs600.c
> @@ -878,6 +878,8 @@ static int rs600_startup(struct radeon_device *rdev)
>
>  int rs600_resume(struct radeon_device *rdev)
>  {
> +       int r;
> +
>        /* Make sur GART are not working */
>        rs600_gart_disable(rdev);
>        /* Resume clock before doing reset */
> @@ -896,7 +898,11 @@ int rs600_resume(struct radeon_device *rdev)
>        radeon_surface_init(rdev);
>
>        rdev->accel_working = true;
> -       return rs600_startup(rdev);
> +       r = rs600_startup(rdev);
> +       if (r) {
> +               rdev->accel_working = false;
> +       }
> +       return r;
>  }
>
>  int rs600_suspend(struct radeon_device *rdev)
> diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c
> index 4f24a0f..f68dff2 100644
> --- a/drivers/gpu/drm/radeon/rs690.c
> +++ b/drivers/gpu/drm/radeon/rs690.c
> @@ -659,6 +659,8 @@ static int rs690_startup(struct radeon_device *rdev)
>
>  int rs690_resume(struct radeon_device *rdev)
>  {
> +       int r;
> +
>        /* Make sur GART are not working */
>        rs400_gart_disable(rdev);
>        /* Resume clock before doing reset */
> @@ -677,7 +679,11 @@ int rs690_resume(struct radeon_device *rdev)
>        radeon_surface_init(rdev);
>
>        rdev->accel_working = true;
> -       return rs690_startup(rdev);
> +       r = rs690_startup(rdev);
> +       if (r) {
> +               rdev->accel_working = false;
> +       }
> +       return r;
>  }
>
>  int rs690_suspend(struct radeon_device *rdev)
> diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c
> index 880637f..959bf44 100644
> --- a/drivers/gpu/drm/radeon/rv515.c
> +++ b/drivers/gpu/drm/radeon/rv515.c
> @@ -424,6 +424,8 @@ static int rv515_startup(struct radeon_device *rdev)
>
>  int rv515_resume(struct radeon_device *rdev)
>  {
> +       int r;
> +
>        /* Make sur GART are not working */
>        if (rdev->flags & RADEON_IS_PCIE)
>                rv370_pcie_gart_disable(rdev);
> @@ -443,7 +445,11 @@ int rv515_resume(struct radeon_device *rdev)
>        radeon_surface_init(rdev);
>
>        rdev->accel_working = true;
> -       return rv515_startup(rdev);
> +       r =  rv515_startup(rdev);
> +       if (r) {
> +               rdev->accel_working = false;
> +       }
> +       return r;
>  }
>
>  int rv515_suspend(struct radeon_device *rdev)
> diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
> index a1668b6..c049c0c 100644
> --- a/drivers/gpu/drm/radeon/rv770.c
> +++ b/drivers/gpu/drm/radeon/rv770.c
> @@ -1139,6 +1139,7 @@ int rv770_resume(struct radeon_device *rdev)
>        r = rv770_startup(rdev);
>        if (r) {
>                DRM_ERROR("r600 startup failed on resume\n");
> +               rdev->accel_working = false;
>                return r;
>        }
>
> --
> 1.7.7.1
>
> _______________________________________________
> 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