drm/nouveau: Spin for a bit in nouveau_fence_wait() before yielding the CPU.
authorFrancisco Jerez <currojerez@riseup.net>
Thu, 25 Nov 2010 15:37:17 +0000 (16:37 +0100)
committerFrancisco Jerez <currojerez@riseup.net>
Wed, 8 Dec 2010 02:00:33 +0000 (03:00 +0100)
Sleeping doesn't pay off for very short delays in comparison with the
minimum granularity of schedule_timeout().

Signed-off-by: Francisco Jerez <currojerez@riseup.net>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_fence.c

index 2579fc6..abfeff1 100644 (file)
@@ -218,6 +218,7 @@ int
 __nouveau_fence_wait(void *sync_obj, void *sync_arg, bool lazy, bool intr)
 {
        unsigned long timeout = jiffies + (3 * DRM_HZ);
+       unsigned long sleep_time = jiffies + 1;
        int ret = 0;
 
        while (1) {
@@ -231,7 +232,7 @@ __nouveau_fence_wait(void *sync_obj, void *sync_arg, bool lazy, bool intr)
 
                __set_current_state(intr ? TASK_INTERRUPTIBLE
                        : TASK_UNINTERRUPTIBLE);
-               if (lazy)
+               if (lazy && time_after_eq(jiffies, sleep_time))
                        schedule_timeout(1);
 
                if (intr && signal_pending(current)) {