summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--meta/packages/xorg-xserver/xserver-kdrive-1.3.0.0/scheduler.patch151
-rw-r--r--meta/packages/xorg-xserver/xserver-kdrive_1.3.0.0.bb5
2 files changed, 154 insertions, 2 deletions
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
index 000000000..395bc7d51
--- /dev/null
+++ b/meta/packages/xorg-xserver/xserver-kdrive-1.3.0.0/scheduler.patch
@@ -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
+
diff --git a/meta/packages/xorg-xserver/xserver-kdrive_1.3.0.0.bb b/meta/packages/xorg-xserver/xserver-kdrive_1.3.0.0.bb
index fa1563d54..b2acdd57c 100644
--- a/meta/packages/xorg-xserver/xserver-kdrive_1.3.0.0.bb
+++ b/meta/packages/xorg-xserver/xserver-kdrive_1.3.0.0.bb
@@ -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}"