xserver-kdrive: add a patch from git master to reduce scheduling
authorRoss Burton <ross@openedhand.com>
Mon, 21 Jan 2008 17:46:08 +0000 (17:46 +0000)
committerRoss Burton <ross@openedhand.com>
Mon, 21 Jan 2008 17:46:08 +0000 (17:46 +0000)
git-svn-id: https://svn.o-hand.com/repos/poky/trunk@3565 311d38ba-8fff-0310-9ca6-ca027cbcb966

meta/packages/xorg-xserver/xserver-kdrive-1.3.0.0/scheduler.patch [new file with mode: 0644]
meta/packages/xorg-xserver/xserver-kdrive_1.3.0.0.bb

diff --git a/meta/packages/xorg-xserver/xserver-kdrive-1.3.0.0/scheduler.patch b/meta/packages/xorg-xserver/xserver-kdrive-1.3.0.0/scheduler.patch
new file mode 100644 (file)
index 0000000..395bc7d
--- /dev/null
@@ -0,0 +1,151 @@
+>From 48e4d08e99de41047c6b6fde5ba9d12787881c23 Mon Sep 17 00:00:00 2001
+From: root <root@benny.jf.intel.com>
+Date: Sun, 28 Oct 2007 09:37:52 +0100
+Subject: [PATCH] The smart scheduler itimer currently always fires after each request
+ (which in turn causes the CPU to wake out of idle, burning precious power).
+ Rather than doing this, just stop the timer before going into the select()
+ portion of the WaitFor loop. It's a cheap system call, and it will only get
+ called if there's no more commands batched up from the active fd.
+
+This change also allows some of the functions to be simplified; setitimer()
+will only fail if it's passed invalid data, and we don't do that... so make
+it void and remove all the conditional code that deals with failure.
+
+The change also allows us to remove a few variables that were used for
+housekeeping between the signal handler and the main loop.
+---
+ include/dixstruct.h |    6 ++----
+ os/WaitFor.c        |   11 +++--------
+ os/utils.c          |   28 +++-------------------------
+ 3 files changed, 8 insertions(+), 37 deletions(-)
+
+diff --git a/include/dixstruct.h b/include/dixstruct.h
+index dd6347f..bed31dc 100644
+--- a/include/dixstruct.h
++++ b/include/dixstruct.h
+@@ -150,11 +150,9 @@ extern long SmartScheduleTime;
+ extern long SmartScheduleInterval;
+ extern long SmartScheduleSlice;
+ extern long SmartScheduleMaxSlice;
+-extern unsigned long SmartScheduleIdleCount;
+ extern Bool SmartScheduleDisable;
+-extern Bool SmartScheduleIdle;
+-extern Bool SmartScheduleTimerStopped;
+-extern Bool SmartScheduleStartTimer(void);
++extern void SmartScheduleStartTimer(void);
++extern void SmartScheduleStopTimer(void);
+ #define SMART_MAX_PRIORITY  (20)
+ #define SMART_MIN_PRIORITY  (-20)
+diff --git a/os/WaitFor.c b/os/WaitFor.c
+index ec1592c..7683477 100644
+--- a/os/WaitFor.c
++++ b/os/WaitFor.c
+@@ -217,7 +217,8 @@ WaitForSomething(int *pClientsReady)
+       XFD_COPYSET(&AllSockets, &LastSelectMask);
+ #ifdef SMART_SCHEDULE
+       }
+-      SmartScheduleIdle = TRUE;
++      SmartScheduleStopTimer ();
++
+ #endif
+       BlockHandler((pointer)&wt, (pointer)&LastSelectMask);
+       if (NewOutputPending)
+@@ -237,13 +238,7 @@ WaitForSomething(int *pClientsReady)
+       selecterr = GetErrno();
+       WakeupHandler(i, (pointer)&LastSelectMask);
+ #ifdef SMART_SCHEDULE
+-      if (i >= 0)
+-      {
+-          SmartScheduleIdle = FALSE;
+-          SmartScheduleIdleCount = 0;
+-          if (SmartScheduleTimerStopped)
+-              (void) SmartScheduleStartTimer ();
+-      }
++      SmartScheduleStartTimer ();
+ #endif
+       if (i <= 0) /* An error or timeout occurred */
+       {
+diff --git a/os/utils.c b/os/utils.c
+index 31cb0af..6fc1f7d 100644
+--- a/os/utils.c
++++ b/os/utils.c
+@@ -1513,10 +1513,6 @@ XNFstrdup(const char *s)
+ #ifdef SMART_SCHEDULE
+-unsigned long SmartScheduleIdleCount;
+-Bool          SmartScheduleIdle;
+-Bool          SmartScheduleTimerStopped;
+-
+ #ifdef SIGVTALRM
+ #define SMART_SCHEDULE_POSSIBLE
+ #endif
+@@ -1526,7 +1522,7 @@ Bool             SmartScheduleTimerStopped;
+ #define SMART_SCHEDULE_TIMER          ITIMER_REAL
+ #endif
+-static void
++void
+ SmartScheduleStopTimer (void)
+ {
+ #ifdef SMART_SCHEDULE_POSSIBLE
+@@ -1537,38 +1533,28 @@ SmartScheduleStopTimer (void)
+     timer.it_value.tv_sec = 0;
+     timer.it_value.tv_usec = 0;
+     (void) setitimer (ITIMER_REAL, &timer, 0);
+-    SmartScheduleTimerStopped = TRUE;
+ #endif
+ }
+-Bool
++void
+ SmartScheduleStartTimer (void)
+ {
+ #ifdef SMART_SCHEDULE_POSSIBLE
+     struct itimerval  timer;
+     
+-    SmartScheduleTimerStopped = FALSE;
+     timer.it_interval.tv_sec = 0;
+     timer.it_interval.tv_usec = SmartScheduleInterval * 1000;
+     timer.it_value.tv_sec = 0;
+     timer.it_value.tv_usec = SmartScheduleInterval * 1000;
+-    return setitimer (ITIMER_REAL, &timer, 0) >= 0;
++    setitimer (ITIMER_REAL, &timer, 0);
+ #endif
+-    return FALSE;
+ }
+ #ifdef SMART_SCHEDULE_POSSIBLE
+ static void
+ SmartScheduleTimer (int sig)
+ {
+-    int olderrno = errno;
+-
+     SmartScheduleTime += SmartScheduleInterval;
+-    if (SmartScheduleIdle)
+-    {
+-      SmartScheduleStopTimer ();
+-    }
+-    errno = olderrno;
+ }
+ #endif
+@@ -1592,14 +1578,6 @@ SmartScheduleInit (void)
+       perror ("sigaction for smart scheduler");
+       return FALSE;
+     }
+-    /* Set up the virtual timer */
+-    if (!SmartScheduleStartTimer ())
+-    {
+-      perror ("scheduling timer");
+-      return FALSE;
+-    }
+-    /* stop the timer and wait for WaitForSomething to start it */
+-    SmartScheduleStopTimer ();
+     return TRUE;
+ #else
+     return FALSE;
+-- 
+1.5.3.4
+
index fa1563d..b2acdd5 100644 (file)
@@ -3,7 +3,7 @@ require xserver-kdrive.inc
 DEPENDS += "libxkbfile libxcalibrate"
 
 PE = "1"
-PR = "r17"
+PR = "r18"
 
 SRC_URI = "${XORG_MIRROR}/individual/xserver/xorg-server-${PV}.tar.bz2 \
        file://extra-kmodes.patch;patch=1 \
@@ -19,6 +19,7 @@ SRC_URI = "${XORG_MIRROR}/individual/xserver/xorg-server-${PV}.tar.bz2 \
        file://enable-tslib.patch;patch=1 \
        file://enable-xcalibrate.patch;patch=1 \
        file://hide-cursor-and-ppm-root.patch;patch=1 \
-       file://xcalibrate_coords.patch;patch=1"
+       file://xcalibrate_coords.patch;patch=1 \
+       file://scheduler.patch;patch=1"
 
 S = "${WORKDIR}/xorg-server-${PV}"