* [PATCH] drm/i915: Drop ORIGIN_GTT for untracked GTT writes
@ 2016-08-18 8:20 Chris Wilson
2016-08-18 8:30 ` ✗ Ro.CI.BAT: failure for " Patchwork
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Chris Wilson @ 2016-08-18 8:20 UTC (permalink / raw)
To: intel-gfx; +Cc: Daniel Vetter, Zanoni, Paulo R
If FBC is set on a framebuffer that is unmapped, all GTT faults will be
from a partial mapping. Writes by the user through the partial VMA are
then untracked by the FBC and so we must use the ORIGIN_CPU when flushing
the I915_GEM_DOMAIN_GTT.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Daniel Vetter <daniel.vetter@intel.com>
Cc: "Zanoni, Paulo R" <paulo.r.zanoni@intel.com>
---
drivers/gpu/drm/i915/i915_drv.h | 2 +-
drivers/gpu/drm/i915/i915_gem.c | 20 ++++++++++----------
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index ed2ab4c9be99..bb8de4c5a8c6 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2240,6 +2240,7 @@ struct drm_i915_gem_object {
unsigned int cache_dirty:1;
atomic_t frontbuffer_bits;
+ unsigned int frontbuffer_ggtt_origin; /* write only */
/** Current tiling stride for the object, if it's tiled. */
unsigned int tiling_and_stride;
@@ -2247,7 +2248,6 @@ struct drm_i915_gem_object {
#define TILING_MASK (FENCE_MINIMUM_STRIDE-1)
#define STRIDE_MASK (~TILING_MASK)
- unsigned int has_wc_mmap;
/** Count of VMA actually bound by this object */
unsigned int bind_count;
unsigned int pin_display;
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index d07ff0138deb..ae5c0c98457f 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1341,13 +1341,6 @@ err:
return ret;
}
-static enum fb_op_origin
-write_origin(struct drm_i915_gem_object *obj, unsigned domain)
-{
- return domain == I915_GEM_DOMAIN_GTT && !obj->has_wc_mmap ?
- ORIGIN_GTT : ORIGIN_CPU;
-}
-
/**
* Called when user space prepares to use an object with the CPU, either
* through the mmap ioctl's mapping or a GTT mapping.
@@ -1410,7 +1403,7 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
mutex_unlock(&dev->struct_mutex);
if (write_domain != 0)
- intel_fb_obj_invalidate(obj, write_origin(obj, write_domain));
+ intel_fb_obj_invalidate(obj, obj->frontbuffer_ggtt_origin);
err_pages:
i915_gem_object_unpin_pages(obj);
err_unlocked:
@@ -1515,7 +1508,7 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data,
up_write(&mm->mmap_sem);
/* This may race, but that's ok, it only gets set */
- WRITE_ONCE(obj->has_wc_mmap, true);
+ WRITE_ONCE(obj->frontbuffer_ggtt_origin, ORIGIN_CPU);
}
i915_gem_object_put(obj);
if (IS_ERR((void *)addr))
@@ -1629,6 +1622,11 @@ int i915_gem_fault(struct vm_area_struct *area, struct vm_fault *vmf)
if (chunk_size >= obj->base.size >> PAGE_SHIFT)
view.type = I915_GGTT_VIEW_NORMAL;
+ /* Userspace is now writing through an untracked VMA, abandon
+ * all hope that the hardware is able to track future writes.
+ */
+ obj->frontbuffer_ggtt_origin = ORIGIN_CPU;
+
vma = i915_gem_object_ggtt_pin(obj, &view, 0, 0, PIN_MAPPABLE);
}
if (IS_ERR(vma)) {
@@ -3105,7 +3103,7 @@ i915_gem_object_flush_gtt_write_domain(struct drm_i915_gem_object *obj)
if (INTEL_GEN(dev_priv) >= 6 && !HAS_LLC(dev_priv))
POSTING_READ(RING_ACTHD(dev_priv->engine[RCS].mmio_base));
- intel_fb_obj_flush(obj, false, write_origin(obj, I915_GEM_DOMAIN_GTT));
+ intel_fb_obj_flush(obj, false, obj->frontbuffer_ggtt_origin);
obj->base.write_domain = 0;
trace_i915_gem_object_change_domain(obj,
@@ -4007,6 +4005,8 @@ void i915_gem_object_init(struct drm_i915_gem_object *obj,
obj->ops = ops;
+ obj->frontbuffer_ggtt_origin = ORIGIN_GTT;
+
obj->mm.madv = I915_MADV_WILLNEED;
INIT_RADIX_TREE(&obj->mm.get_page.radix, GFP_KERNEL);
mutex_init(&obj->mm.get_page.lock);
--
2.9.3
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 5+ messages in thread
* ✗ Ro.CI.BAT: failure for drm/i915: Drop ORIGIN_GTT for untracked GTT writes
2016-08-18 8:20 [PATCH] drm/i915: Drop ORIGIN_GTT for untracked GTT writes Chris Wilson
@ 2016-08-18 8:30 ` Patchwork
2016-08-18 14:26 ` [PATCH v2] " Chris Wilson
2016-08-18 14:30 ` ✗ Ro.CI.BAT: failure for drm/i915: Drop ORIGIN_GTT for untracked GTT writes (rev2) Patchwork
2 siblings, 0 replies; 5+ messages in thread
From: Patchwork @ 2016-08-18 8:30 UTC (permalink / raw)
To: Chris Wilson; +Cc: intel-gfx
== Series Details ==
Series: drm/i915: Drop ORIGIN_GTT for untracked GTT writes
URL : https://patchwork.freedesktop.org/series/11255/
State : failure
== Summary ==
Applying: drm/i915: Drop ORIGIN_GTT for untracked GTT writes
fatal: sha1 information is lacking or useless (drivers/gpu/drm/i915/i915_drv.h).
error: could not build fake ancestor
Patch failed at 0001 drm/i915: Drop ORIGIN_GTT for untracked GTT writes
The copy of the patch that failed is found in: .git/rebase-apply/patch
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2] drm/i915: Drop ORIGIN_GTT for untracked GTT writes
2016-08-18 8:20 [PATCH] drm/i915: Drop ORIGIN_GTT for untracked GTT writes Chris Wilson
2016-08-18 8:30 ` ✗ Ro.CI.BAT: failure for " Patchwork
@ 2016-08-18 14:26 ` Chris Wilson
2016-08-18 14:56 ` Joonas Lahtinen
2016-08-18 14:30 ` ✗ Ro.CI.BAT: failure for drm/i915: Drop ORIGIN_GTT for untracked GTT writes (rev2) Patchwork
2 siblings, 1 reply; 5+ messages in thread
From: Chris Wilson @ 2016-08-18 14:26 UTC (permalink / raw)
To: intel-gfx; +Cc: Daniel Vetter, Zanoni, Paulo R
If FBC is set on a framebuffer that is unmapped, all GTT faults will be
from a partial mapping. Writes by the user through the partial VMA are
then untracked by the FBC and so we must use the ORIGIN_CPU when flushing
the I915_GEM_DOMAIN_GTT.
v2: Keep ORIGIN_CPU for set-to-domain(.write=CPU)
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Daniel Vetter <daniel.vetter@intel.com>
Cc: "Zanoni, Paulo R" <paulo.r.zanoni@intel.com>
---
drivers/gpu/drm/i915/i915_drv.h | 2 +-
drivers/gpu/drm/i915/i915_gem.c | 29 ++++++++++++++++++-----------
2 files changed, 19 insertions(+), 12 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 56d439374fe5..9386523464ea 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2198,6 +2198,7 @@ struct drm_i915_gem_object {
unsigned int cache_dirty:1;
atomic_t frontbuffer_bits;
+ unsigned int frontbuffer_ggtt_origin; /* write once */
/** Current tiling stride for the object, if it's tiled. */
unsigned int tiling_and_stride;
@@ -2205,7 +2206,6 @@ struct drm_i915_gem_object {
#define TILING_MASK (FENCE_MINIMUM_STRIDE-1)
#define STRIDE_MASK (~TILING_MASK)
- unsigned int has_wc_mmap;
/** Count of VMA actually bound by this object */
unsigned int bind_count;
unsigned int pin_display;
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index ba4c58df65ed..5d81820e0e55 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1494,13 +1494,6 @@ err:
return ret;
}
-static enum fb_op_origin
-write_origin(struct drm_i915_gem_object *obj, unsigned domain)
-{
- return domain == I915_GEM_DOMAIN_GTT && !obj->has_wc_mmap ?
- ORIGIN_GTT : ORIGIN_CPU;
-}
-
/**
* Called when user space prepares to use an object with the CPU, either
* through the mmap ioctl's mapping or a GTT mapping.
@@ -1549,8 +1542,16 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
else
ret = i915_gem_object_set_to_cpu_domain(obj, write_domain != 0);
- if (write_domain != 0)
- intel_fb_obj_invalidate(obj, write_origin(obj, write_domain));
+ if (write_domain != 0) {
+ unsigned int origin;
+
+ if (write_domain == I915_GEM_DOMAIN_CPU)
+ origin = ORIGIN_CPU;
+ else
+ origin = obj->frontbuffer_ggtt_origin;
+
+ intel_fb_obj_invalidate(obj, origin);
+ }
i915_gem_object_put(obj);
mutex_unlock(&dev->struct_mutex);
@@ -1658,7 +1659,7 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data,
up_write(&mm->mmap_sem);
/* This may race, but that's ok, it only gets set */
- WRITE_ONCE(obj->has_wc_mmap, true);
+ WRITE_ONCE(obj->frontbuffer_ggtt_origin, ORIGIN_CPU);
}
i915_gem_object_put_unlocked(obj);
if (IS_ERR((void *)addr))
@@ -1761,6 +1762,11 @@ int i915_gem_fault(struct vm_area_struct *area, struct vm_fault *vmf)
if (chunk_size >= obj->base.size >> PAGE_SHIFT)
view.type = I915_GGTT_VIEW_NORMAL;
+ /* Userspace is now writing through an untracked VMA, abandon
+ * all hope that the hardware is able to track future writes.
+ */
+ obj->frontbuffer_ggtt_origin = ORIGIN_CPU;
+
vma = i915_gem_object_ggtt_pin(obj, &view, 0, 0, PIN_MAPPABLE);
}
if (IS_ERR(vma)) {
@@ -3222,7 +3228,7 @@ i915_gem_object_flush_gtt_write_domain(struct drm_i915_gem_object *obj)
if (INTEL_GEN(dev_priv) >= 6 && !HAS_LLC(dev_priv))
POSTING_READ(RING_ACTHD(dev_priv->engine[RCS].mmio_base));
- intel_fb_obj_flush(obj, false, write_origin(obj, I915_GEM_DOMAIN_GTT));
+ intel_fb_obj_flush(obj, false, obj->frontbuffer_ggtt_origin);
obj->base.write_domain = 0;
trace_i915_gem_object_change_domain(obj,
@@ -4093,6 +4099,7 @@ void i915_gem_object_init(struct drm_i915_gem_object *obj,
obj->ops = ops;
+ obj->frontbuffer_ggtt_origin = ORIGIN_GTT;
obj->madv = I915_MADV_WILLNEED;
i915_gem_info_add_obj(to_i915(obj->base.dev), obj->base.size);
--
2.9.3
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 5+ messages in thread
* ✗ Ro.CI.BAT: failure for drm/i915: Drop ORIGIN_GTT for untracked GTT writes (rev2)
2016-08-18 8:20 [PATCH] drm/i915: Drop ORIGIN_GTT for untracked GTT writes Chris Wilson
2016-08-18 8:30 ` ✗ Ro.CI.BAT: failure for " Patchwork
2016-08-18 14:26 ` [PATCH v2] " Chris Wilson
@ 2016-08-18 14:30 ` Patchwork
2 siblings, 0 replies; 5+ messages in thread
From: Patchwork @ 2016-08-18 14:30 UTC (permalink / raw)
To: Chris Wilson; +Cc: intel-gfx
== Series Details ==
Series: drm/i915: Drop ORIGIN_GTT for untracked GTT writes (rev2)
URL : https://patchwork.freedesktop.org/series/11255/
State : failure
== Summary ==
Applying: drm/i915: Drop ORIGIN_GTT for untracked GTT writes
fatal: sha1 information is lacking or useless (drivers/gpu/drm/i915/i915_drv.h).
error: could not build fake ancestor
Patch failed at 0001 drm/i915: Drop ORIGIN_GTT for untracked GTT writes
The copy of the patch that failed is found in: .git/rebase-apply/patch
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] drm/i915: Drop ORIGIN_GTT for untracked GTT writes
2016-08-18 14:26 ` [PATCH v2] " Chris Wilson
@ 2016-08-18 14:56 ` Joonas Lahtinen
0 siblings, 0 replies; 5+ messages in thread
From: Joonas Lahtinen @ 2016-08-18 14:56 UTC (permalink / raw)
To: Chris Wilson, intel-gfx; +Cc: Daniel Vetter, Zanoni, Paulo R
On to, 2016-08-18 at 15:26 +0100, Chris Wilson wrote:
> If FBC is set on a framebuffer that is unmapped, all GTT faults will be
> from a partial mapping. Writes by the user through the partial VMA are
> then untracked by the FBC and so we must use the ORIGIN_CPU when flushing
> the I915_GEM_DOMAIN_GTT.
>
> v2: Keep ORIGIN_CPU for set-to-domain(.write=CPU)
>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
--
Joonas Lahtinen
Open Source Technology Center
Intel Corporation
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2016-08-18 14:56 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-08-18 8:20 [PATCH] drm/i915: Drop ORIGIN_GTT for untracked GTT writes Chris Wilson
2016-08-18 8:30 ` ✗ Ro.CI.BAT: failure for " Patchwork
2016-08-18 14:26 ` [PATCH v2] " Chris Wilson
2016-08-18 14:56 ` Joonas Lahtinen
2016-08-18 14:30 ` ✗ Ro.CI.BAT: failure for drm/i915: Drop ORIGIN_GTT for untracked GTT writes (rev2) Patchwork
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.