drm/i915: Ensure OLS & PLR are always in sync
authorJohn Harrison <John.C.Harrison@Intel.com>
Mon, 24 Nov 2014 18:49:23 +0000 (18:49 +0000)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 3 Dec 2014 08:35:13 +0000 (09:35 +0100)
The aim is to replace seqno values with request structures. A step along the way
is to switch to using the PLR in preference to the OLS. That requires the PLR to
only be valid when and only when the OLS is also valid. I.e., the two must be
kept in lock step. Then, code which was using the OLS can be safely switched
over to using the PLR instead.

For: VIZ-4377
Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
Reviewed-by: Thomas Daniel <Thomas.Daniel@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/intel_lrc.c
drivers/gpu/drm/i915/intel_ringbuffer.c

index 03b5c04b6ee15296768256f57e5ac63a72b2e390..cc49b8492ee4ce558d2f0bd514a36d3092c4a563 100644 (file)
@@ -879,37 +879,48 @@ void intel_lr_context_unpin(struct intel_engine_cs *ring,
 static int logical_ring_alloc_seqno(struct intel_engine_cs *ring,
                                    struct intel_context *ctx)
 {
+       struct drm_i915_gem_request *request;
        int ret;
 
-       if (ring->outstanding_lazy_seqno)
-               return 0;
+       /* XXX: The aim is to replace seqno values with request structures.
+        * A step along the way is to switch to using the PLR in preference
+        * to the OLS. That requires the PLR to only be valid when the OLS is
+        * also valid. I.e., the two must be kept in step. */
 
-       if (ring->preallocated_lazy_request == NULL) {
-               struct drm_i915_gem_request *request;
+       if (ring->outstanding_lazy_seqno) {
+               WARN_ON(ring->preallocated_lazy_request == NULL);
+               return 0;
+       }
+       WARN_ON(ring->preallocated_lazy_request != NULL);
 
-               request = kmalloc(sizeof(*request), GFP_KERNEL);
-               if (request == NULL)
-                       return -ENOMEM;
+       request = kmalloc(sizeof(*request), GFP_KERNEL);
+       if (request == NULL)
+               return -ENOMEM;
 
-               if (ctx != ring->default_context) {
-                       ret = intel_lr_context_pin(ring, ctx);
-                       if (ret) {
-                               kfree(request);
-                               return ret;
-                       }
+       if (ctx != ring->default_context) {
+               ret = intel_lr_context_pin(ring, ctx);
+               if (ret) {
+                       kfree(request);
+                       return ret;
                }
+       }
 
-               /* Hold a reference to the context this request belongs to
-                * (we will need it when the time comes to emit/retire the
-                * request).
-                */
-               request->ctx = ctx;
-               i915_gem_context_reference(request->ctx);
-
-               ring->preallocated_lazy_request = request;
+       ret = i915_gem_get_seqno(ring->dev, &ring->outstanding_lazy_seqno);
+       if (ret) {
+               intel_lr_context_unpin(ring, ctx);
+               kfree(request);
+               return ret;
        }
 
-       return i915_gem_get_seqno(ring->dev, &ring->outstanding_lazy_seqno);
+       /* Hold a reference to the context this request belongs to
+        * (we will need it when the time comes to emit/retire the
+        * request).
+        */
+       request->ctx = ctx;
+       i915_gem_context_reference(request->ctx);
+
+       ring->preallocated_lazy_request = request;
+       return 0;
 }
 
 static int logical_ring_wait_request(struct intel_ringbuffer *ringbuf,
index 1d01b51ff058bd597fc636fa3530069973972104..9fe13075e5f95a2b333a2e46c6cfc9ba75bce3bc 100644 (file)
@@ -2024,20 +2024,33 @@ int intel_ring_idle(struct intel_engine_cs *ring)
 static int
 intel_ring_alloc_seqno(struct intel_engine_cs *ring)
 {
-       if (ring->outstanding_lazy_seqno)
+       int ret;
+       struct drm_i915_gem_request *request;
+
+       /* XXX: The aim is to replace seqno values with request structures.
+        * A step along the way is to switch to using the PLR in preference
+        * to the OLS. That requires the PLR to only be valid when the OLS
+        * is also valid. I.e., the two must be kept in step. */
+
+       if (ring->outstanding_lazy_seqno) {
+               WARN_ON(ring->preallocated_lazy_request == NULL);
                return 0;
+       }
 
-       if (ring->preallocated_lazy_request == NULL) {
-               struct drm_i915_gem_request *request;
+       WARN_ON(ring->preallocated_lazy_request != NULL);
 
-               request = kmalloc(sizeof(*request), GFP_KERNEL);
-               if (request == NULL)
-                       return -ENOMEM;
+       request = kmalloc(sizeof(*request), GFP_KERNEL);
+       if (request == NULL)
+               return -ENOMEM;
 
-               ring->preallocated_lazy_request = request;
+       ret = i915_gem_get_seqno(ring->dev, &ring->outstanding_lazy_seqno);
+       if (ret) {
+               kfree(request);
+               return ret;
        }
 
-       return i915_gem_get_seqno(ring->dev, &ring->outstanding_lazy_seqno);
+       ring->preallocated_lazy_request = request;
+       return 0;
 }
 
 static int __intel_ring_prepare(struct intel_engine_cs *ring,