All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] drm/nouveau: fix __nouveau_fence_wait performance regression
@ 2011-02-13 20:38 Marcin Slusarz
       [not found] ` <20110213203804.GA5395-OI9uyE9O0yo@public.gmane.org>
  0 siblings, 1 reply; 14+ messages in thread
From: Marcin Slusarz @ 2011-02-13 20:38 UTC (permalink / raw)
  To: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

Combination of locking and interchannel synchronization changes
uncovered poor behaviour of nouveau_fence_wait, which on HZ=100
configuration could waste up to 10 ms per call.
Depending on application, it lead to 10-30% FPS regression.
To fix it, shorten thread sleep time to 0.1 ms and ensure
spinning happens for at least one *full* tick.

Signed-off-by: Marcin Slusarz <marcin.slusarz-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
 drivers/gpu/drm/nouveau/nouveau_fence.c |   10 ++++++++--
 1 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.c b/drivers/gpu/drm/nouveau/nouveau_fence.c
index 221b846..75ba5e2 100644
--- a/drivers/gpu/drm/nouveau/nouveau_fence.c
+++ b/drivers/gpu/drm/nouveau/nouveau_fence.c
@@ -27,6 +27,9 @@
 #include "drmP.h"
 #include "drm.h"
 
+#include <linux/ktime.h>
+#include <linux/hrtimer.h>
+
 #include "nouveau_drv.h"
 #include "nouveau_ramht.h"
 #include "nouveau_dma.h"
@@ -230,9 +233,12 @@ 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;
+	unsigned long sleep_time = jiffies + 2;
+	ktime_t t;
 	int ret = 0;
 
+	t = ktime_set(0, NSEC_PER_MSEC / 10);
+
 	while (1) {
 		if (__nouveau_fence_signalled(sync_obj, sync_arg))
 			break;
@@ -245,7 +251,7 @@ __nouveau_fence_wait(void *sync_obj, void *sync_arg, bool lazy, bool intr)
 		__set_current_state(intr ? TASK_INTERRUPTIBLE
 			: TASK_UNINTERRUPTIBLE);
 		if (lazy && time_after_eq(jiffies, sleep_time))
-			schedule_timeout(1);
+			schedule_hrtimeout(&t, HRTIMER_MODE_REL);
 
 		if (intr && signal_pending(current)) {
 			ret = -ERESTARTSYS;
-- 
1.7.4.rc3

^ permalink raw reply related	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2011-03-09 18:04 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-02-13 20:38 [PATCH] drm/nouveau: fix __nouveau_fence_wait performance regression Marcin Slusarz
     [not found] ` <20110213203804.GA5395-OI9uyE9O0yo@public.gmane.org>
2011-02-21 12:40   ` Marcin Slusarz
2011-03-04 16:49   ` Marcin Slusarz
     [not found]     ` <20110304164905.GA2743-OI9uyE9O0yo@public.gmane.org>
2011-03-07 18:18       ` Maarten Maathuis
     [not found]         ` <AANLkTin_jouzPDGfNnYq_BRqPzbvOW+F6jFNuc7p=p5E-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2011-03-07 22:24           ` Ben Skeggs
2011-03-07 23:22             ` Marcin Slusarz
     [not found]               ` <20110307232256.GA2680-OI9uyE9O0yo@public.gmane.org>
2011-03-07 23:27                 ` Marcin Slusarz
     [not found]                   ` <20110307232719.GB2680-OI9uyE9O0yo@public.gmane.org>
2011-03-08  0:34                     ` Ben Skeggs
2011-03-08  0:58                 ` Francisco Jerez
     [not found]                   ` <87lj0qzaut.fsf-sGOZH3hwPm2sTnJN9+BGXg@public.gmane.org>
2011-03-08 12:16                     ` Marcin Slusarz
     [not found]                       ` <20110308121628.GA20238-OI9uyE9O0yo@public.gmane.org>
2011-03-08 16:22                         ` Francisco Jerez
     [not found]                           ` <871v2hzin7.fsf-sGOZH3hwPm2sTnJN9+BGXg@public.gmane.org>
2011-03-09  0:14                             ` Marcin Slusarz
     [not found]                               ` <20110309001404.GA22679-OI9uyE9O0yo@public.gmane.org>
2011-03-09 17:34                                 ` Francisco Jerez
     [not found]                                   ` <87fwqwb3kj.fsf-sGOZH3hwPm2sTnJN9+BGXg@public.gmane.org>
2011-03-09 18:04                                     ` Marcin Slusarz

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.