A cmdbuf mutex to implement validate-submit-fence atomicity in the absence
authorThomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Mon, 22 Oct 2007 16:59:37 +0000 (18:59 +0200)
committerThomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Mon, 22 Oct 2007 16:59:37 +0000 (18:59 +0200)
of a hardware lock.

shared-core/i915_dma.c
shared-core/i915_drv.h

index 14a91f3..d07be6e 100644 (file)
@@ -213,6 +213,7 @@ static int i915_initialize(struct drm_device * dev,
        }
        DRM_DEBUG("Enabled hardware status page\n");
        dev->dev_private = (void *)dev_priv;
+       mutex_init(&dev_priv->cmdbuf_mutex);
        return 0;
 }
 
@@ -1023,11 +1024,23 @@ static int i915_execbuffer(struct drm_device *dev, void *data,
        if (ret) 
                return ret;
 
+       /*
+        * The cmdbuf_mutex makes sure the validate-submit-fence
+        * operation is atomic. 
+        */
+
+       ret = mutex_lock_interruptible(&dev_priv->cmdbuf_mutex);
+       if (ret) {
+               drm_bo_read_unlock(&dev->bm.bm_lock);
+               return -EAGAIN;
+       }
+
        num_buffers = exec_buf->num_buffers;
 
        buffers = drm_calloc(num_buffers, sizeof(struct drm_buffer_object *), DRM_MEM_DRIVER);
        if (!buffers) {
                drm_bo_read_unlock(&dev->bm.bm_lock);
+               mutex_unlock(&dev_priv->cmdbuf_mutex);
                return -ENOMEM;
         }
 
@@ -1073,6 +1086,8 @@ out_err0:
 
 out_free:
        drm_free(buffers, (exec_buf->num_buffers * sizeof(struct drm_buffer_object *)), DRM_MEM_DRIVER);
+
+       mutex_unlock(&dev_priv->cmdbuf_mutex);
        drm_bo_read_unlock(&dev->bm.bm_lock);
        return ret;
 }
index e8f1879..817288b 100644 (file)
@@ -139,6 +139,7 @@ typedef struct drm_i915_private {
 #ifdef I915_HAVE_BUFFER
        void *agp_iomap;
        unsigned int max_validate_buffers;
+       struct mutex cmdbuf_mutex;
 #endif
 
        DRM_SPINTYPE swaps_lock;