Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 228647
b: refs/heads/master
c: a6e0aa4
h: refs/heads/master
i:
  228645: ad3ef5a
  228643: 11af586
  228639: 77f99f0
v: v3
  • Loading branch information
Daniel Vetter authored and Chris Wilson committed Oct 27, 2010
1 parent 1223988 commit 7345afc
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 11 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: d935cc61d466f6cc7514032835f4fc379cb7e2ca
refs/heads/master: a6e0aa421406dc4cfd736c6d07d26ed39ab4f7bc
5 changes: 4 additions & 1 deletion trunk/drivers/gpu/drm/i915/i915_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -535,6 +535,8 @@ typedef struct drm_i915_private {
struct drm_mm vram;
/** Memory allocator for GTT */
struct drm_mm gtt_space;
/** End of mappable part of GTT */
unsigned long gtt_mappable_end;

struct io_mapping *gtt_mapping;
int gtt_mtrr;
Expand Down Expand Up @@ -1067,7 +1069,8 @@ void i915_gem_shrinker_init(void);
void i915_gem_shrinker_exit(void);

/* i915_gem_evict.c */
int i915_gem_evict_something(struct drm_device *dev, int min_size, unsigned alignment);
int i915_gem_evict_something(struct drm_device *dev, int min_size,
unsigned alignment, bool mappable);
int i915_gem_evict_everything(struct drm_device *dev);
int i915_gem_evict_inactive(struct drm_device *dev);

Expand Down
10 changes: 6 additions & 4 deletions trunk/drivers/gpu/drm/i915/i915_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,7 @@ int i915_gem_do_init(struct drm_device *dev,
end - start);

dev_priv->mm.gtt_total = end - start;
dev_priv->mm.gtt_mappable_end = end;

return 0;
}
Expand Down Expand Up @@ -413,7 +414,8 @@ i915_gem_object_get_pages_or_evict(struct drm_gem_object *obj)
struct drm_device *dev = obj->dev;

ret = i915_gem_evict_something(dev, obj->size,
i915_gem_get_gtt_alignment(obj));
i915_gem_get_gtt_alignment(obj),
false);
if (ret)
return ret;

Expand Down Expand Up @@ -2672,7 +2674,7 @@ i915_gem_object_bind_to_gtt(struct drm_gem_object *obj, unsigned alignment)
/* If the gtt is empty and we're still having trouble
* fitting our object in, we're out of memory.
*/
ret = i915_gem_evict_something(dev, obj->size, alignment);
ret = i915_gem_evict_something(dev, obj->size, alignment, true);
if (ret)
return ret;

Expand All @@ -2687,7 +2689,7 @@ i915_gem_object_bind_to_gtt(struct drm_gem_object *obj, unsigned alignment)
if (ret == -ENOMEM) {
/* first try to clear up some space from the GTT */
ret = i915_gem_evict_something(dev, obj->size,
alignment);
alignment, true);
if (ret) {
/* now try to shrink everyone else */
if (gfpmask) {
Expand Down Expand Up @@ -2717,7 +2719,7 @@ i915_gem_object_bind_to_gtt(struct drm_gem_object *obj, unsigned alignment)
drm_mm_put_block(obj_priv->gtt_space);
obj_priv->gtt_space = NULL;

ret = i915_gem_evict_something(dev, obj->size, alignment);
ret = i915_gem_evict_something(dev, obj->size, alignment, true);
if (ret)
return ret;

Expand Down
24 changes: 19 additions & 5 deletions trunk/drivers/gpu/drm/i915/i915_gem_evict.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ mark_free(struct drm_i915_gem_object *obj_priv,
}

int
i915_gem_evict_something(struct drm_device *dev, int min_size, unsigned alignment)
i915_gem_evict_something(struct drm_device *dev, int min_size,
unsigned alignment, bool mappable)
{
drm_i915_private_t *dev_priv = dev->dev_private;
struct list_head eviction_list, unwind_list;
Expand All @@ -51,9 +52,17 @@ i915_gem_evict_something(struct drm_device *dev, int min_size, unsigned alignmen
i915_gem_retire_requests(dev);

/* Re-check for free space after retiring requests */
if (drm_mm_search_free(&dev_priv->mm.gtt_space,
min_size, alignment, 0))
return 0;
if (mappable) {
if (drm_mm_search_free_in_range(&dev_priv->mm.gtt_space,
min_size, alignment, 0,
dev_priv->mm.gtt_mappable_end,
0))
return 0;
} else {
if (drm_mm_search_free(&dev_priv->mm.gtt_space,
min_size, alignment, 0))
return 0;
}

/*
* The goal is to evict objects and amalgamate space in LRU order.
Expand All @@ -79,7 +88,12 @@ i915_gem_evict_something(struct drm_device *dev, int min_size, unsigned alignmen
*/

INIT_LIST_HEAD(&unwind_list);
drm_mm_init_scan(&dev_priv->mm.gtt_space, min_size, alignment);
if (mappable)
drm_mm_init_scan_with_range(&dev_priv->mm.gtt_space, min_size,
alignment, 0,
dev_priv->mm.gtt_mappable_end);
else
drm_mm_init_scan(&dev_priv->mm.gtt_space, min_size, alignment);

/* First see if there is a large enough contiguous idle region... */
list_for_each_entry(obj_priv, &dev_priv->mm.inactive_list, mm_list) {
Expand Down

0 comments on commit 7345afc

Please sign in to comment.