From 10b973b1b0839fc0c0f420d3de2a0bb512889a26 Mon Sep 17 00:00:00 2001 From: Ross Burton Date: Mon, 21 Jan 2008 17:46:08 +0000 Subject: [PATCH] xserver-kdrive: add a patch from git master to reduce scheduling git-svn-id: https://svn.o-hand.com/repos/poky/trunk@3565 311d38ba-8fff-0310-9ca6-ca027cbcb966 --- .../xserver-kdrive-1.3.0.0/scheduler.patch | 151 +++++++++++++++++++++ .../xorg-xserver/xserver-kdrive_1.3.0.0.bb | 5 +- 2 files changed, 154 insertions(+), 2 deletions(-) create mode 100644 meta/packages/xorg-xserver/xserver-kdrive-1.3.0.0/scheduler.patch 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 0000000..395bc7d --- /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 +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 fa1563d..b2acdd5 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}" -- 2.7.4