diff options
| author | Jerome Glisse <jglisse@redhat.com> | 2009-12-11 14:36:19 -0500 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2009-12-22 20:14:04 -0500 |
| commit | 0a0c7596c643239e8d4c3eaaba43b74a96f2411e (patch) | |
| tree | bb387597d7c8260a8cd2a18235cde90cc72c757d | |
| parent | d2efdf6d6f425950a61fa5cc3aa22e6718e7f3c8 (diff) | |
drm/radeon/kms: Avoid crash when trying to cleanup uninitialized structure
Add boolean to record if some part of the driver are initialized or
not this allow to avoid a crash when trying to cleanup uninitialized
structure members.
Signed-off-by: Jerome Glisse <jglisse@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_fence.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_ttm.c | 4 |
3 files changed, 13 insertions, 4 deletions
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index cd650fd3964e..53b55608102b 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
| @@ -162,6 +162,7 @@ struct radeon_fence_driver { | |||
| 162 | struct list_head created; | 162 | struct list_head created; |
| 163 | struct list_head emited; | 163 | struct list_head emited; |
| 164 | struct list_head signaled; | 164 | struct list_head signaled; |
| 165 | bool initialized; | ||
| 165 | }; | 166 | }; |
| 166 | 167 | ||
| 167 | struct radeon_fence { | 168 | struct radeon_fence { |
| @@ -202,8 +203,9 @@ struct radeon_surface_reg { | |||
| 202 | struct radeon_mman { | 203 | struct radeon_mman { |
| 203 | struct ttm_bo_global_ref bo_global_ref; | 204 | struct ttm_bo_global_ref bo_global_ref; |
| 204 | struct ttm_global_reference mem_global_ref; | 205 | struct ttm_global_reference mem_global_ref; |
| 205 | bool mem_global_referenced; | ||
| 206 | struct ttm_bo_device bdev; | 206 | struct ttm_bo_device bdev; |
| 207 | bool mem_global_referenced; | ||
| 208 | bool initialized; | ||
| 207 | }; | 209 | }; |
| 208 | 210 | ||
| 209 | struct radeon_bo { | 211 | struct radeon_bo { |
diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c index cb4cd97ae39f..4cdd8b4f7549 100644 --- a/drivers/gpu/drm/radeon/radeon_fence.c +++ b/drivers/gpu/drm/radeon/radeon_fence.c | |||
| @@ -324,7 +324,7 @@ int radeon_fence_driver_init(struct radeon_device *rdev) | |||
| 324 | write_lock_irqsave(&rdev->fence_drv.lock, irq_flags); | 324 | write_lock_irqsave(&rdev->fence_drv.lock, irq_flags); |
| 325 | r = radeon_scratch_get(rdev, &rdev->fence_drv.scratch_reg); | 325 | r = radeon_scratch_get(rdev, &rdev->fence_drv.scratch_reg); |
| 326 | if (r) { | 326 | if (r) { |
| 327 | DRM_ERROR("Fence failed to get a scratch register."); | 327 | dev_err(rdev->dev, "fence failed to get scratch register\n"); |
| 328 | write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags); | 328 | write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags); |
| 329 | return r; | 329 | return r; |
| 330 | } | 330 | } |
| @@ -335,9 +335,10 @@ int radeon_fence_driver_init(struct radeon_device *rdev) | |||
| 335 | INIT_LIST_HEAD(&rdev->fence_drv.signaled); | 335 | INIT_LIST_HEAD(&rdev->fence_drv.signaled); |
| 336 | rdev->fence_drv.count_timeout = 0; | 336 | rdev->fence_drv.count_timeout = 0; |
| 337 | init_waitqueue_head(&rdev->fence_drv.queue); | 337 | init_waitqueue_head(&rdev->fence_drv.queue); |
| 338 | rdev->fence_drv.initialized = true; | ||
| 338 | write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags); | 339 | write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags); |
| 339 | if (radeon_debugfs_fence_init(rdev)) { | 340 | if (radeon_debugfs_fence_init(rdev)) { |
| 340 | DRM_ERROR("Failed to register debugfs file for fence !\n"); | 341 | dev_err(rdev->dev, "fence debugfs file creation failed\n"); |
| 341 | } | 342 | } |
| 342 | return 0; | 343 | return 0; |
| 343 | } | 344 | } |
| @@ -346,11 +347,13 @@ void radeon_fence_driver_fini(struct radeon_device *rdev) | |||
| 346 | { | 347 | { |
| 347 | unsigned long irq_flags; | 348 | unsigned long irq_flags; |
| 348 | 349 | ||
| 350 | if (!rdev->fence_drv.initialized) | ||
| 351 | return; | ||
| 349 | wake_up_all(&rdev->fence_drv.queue); | 352 | wake_up_all(&rdev->fence_drv.queue); |
| 350 | write_lock_irqsave(&rdev->fence_drv.lock, irq_flags); | 353 | write_lock_irqsave(&rdev->fence_drv.lock, irq_flags); |
| 351 | radeon_scratch_free(rdev, rdev->fence_drv.scratch_reg); | 354 | radeon_scratch_free(rdev, rdev->fence_drv.scratch_reg); |
| 352 | write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags); | 355 | write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags); |
| 353 | DRM_INFO("radeon: fence finalized\n"); | 356 | rdev->fence_drv.initialized = false; |
| 354 | } | 357 | } |
| 355 | 358 | ||
| 356 | 359 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c index 7bed4122528c..a00450743d60 100644 --- a/drivers/gpu/drm/radeon/radeon_ttm.c +++ b/drivers/gpu/drm/radeon/radeon_ttm.c | |||
| @@ -494,6 +494,7 @@ int radeon_ttm_init(struct radeon_device *rdev) | |||
| 494 | DRM_ERROR("failed initializing buffer object driver(%d).\n", r); | 494 | DRM_ERROR("failed initializing buffer object driver(%d).\n", r); |
| 495 | return r; | 495 | return r; |
| 496 | } | 496 | } |
| 497 | rdev->mman.initialized = true; | ||
| 497 | r = ttm_bo_init_mm(&rdev->mman.bdev, TTM_PL_VRAM, | 498 | r = ttm_bo_init_mm(&rdev->mman.bdev, TTM_PL_VRAM, |
| 498 | rdev->mc.real_vram_size >> PAGE_SHIFT); | 499 | rdev->mc.real_vram_size >> PAGE_SHIFT); |
| 499 | if (r) { | 500 | if (r) { |
| @@ -541,6 +542,8 @@ void radeon_ttm_fini(struct radeon_device *rdev) | |||
| 541 | { | 542 | { |
| 542 | int r; | 543 | int r; |
| 543 | 544 | ||
| 545 | if (!rdev->mman.initialized) | ||
| 546 | return; | ||
| 544 | if (rdev->stollen_vga_memory) { | 547 | if (rdev->stollen_vga_memory) { |
| 545 | r = radeon_bo_reserve(rdev->stollen_vga_memory, false); | 548 | r = radeon_bo_reserve(rdev->stollen_vga_memory, false); |
| 546 | if (r == 0) { | 549 | if (r == 0) { |
| @@ -554,6 +557,7 @@ void radeon_ttm_fini(struct radeon_device *rdev) | |||
| 554 | ttm_bo_device_release(&rdev->mman.bdev); | 557 | ttm_bo_device_release(&rdev->mman.bdev); |
| 555 | radeon_gart_fini(rdev); | 558 | radeon_gart_fini(rdev); |
| 556 | radeon_ttm_global_fini(rdev); | 559 | radeon_ttm_global_fini(rdev); |
| 560 | rdev->mman.initialized = false; | ||
| 557 | DRM_INFO("radeon: ttm finalized\n"); | 561 | DRM_INFO("radeon: ttm finalized\n"); |
| 558 | } | 562 | } |
| 559 | 563 | ||
