OSDN Git Service

Fix kernel crash when we hit OOM conditions.
authorThomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Wed, 12 Mar 2008 09:07:56 +0000 (10:07 +0100)
committerThomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Wed, 12 Mar 2008 09:07:56 +0000 (10:07 +0100)
(Alan Hourihane)

linux-core/drm_bo.c

index 51cd175..2e21004 100644 (file)
@@ -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);