Commit 8201c1fa authored by Chris Wilson's avatar Chris Wilson

drm/i915: Clip the partial view against the object not vma

The VMA is later clipped against the vm_area_struct before insertion of
the faulting PTE so we are free to create the partial view as we desire.
If we use the object as the extents rather than the area, this partial
can then be used for other areas.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170110095633.6612-2-chris@chris-wilson.co.uk
parent 2d4281bb
...@@ -1751,7 +1751,6 @@ int i915_gem_mmap_gtt_version(void) ...@@ -1751,7 +1751,6 @@ int i915_gem_mmap_gtt_version(void)
static inline struct i915_ggtt_view static inline struct i915_ggtt_view
compute_partial_view(struct drm_i915_gem_object *obj, compute_partial_view(struct drm_i915_gem_object *obj,
struct vm_area_struct *area,
pgoff_t page_offset, pgoff_t page_offset,
unsigned int chunk) unsigned int chunk)
{ {
...@@ -1765,7 +1764,7 @@ compute_partial_view(struct drm_i915_gem_object *obj, ...@@ -1765,7 +1764,7 @@ compute_partial_view(struct drm_i915_gem_object *obj,
view.params.partial.offset = rounddown(page_offset, chunk); view.params.partial.offset = rounddown(page_offset, chunk);
view.params.partial.size = view.params.partial.size =
min_t(unsigned int, chunk, min_t(unsigned int, chunk,
vma_pages(area) - view.params.partial.offset); (obj->base.size >> PAGE_SHIFT) - view.params.partial.offset);
/* If the partial covers the entire object, just create a normal VMA. */ /* If the partial covers the entire object, just create a normal VMA. */
if (chunk >= obj->base.size >> PAGE_SHIFT) if (chunk >= obj->base.size >> PAGE_SHIFT)
...@@ -1852,8 +1851,7 @@ int i915_gem_fault(struct vm_area_struct *area, struct vm_fault *vmf) ...@@ -1852,8 +1851,7 @@ int i915_gem_fault(struct vm_area_struct *area, struct vm_fault *vmf)
if (IS_ERR(vma)) { if (IS_ERR(vma)) {
/* Use a partial view if it is bigger than available space */ /* Use a partial view if it is bigger than available space */
struct i915_ggtt_view view = struct i915_ggtt_view view =
compute_partial_view(obj, area, compute_partial_view(obj, page_offset, MIN_CHUNK_PAGES);
page_offset, MIN_CHUNK_PAGES);
/* Userspace is now writing through an untracked VMA, abandon /* Userspace is now writing through an untracked VMA, abandon
* all hope that the hardware is able to track future writes. * all hope that the hardware is able to track future writes.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment