···2078 int ret;2079 bool lists_empty;20802081- DRM_INFO("GTT full, evicting everything: "2082- "%d objects [%d pinned], "2083- "%d object bytes [%d pinned], "2084- "%d/%d gtt bytes\n",2085- atomic_read(&dev->object_count),2086- atomic_read(&dev->pin_count),2087- atomic_read(&dev->object_memory),2088- atomic_read(&dev->pin_memory),2089- atomic_read(&dev->gtt_memory),2090- dev->gtt_total);2091-2092 spin_lock(&dev_priv->mm.active_list_lock);2093 lists_empty = (list_empty(&dev_priv->mm.inactive_list) &&2094 list_empty(&dev_priv->mm.flushing_list) &&2095 list_empty(&dev_priv->mm.active_list));2096 spin_unlock(&dev_priv->mm.active_list_lock);20972098- if (lists_empty) {2099- DRM_ERROR("GTT full, but lists empty!\n");2100 return -ENOSPC;2101- }21022103 /* Flush everything (on to the inactive lists) and evict */2104 i915_gem_flush(dev, I915_GEM_GPU_DOMAINS, I915_GEM_GPU_DOMAINS);···2196 * large enough to swap out for the new one, so just evict2197 * everything and start again. (This should be rare.)2198 */2199- if (!list_empty (&dev_priv->mm.inactive_list)) {2200- DRM_INFO("GTT full, evicting inactive buffers\n");2201 return i915_gem_evict_from_inactive_list(dev);2202- } else2203 return i915_gem_evict_everything(dev);2204 }2205}···2223 BUG_ON(obj_priv->pages != NULL);2224 obj_priv->pages = drm_calloc_large(page_count, sizeof(struct page *));2225 if (obj_priv->pages == NULL) {2226- DRM_ERROR("Failed to allocate page list\n");2227 obj_priv->pages_refcount--;2228 return -ENOMEM;2229 }···2590 DRM_INFO("%s: GTT full, evicting something\n", __func__);2591#endif2592 ret = i915_gem_evict_something(dev, obj->size);2593- if (ret != 0) {2594- if (ret != -ERESTARTSYS)2595- DRM_ERROR("Failed to evict a buffer %d\n", ret);2596 return ret;2597- }2598 goto search_free;2599 }2600···2617 /* first try to clear up some space from the GTT */2618 ret = i915_gem_evict_something(dev, obj->size);2619 if (ret) {2620- if (ret != -ERESTARTSYS)2621- DRM_ERROR("Failed to allocate space for backing pages %d\n", ret);2622-2623 /* now try to shrink everyone else */2624 if (! retry_alloc) {2625 retry_alloc = true;···2646 obj_priv->gtt_space = NULL;26472648 ret = i915_gem_evict_something(dev, obj->size);2649- if (ret) {2650- if (ret != -ERESTARTSYS)2651- DRM_ERROR("Failed to allocate space to bind AGP: %d\n", ret);2652 return ret;2653- }26542655 goto search_free;2656 }···3847 i915_verify_inactive(dev, __FILE__, __LINE__);3848 if (obj_priv->gtt_space == NULL) {3849 ret = i915_gem_object_bind_to_gtt(obj, alignment);3850- if (ret != 0) {3851- if (ret != -EBUSY && ret != -ERESTARTSYS)3852- DRM_ERROR("Failure to bind: %d\n", ret);3853 return ret;3854- }3855 }3856 /*3857 * Pre-965 chips need a fence register set up in order to
···2078 int ret;2079 bool lists_empty;2080000000000002081 spin_lock(&dev_priv->mm.active_list_lock);2082 lists_empty = (list_empty(&dev_priv->mm.inactive_list) &&2083 list_empty(&dev_priv->mm.flushing_list) &&2084 list_empty(&dev_priv->mm.active_list));2085 spin_unlock(&dev_priv->mm.active_list_lock);20862087+ if (lists_empty)02088 return -ENOSPC;020892090 /* Flush everything (on to the inactive lists) and evict */2091 i915_gem_flush(dev, I915_GEM_GPU_DOMAINS, I915_GEM_GPU_DOMAINS);···2209 * large enough to swap out for the new one, so just evict2210 * everything and start again. (This should be rare.)2211 */2212+ if (!list_empty (&dev_priv->mm.inactive_list))02213 return i915_gem_evict_from_inactive_list(dev);2214+ else2215 return i915_gem_evict_everything(dev);2216 }2217}···2237 BUG_ON(obj_priv->pages != NULL);2238 obj_priv->pages = drm_calloc_large(page_count, sizeof(struct page *));2239 if (obj_priv->pages == NULL) {02240 obj_priv->pages_refcount--;2241 return -ENOMEM;2242 }···2605 DRM_INFO("%s: GTT full, evicting something\n", __func__);2606#endif2607 ret = i915_gem_evict_something(dev, obj->size);2608+ if (ret)002609 return ret;2610+2611 goto search_free;2612 }2613···2634 /* first try to clear up some space from the GTT */2635 ret = i915_gem_evict_something(dev, obj->size);2636 if (ret) {0002637 /* now try to shrink everyone else */2638 if (! retry_alloc) {2639 retry_alloc = true;···2666 obj_priv->gtt_space = NULL;26672668 ret = i915_gem_evict_something(dev, obj->size);2669+ if (ret)002670 return ret;026712672 goto search_free;2673 }···3870 i915_verify_inactive(dev, __FILE__, __LINE__);3871 if (obj_priv->gtt_space == NULL) {3872 ret = i915_gem_object_bind_to_gtt(obj, alignment);3873+ if (ret)003874 return ret;03875 }3876 /*3877 * Pre-965 chips need a fence register set up in order to