Replace the open-coded polling with schedule() in vmw_fallback_wait()
by schedule_hrtimeout(). The old code wakes up at jiffy granularity and
leads to unnecessary CPU wakeups during fence waits.

schedule_hrtimeout() provides high-resolution sleep with finer control,
reducing CPU utilization without affecting fence correctness. For the
non-interruptible case, use schedule_timeout_uninterruptible().

Signed-off-by: Pavan Bobba <opensource...@gmail.com>
---
 drivers/gpu/drm/vmwgfx/vmwgfx_irq.c | 16 ++++++----------
 1 file changed, 6 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c
index 05773eb394d3..64045b0efafc 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c
@@ -202,16 +202,12 @@ int vmw_fallback_wait(struct vmw_private *dev_priv,
                if (lazy)
                        schedule_timeout(1);
                else if ((++count & 0x0F) == 0) {
-                       /**
-                        * FIXME: Use schedule_hr_timeout here for
-                        * newer kernels and lower CPU utilization.
-                        */
-
-                       __set_current_state(TASK_RUNNING);
-                       schedule();
-                       __set_current_state((interruptible) ?
-                                           TASK_INTERRUPTIBLE :
-                                           TASK_UNINTERRUPTIBLE);
+                       ktime_t delta = ktime_set(0, NSEC_PER_MSEC);
+
+                       if (interruptible)
+                               schedule_hrtimeout(&delta, HRTIMER_MODE_REL);
+                       else
+                               schedule_timeout_uninterruptible(delta);
                }
                if (interruptible && signal_pending(current)) {
                        ret = -ERESTARTSYS;
-- 
2.43.0

Reply via email to