OSDN Git Service

Make sure we read fence->signaled while spinlocked.
authorThomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Wed, 13 Jun 2007 13:38:59 +0000 (15:38 +0200)
committerThomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Wed, 13 Jun 2007 13:38:59 +0000 (15:38 +0200)
linux-core/drm_bo.c
linux-core/drm_fence.c
linux-core/drm_objects.h

index bcb5c95..1c0eebd 100644 (file)
@@ -268,7 +268,7 @@ int drm_bo_wait(drm_buffer_object_t * bo, int lazy, int ignore_signals,
 
        if (fence) {
                drm_device_t *dev = bo->dev;
-               if (drm_fence_object_signaled(fence, bo->fence_type)) {
+               if (drm_fence_object_signaled(dev, fence, bo->fence_type, 0)) {
                        drm_fence_usage_deref_unlocked(dev, fence);
                        bo->fence = NULL;
                        return 0;
@@ -337,7 +337,8 @@ static void drm_bo_cleanup_refs(drm_buffer_object_t * bo, int remove_all)
 
        DRM_FLAG_MASKED(bo->priv_flags, 0, _DRM_BO_FLAG_UNFENCED);
 
-       if (bo->fence && drm_fence_object_signaled(bo->fence, bo->fence_type)) {
+       if (bo->fence && drm_fence_object_signaled(dev, bo->fence, 
+                                                  bo->fence_type, 0)) {
                drm_fence_usage_deref_unlocked(dev, bo->fence);
                bo->fence = NULL;
        }
@@ -944,7 +945,7 @@ static int drm_bo_quick_busy(drm_buffer_object_t * bo)
        BUG_ON(bo->priv_flags & _DRM_BO_FLAG_UNFENCED);
        if (fence) {
                drm_device_t *dev = bo->dev;
-               if (drm_fence_object_signaled(fence, bo->fence_type)) {
+               if (drm_fence_object_signaled(dev, fence, bo->fence_type, 0)) {
                        drm_fence_usage_deref_unlocked(dev, fence);
                        bo->fence = NULL;
                        return 0;
@@ -966,13 +967,13 @@ static int drm_bo_busy(drm_buffer_object_t * bo)
        BUG_ON(bo->priv_flags & _DRM_BO_FLAG_UNFENCED);
        if (fence) {
                drm_device_t *dev = bo->dev;
-               if (drm_fence_object_signaled(fence, bo->fence_type)) {
+               if (drm_fence_object_signaled(dev, fence, bo->fence_type, 0)) {
                        drm_fence_usage_deref_unlocked(dev, fence);
                        bo->fence = NULL;
                        return 0;
                }
                drm_fence_object_flush(dev, fence, DRM_FENCE_TYPE_EXE);
-               if (drm_fence_object_signaled(fence, bo->fence_type)) {
+               if (drm_fence_object_signaled(dev, fence, bo->fence_type, 0)) {
                        drm_fence_usage_deref_unlocked(dev, fence);
                        bo->fence = NULL;
                        return 0;
index ce161dc..70baad9 100644 (file)
@@ -164,7 +164,7 @@ static void drm_fence_object_destroy(drm_file_t * priv,
        drm_fence_usage_deref_locked(dev, fence);
 }
 
-static int fence_signaled(drm_device_t * dev,
+int drm_fence_object_signaled(drm_device_t * dev,
                          drm_fence_object_t * fence,
                          uint32_t mask, int poke_flush)
 {
@@ -200,12 +200,6 @@ static void drm_fence_flush_exe(drm_fence_class_manager_t * fc,
        }
 }
 
-int drm_fence_object_signaled(drm_fence_object_t * fence,
-                             uint32_t type)
-{
-       return ((fence->signaled & type) == type);
-}
-
 int drm_fence_object_flush(drm_device_t * dev,
                           drm_fence_object_t * fence,
                           uint32_t type)
@@ -298,13 +292,13 @@ static int drm_fence_lazy_wait(drm_device_t *dev,
 
        do {
                DRM_WAIT_ON(ret, fc->fence_queue, 3 * DRM_HZ,
-                           (signaled = fence_signaled(dev, fence, mask, 1)));
+                           (signaled = drm_fence_object_signaled(dev, fence, mask, 1)));
                if (signaled)
                        return 0;
                if (time_after_eq(jiffies, _end))
                        break;
        } while (ret == -EINTR && ignore_signals);
-       if (fence_signaled(dev, fence, mask, 0))
+       if (drm_fence_object_signaled(dev, fence, mask, 0))
                return 0;
        if (time_after_eq(jiffies, _end))
                ret = -EBUSY;
@@ -334,7 +328,7 @@ int drm_fence_object_wait(drm_device_t * dev,
                return -EINVAL;
        }
 
-       if (fence_signaled(dev, fence, mask, 0))
+       if (drm_fence_object_signaled(dev, fence, mask, 0))
                return 0;
 
        _end = jiffies + 3 * DRM_HZ;
@@ -365,7 +359,7 @@ int drm_fence_object_wait(drm_device_t * dev,
                                return ret;
                }
        }
-       if (drm_fence_object_signaled(fence, mask))
+       if (drm_fence_object_signaled(dev, fence, mask, 0))
                return 0;
 
        /*
@@ -377,7 +371,7 @@ int drm_fence_object_wait(drm_device_t * dev,
 #endif
        do {
                schedule();
-               signaled = fence_signaled(dev, fence, mask, 1);
+               signaled = drm_fence_object_signaled(dev, fence, mask, 1);
        } while (!signaled && !time_after_eq(jiffies, _end));
 
        if (!signaled)
index 03ea927..42c8e53 100644 (file)
@@ -198,7 +198,9 @@ extern void drm_fence_flush_old(struct drm_device *dev, uint32_t class,
                                uint32_t sequence);
 extern int drm_fence_object_flush(struct drm_device *dev,
                                  drm_fence_object_t * fence, uint32_t type);
-extern int drm_fence_object_signaled(drm_fence_object_t * fence, uint32_t type);
+extern int drm_fence_object_signaled(struct drm_device *dev, 
+                                    drm_fence_object_t * fence, 
+                                    uint32_t type, int flush);
 extern void drm_fence_usage_deref_locked(struct drm_device *dev,
                                         drm_fence_object_t * fence);
 extern void drm_fence_usage_deref_unlocked(struct drm_device *dev,