aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_gem_evict.c
diff options
context:
space:
mode:
authorBen Widawsky <ben@bwidawsk.net>2013-07-31 20:00:10 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-08-08 08:04:20 -0400
commit07fe0b12800d4752d729d4122c01f41f80a5ba5a (patch)
tree3bfd8b851403196928f7652b1e929660ce788de8 /drivers/gpu/drm/i915/i915_gem_evict.c
parent80dcfdbd68b094f21f7ce222fb8039123f5b4cbe (diff)
drm/i915: plumb VM into bind/unbind code
As alluded to in several patches, and it will be reiterated later... A VMA is an abstraction for a GEM BO bound into an address space. Therefore it stands to reason, that the existing bind, and unbind are the ones which will be the most impacted. This patch implements this, and updates all callers which weren't already updated in the series (because it was too messy). This patch represents the bulk of an earlier, larger patch. I've pulled out a bunch of things by the request of Daniel. The history is preserved for posterity with the email convention of ">" One big change from the original patch aside from a bunch of cropping is I've created an i915_vma_unbind() function. That is because we always have the VMA anyway, and doing an extra lookup is useful. There is a caveat, we retain an i915_gem_object_ggtt_unbind, for the global cases which might not talk in VMAs. > drm/i915: plumb VM into object operations > > This patch was formerly known as: > "drm/i915: Create VMAs (part 3) - plumbing" > > This patch adds a VM argument, bind/unbind, and the object > offset/size/color getters/setters. It preserves the old ggtt helper > functions because things still need, and will continue to need them. > > Some code will still need to be ported over after this. > > v2: Fix purge to pick an object and unbind all vmas > This was doable because of the global bound list change. > > v3: With the commit to actually pin/unpin pages in place, there is no > longer a need to check if unbind succeeded before calling put_pages(). > Make put_pages only BUG() after checking pin count. > > v4: Rebased on top of the new hangcheck work by Mika > plumbed eb_destroy also > Many checkpatch related fixes > > v5: Very large rebase > > v6: > Change BUG_ON to WARN_ON (Daniel) > Rename vm to ggtt in preallocate stolen, since it is always ggtt when > dealing with stolen memory. (Daniel) > list_for_each will short-circuit already (Daniel) > remove superflous space (Daniel) > Use per object list of vmas (Daniel) > Make obj_bound_any() use obj_bound for each vm (Ben) > s/bind_to_gtt/bind_to_vm/ (Ben) > > Fixed up the inactive shrinker. As Daniel noticed the code could > potentially count the same object multiple times. While it's not > possible in the current case, since 1 object can only ever be bound into > 1 address space thus far - we may as well try to get something more > future proof in place now. With a prep patch before this to switch over > to using the bound list + inactive check, we're now able to carry that > forward for every address space an object is bound into. Signed-off-by: Ben Widawsky <ben@bwidawsk.net> [danvet: Rebase on top of the loss of "drm/i915: Cleanup more of VMA in destroy".] Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_evict.c')
-rw-r--r--drivers/gpu/drm/i915/i915_gem_evict.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c
index 33d85a4447a6..9205a4179b7e 100644
--- a/drivers/gpu/drm/i915/i915_gem_evict.c
+++ b/drivers/gpu/drm/i915/i915_gem_evict.c
@@ -147,7 +147,7 @@ found:
147 struct drm_i915_gem_object, 147 struct drm_i915_gem_object,
148 exec_list); 148 exec_list);
149 if (ret == 0) 149 if (ret == 0)
150 ret = i915_gem_object_unbind(obj); 150 ret = i915_gem_object_ggtt_unbind(obj);
151 151
152 list_del_init(&obj->exec_list); 152 list_del_init(&obj->exec_list);
153 drm_gem_object_unreference(&obj->base); 153 drm_gem_object_unreference(&obj->base);
@@ -185,7 +185,7 @@ i915_gem_evict_everything(struct drm_device *dev)
185 /* Having flushed everything, unbind() should never raise an error */ 185 /* Having flushed everything, unbind() should never raise an error */
186 list_for_each_entry_safe(obj, next, &vm->inactive_list, mm_list) 186 list_for_each_entry_safe(obj, next, &vm->inactive_list, mm_list)
187 if (obj->pin_count == 0) 187 if (obj->pin_count == 0)
188 WARN_ON(i915_gem_object_unbind(obj)); 188 WARN_ON(i915_gem_object_ggtt_unbind(obj));
189 189
190 return 0; 190 return 0;
191} 191}