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

Reply via email to