diff options
author | Thomas Hellstrom <thomas-at-tungstengraphics-dot-com> | 2008-03-12 10:07:56 +0100 |
---|---|---|
committer | Thomas Hellstrom <thomas-at-tungstengraphics-dot-com> | 2008-03-12 10:07:56 +0100 |
commit | 7bcce66a1d5c93ff9b9f20d45d5b2c33c8ca8da9 (patch) | |
tree | 915c6d03e40a03231a325195524def0477200e1d /linux-core | |
parent | f1a681ebe5573c2ec7806ba4cb754314baef6935 (diff) |
Fix kernel crash when we hit OOM conditions.
(Alan Hourihane)
Diffstat (limited to 'linux-core')
-rw-r--r-- | linux-core/drm_bo.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/linux-core/drm_bo.c b/linux-core/drm_bo.c index 51cd1756..2e210040 100644 --- a/linux-core/drm_bo.c +++ b/linux-core/drm_bo.c @@ -789,6 +789,11 @@ static int drm_bo_mem_force_space(struct drm_device *dev, } node = drm_mm_get_block(node, num_pages, mem->page_alignment); + if (unlikely(!node)) { + mutex_unlock(&dev->struct_mutex); + return -ENOMEM; + } + mutex_unlock(&dev->struct_mutex); mem->mm_node = node; mem->mem_type = mem_type; @@ -1482,6 +1487,9 @@ static int drm_buffer_object_validate(struct drm_buffer_object *bo, if (ret) { if (ret != -EAGAIN) DRM_ERROR("Failed moving buffer.\n"); + if (ret == -ENOMEM) + DRM_ERROR("Out of aperture space or " + "DRM memory quota.\n"); return ret; } } @@ -2747,7 +2755,7 @@ static int drm_bo_setup_vm_locked(struct drm_buffer_object *bo) list->file_offset_node = drm_mm_search_free(&dev->offset_manager, bo->mem.num_pages, 0, 0); - if (!list->file_offset_node) { + if (unlikely(!list->file_offset_node)) { drm_bo_takedown_vm_locked(bo); return -ENOMEM; } @@ -2755,6 +2763,11 @@ static int drm_bo_setup_vm_locked(struct drm_buffer_object *bo) list->file_offset_node = drm_mm_get_block(list->file_offset_node, bo->mem.num_pages, 0); + if (unlikely(!list->file_offset_node)) { + drm_bo_takedown_vm_locked(bo); + return -ENOMEM; + } + list->hash.key = list->file_offset_node->start; if (drm_ht_insert_item(&dev->map_hash, &list->hash)) { drm_bo_takedown_vm_locked(bo); |