From 2363d794d436b56383ff959f2ddfb58d87b0554f4a6da84b48c4a06ff06ce69d Mon Sep 17 00:00:00 2001 From: Stefan Dirsch Date: Wed, 21 Apr 2010 14:30:41 +0000 Subject: [PATCH 1/3] Accepting request 38448 from home:eeich:branches:X11:XOrg Copy from home:eeich:branches:X11:XOrg/xorg-x11-server via accept of submit request 38448 revision 4. Request was accepted with message: reviewed ok. OBS-URL: https://build.opensuse.org/request/show/38448 OBS-URL: https://build.opensuse.org/package/show/X11:XOrg/xorg-x11-server?expand=0&rev=253 --- ...arms-from-senslessly-calling-CheckTr.patch | 80 +++++++++++++++++++ xorg-x11-server.changes | 9 +++ xorg-x11-server.spec | 6 +- 3 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch diff --git a/0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch b/0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch new file mode 100644 index 0000000..81c2ae4 --- /dev/null +++ b/0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch @@ -0,0 +1,80 @@ +From d1d9d4e5f8f9ac1d22e1258759d6ee9e49c7fe90 Mon Sep 17 00:00:00 2001 +From: Egbert Eich +Date: Fri, 9 Apr 2010 15:10:32 +0200 +Subject: [PATCH] Prevent XSync Alarms from senslessly calling CheckTrigger() when inactive. + +If an XSync Alarm is set to inactive there is no need to check if a trigger +needs to fire. Doing so if the counter is the IdleCounter will put the +server on 100 percent CPU load since the select timeout is set to 0. +--- + xorg-server-1.8.0/Xext/sync.c | 11 +++++++++-- + xorg-server-1.8.0/Xext/syncsrv.h | 1 + + 2 files changed, 10 insertions(+), 2 deletions(-) + +diff --git a/xorg-server-1.8.0/Xext/sync.c b/xorg-server-1.8.0/Xext/sync.c +index fd7b1ad..4c45399 100644 +--- a/Xext/sync.c ++++ b/Xext/sync.c +@@ -518,6 +518,10 @@ SyncAlarmTriggerFired(SyncTrigger *pTrigger) + pAlarm->state = XSyncAlarmInactive; + } + } ++ /* Stop server from looping! */ ++ if (pAlarm->state == XSyncAlarmInactive) ++ SyncDeleteTriggerFromCounter(&pAlarm->trigger); ++ + /* The AlarmNotify event has to have the "new state of the alarm" + * which we can't be sure of until this point. However, it has + * to have the "old" trigger test value. That's the reason for +@@ -730,7 +734,7 @@ SyncChangeAlarmAttributes(ClientPtr client, SyncAlarm *pAlarm, Mask mask, + XSyncCounter counter; + Mask origmask = mask; + +- counter = pAlarm->trigger.pCounter ? pAlarm->trigger.pCounter->id : None; ++ counter = pAlarm->counter_id; + + while (mask) + { +@@ -741,7 +745,7 @@ SyncChangeAlarmAttributes(ClientPtr client, SyncAlarm *pAlarm, Mask mask, + case XSyncCACounter: + mask &= ~XSyncCACounter; + /* sanity check in SyncInitTrigger */ +- counter = *values++; ++ counter = pAlarm->counter_id = *values++; + break; + + case XSyncCAValueType: +@@ -815,6 +819,7 @@ SyncChangeAlarmAttributes(ClientPtr client, SyncAlarm *pAlarm, Mask mask, + return status; + + /* XXX spec does not really say to do this - needs clarification */ ++ /* It's the only place where it is set to XSyncAlarmActive! */ + pAlarm->state = XSyncAlarmActive; + return Success; + } +@@ -1617,8 +1622,10 @@ ProcSyncCreateAlarm(ClientPtr client) + + pAlarm->client = client; + pAlarm->alarm_id = stuff->id; ++ pAlarm->counter_id = None; + XSyncIntToValue(&pAlarm->delta, 1L); + pAlarm->events = TRUE; ++ /* SyncChangeAlarmAttributes() changes this - no need to set this here! */ + pAlarm->state = XSyncAlarmInactive; + pAlarm->pEventClients = NULL; + status = SyncChangeAlarmAttributes(client, pAlarm, vmask, +diff --git a/xorg-server-1.8.0/Xext/syncsrv.h b/xorg-server-1.8.0/Xext/syncsrv.h +index 6d0e3d6..527729d 100644 +--- a/Xext/syncsrv.h ++++ b/Xext/syncsrv.h +@@ -129,6 +129,7 @@ typedef struct _SyncAlarm { + int events; + int state; + SyncAlarmClientList *pEventClients; ++ XSyncCounter counter_id; + } SyncAlarm; + + typedef struct { +-- +1.6.4.2 + diff --git a/xorg-x11-server.changes b/xorg-x11-server.changes index 2554e54..2b1b95f 100644 --- a/xorg-x11-server.changes +++ b/xorg-x11-server.changes @@ -1,3 +1,12 @@ +------------------------------------------------------------------- +Wed Apr 21 16:03:07 CEST 2010 - eich@suse.de + +- Prevent XSync Alarms from senslessly calling CheckTrigger() when inactive. + If an XSync Alarm is set to inactive there is no need to check if a trigger + needs to fire. Doing so if the counter is the IdleCounter will put the + server on 100 percent CPU load since the select timeout is set to 0 + (bnc #584919). + ------------------------------------------------------------------- Sat Apr 10 20:54:18 CEST 2010 - sndirsch@suse.de diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec index 8d1af25..d447936 100644 --- a/xorg-x11-server.spec +++ b/xorg-x11-server.spec @@ -110,8 +110,9 @@ Patch205: xorg-server-1.8.0.diff Patch206: fix_fglrx_screendepth_issue.patch Patch207: xorg-server-option_libxf86config.diff Patch208: xorg-evdev-conf.diff -Patch209: sw_cursor_on_randr.patch -Patch210: pio_ia64.diff +Patch209: sw_cursor_on_randr.patch +Patch210: pio_ia64.diff +Patch211: 0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch %if %moblin Patch300: moblin-use_preferred_mode_for_all_outputs.diff %endif @@ -234,6 +235,7 @@ popd %patch208 -p0 %patch209 -p1 %patch210 -p1 +%patch211 -p1 %if %moblin %patch300 -p1 %endif From ec0b0f548a40bf798752087f24f4a617098691dcd35ae6c27e645f80b82f50f5 Mon Sep 17 00:00:00 2001 From: OBS User autobuild Date: Wed, 21 Apr 2010 15:58:38 +0000 Subject: [PATCH 2/3] Accepting request 38450 from X11:XOrg checked in (request 38450) OBS-URL: https://build.opensuse.org/request/show/38450 OBS-URL: https://build.opensuse.org/package/show/X11:XOrg/xorg-x11-server?expand=0&rev=254 --- ...arms-from-senslessly-calling-CheckTr.patch | 80 ------------------- xorg-x11-server.changes | 9 --- xorg-x11-server.spec | 6 +- 3 files changed, 2 insertions(+), 93 deletions(-) delete mode 100644 0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch diff --git a/0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch b/0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch deleted file mode 100644 index 81c2ae4..0000000 --- a/0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch +++ /dev/null @@ -1,80 +0,0 @@ -From d1d9d4e5f8f9ac1d22e1258759d6ee9e49c7fe90 Mon Sep 17 00:00:00 2001 -From: Egbert Eich -Date: Fri, 9 Apr 2010 15:10:32 +0200 -Subject: [PATCH] Prevent XSync Alarms from senslessly calling CheckTrigger() when inactive. - -If an XSync Alarm is set to inactive there is no need to check if a trigger -needs to fire. Doing so if the counter is the IdleCounter will put the -server on 100 percent CPU load since the select timeout is set to 0. ---- - xorg-server-1.8.0/Xext/sync.c | 11 +++++++++-- - xorg-server-1.8.0/Xext/syncsrv.h | 1 + - 2 files changed, 10 insertions(+), 2 deletions(-) - -diff --git a/xorg-server-1.8.0/Xext/sync.c b/xorg-server-1.8.0/Xext/sync.c -index fd7b1ad..4c45399 100644 ---- a/Xext/sync.c -+++ b/Xext/sync.c -@@ -518,6 +518,10 @@ SyncAlarmTriggerFired(SyncTrigger *pTrigger) - pAlarm->state = XSyncAlarmInactive; - } - } -+ /* Stop server from looping! */ -+ if (pAlarm->state == XSyncAlarmInactive) -+ SyncDeleteTriggerFromCounter(&pAlarm->trigger); -+ - /* The AlarmNotify event has to have the "new state of the alarm" - * which we can't be sure of until this point. However, it has - * to have the "old" trigger test value. That's the reason for -@@ -730,7 +734,7 @@ SyncChangeAlarmAttributes(ClientPtr client, SyncAlarm *pAlarm, Mask mask, - XSyncCounter counter; - Mask origmask = mask; - -- counter = pAlarm->trigger.pCounter ? pAlarm->trigger.pCounter->id : None; -+ counter = pAlarm->counter_id; - - while (mask) - { -@@ -741,7 +745,7 @@ SyncChangeAlarmAttributes(ClientPtr client, SyncAlarm *pAlarm, Mask mask, - case XSyncCACounter: - mask &= ~XSyncCACounter; - /* sanity check in SyncInitTrigger */ -- counter = *values++; -+ counter = pAlarm->counter_id = *values++; - break; - - case XSyncCAValueType: -@@ -815,6 +819,7 @@ SyncChangeAlarmAttributes(ClientPtr client, SyncAlarm *pAlarm, Mask mask, - return status; - - /* XXX spec does not really say to do this - needs clarification */ -+ /* It's the only place where it is set to XSyncAlarmActive! */ - pAlarm->state = XSyncAlarmActive; - return Success; - } -@@ -1617,8 +1622,10 @@ ProcSyncCreateAlarm(ClientPtr client) - - pAlarm->client = client; - pAlarm->alarm_id = stuff->id; -+ pAlarm->counter_id = None; - XSyncIntToValue(&pAlarm->delta, 1L); - pAlarm->events = TRUE; -+ /* SyncChangeAlarmAttributes() changes this - no need to set this here! */ - pAlarm->state = XSyncAlarmInactive; - pAlarm->pEventClients = NULL; - status = SyncChangeAlarmAttributes(client, pAlarm, vmask, -diff --git a/xorg-server-1.8.0/Xext/syncsrv.h b/xorg-server-1.8.0/Xext/syncsrv.h -index 6d0e3d6..527729d 100644 ---- a/Xext/syncsrv.h -+++ b/Xext/syncsrv.h -@@ -129,6 +129,7 @@ typedef struct _SyncAlarm { - int events; - int state; - SyncAlarmClientList *pEventClients; -+ XSyncCounter counter_id; - } SyncAlarm; - - typedef struct { --- -1.6.4.2 - diff --git a/xorg-x11-server.changes b/xorg-x11-server.changes index 2b1b95f..2554e54 100644 --- a/xorg-x11-server.changes +++ b/xorg-x11-server.changes @@ -1,12 +1,3 @@ -------------------------------------------------------------------- -Wed Apr 21 16:03:07 CEST 2010 - eich@suse.de - -- Prevent XSync Alarms from senslessly calling CheckTrigger() when inactive. - If an XSync Alarm is set to inactive there is no need to check if a trigger - needs to fire. Doing so if the counter is the IdleCounter will put the - server on 100 percent CPU load since the select timeout is set to 0 - (bnc #584919). - ------------------------------------------------------------------- Sat Apr 10 20:54:18 CEST 2010 - sndirsch@suse.de diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec index d447936..8d1af25 100644 --- a/xorg-x11-server.spec +++ b/xorg-x11-server.spec @@ -110,9 +110,8 @@ Patch205: xorg-server-1.8.0.diff Patch206: fix_fglrx_screendepth_issue.patch Patch207: xorg-server-option_libxf86config.diff Patch208: xorg-evdev-conf.diff -Patch209: sw_cursor_on_randr.patch -Patch210: pio_ia64.diff -Patch211: 0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch +Patch209: sw_cursor_on_randr.patch +Patch210: pio_ia64.diff %if %moblin Patch300: moblin-use_preferred_mode_for_all_outputs.diff %endif @@ -235,7 +234,6 @@ popd %patch208 -p0 %patch209 -p1 %patch210 -p1 -%patch211 -p1 %if %moblin %patch300 -p1 %endif From b787b275df42d77b43b7af3193e84ea01e97ca90ea065579c4bafab19ee7d753 Mon Sep 17 00:00:00 2001 From: OBS User buildservice-autocommit Date: Wed, 21 Apr 2010 15:58:39 +0000 Subject: [PATCH 3/3] Updating link to change in openSUSE:Factory/xorg-x11-server revision 164.0 OBS-URL: https://build.opensuse.org/package/show/X11:XOrg/xorg-x11-server?expand=0&rev=32bcb1b039c753cc91d0e69ee590496e --- ...arms-from-senslessly-calling-CheckTr.patch | 80 +++++++++++++++++++ xorg-x11-server.changes | 9 +++ xorg-x11-server.spec | 4 +- 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch diff --git a/0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch b/0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch new file mode 100644 index 0000000..81c2ae4 --- /dev/null +++ b/0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch @@ -0,0 +1,80 @@ +From d1d9d4e5f8f9ac1d22e1258759d6ee9e49c7fe90 Mon Sep 17 00:00:00 2001 +From: Egbert Eich +Date: Fri, 9 Apr 2010 15:10:32 +0200 +Subject: [PATCH] Prevent XSync Alarms from senslessly calling CheckTrigger() when inactive. + +If an XSync Alarm is set to inactive there is no need to check if a trigger +needs to fire. Doing so if the counter is the IdleCounter will put the +server on 100 percent CPU load since the select timeout is set to 0. +--- + xorg-server-1.8.0/Xext/sync.c | 11 +++++++++-- + xorg-server-1.8.0/Xext/syncsrv.h | 1 + + 2 files changed, 10 insertions(+), 2 deletions(-) + +diff --git a/xorg-server-1.8.0/Xext/sync.c b/xorg-server-1.8.0/Xext/sync.c +index fd7b1ad..4c45399 100644 +--- a/Xext/sync.c ++++ b/Xext/sync.c +@@ -518,6 +518,10 @@ SyncAlarmTriggerFired(SyncTrigger *pTrigger) + pAlarm->state = XSyncAlarmInactive; + } + } ++ /* Stop server from looping! */ ++ if (pAlarm->state == XSyncAlarmInactive) ++ SyncDeleteTriggerFromCounter(&pAlarm->trigger); ++ + /* The AlarmNotify event has to have the "new state of the alarm" + * which we can't be sure of until this point. However, it has + * to have the "old" trigger test value. That's the reason for +@@ -730,7 +734,7 @@ SyncChangeAlarmAttributes(ClientPtr client, SyncAlarm *pAlarm, Mask mask, + XSyncCounter counter; + Mask origmask = mask; + +- counter = pAlarm->trigger.pCounter ? pAlarm->trigger.pCounter->id : None; ++ counter = pAlarm->counter_id; + + while (mask) + { +@@ -741,7 +745,7 @@ SyncChangeAlarmAttributes(ClientPtr client, SyncAlarm *pAlarm, Mask mask, + case XSyncCACounter: + mask &= ~XSyncCACounter; + /* sanity check in SyncInitTrigger */ +- counter = *values++; ++ counter = pAlarm->counter_id = *values++; + break; + + case XSyncCAValueType: +@@ -815,6 +819,7 @@ SyncChangeAlarmAttributes(ClientPtr client, SyncAlarm *pAlarm, Mask mask, + return status; + + /* XXX spec does not really say to do this - needs clarification */ ++ /* It's the only place where it is set to XSyncAlarmActive! */ + pAlarm->state = XSyncAlarmActive; + return Success; + } +@@ -1617,8 +1622,10 @@ ProcSyncCreateAlarm(ClientPtr client) + + pAlarm->client = client; + pAlarm->alarm_id = stuff->id; ++ pAlarm->counter_id = None; + XSyncIntToValue(&pAlarm->delta, 1L); + pAlarm->events = TRUE; ++ /* SyncChangeAlarmAttributes() changes this - no need to set this here! */ + pAlarm->state = XSyncAlarmInactive; + pAlarm->pEventClients = NULL; + status = SyncChangeAlarmAttributes(client, pAlarm, vmask, +diff --git a/xorg-server-1.8.0/Xext/syncsrv.h b/xorg-server-1.8.0/Xext/syncsrv.h +index 6d0e3d6..527729d 100644 +--- a/Xext/syncsrv.h ++++ b/Xext/syncsrv.h +@@ -129,6 +129,7 @@ typedef struct _SyncAlarm { + int events; + int state; + SyncAlarmClientList *pEventClients; ++ XSyncCounter counter_id; + } SyncAlarm; + + typedef struct { +-- +1.6.4.2 + diff --git a/xorg-x11-server.changes b/xorg-x11-server.changes index 2554e54..2b1b95f 100644 --- a/xorg-x11-server.changes +++ b/xorg-x11-server.changes @@ -1,3 +1,12 @@ +------------------------------------------------------------------- +Wed Apr 21 16:03:07 CEST 2010 - eich@suse.de + +- Prevent XSync Alarms from senslessly calling CheckTrigger() when inactive. + If an XSync Alarm is set to inactive there is no need to check if a trigger + needs to fire. Doing so if the counter is the IdleCounter will put the + server on 100 percent CPU load since the select timeout is set to 0 + (bnc #584919). + ------------------------------------------------------------------- Sat Apr 10 20:54:18 CEST 2010 - sndirsch@suse.de diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec index 8d1af25..9f02862 100644 --- a/xorg-x11-server.spec +++ b/xorg-x11-server.spec @@ -32,7 +32,7 @@ BuildRequires: libjpeg-devel %endif Url: http://xorg.freedesktop.org/ Version: 7.5_%{dirsuffix} -Release: 4 +Release: 5 License: GPLv2+ ; MIT License (or similar) BuildRoot: %{_tmppath}/%{name}-%{version}-build Group: System/X11/Servers/XF86_4 @@ -112,6 +112,7 @@ Patch207: xorg-server-option_libxf86config.diff Patch208: xorg-evdev-conf.diff Patch209: sw_cursor_on_randr.patch Patch210: pio_ia64.diff +Patch211: 0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch %if %moblin Patch300: moblin-use_preferred_mode_for_all_outputs.diff %endif @@ -234,6 +235,7 @@ popd %patch208 -p0 %patch209 -p1 %patch210 -p1 +%patch211 -p1 %if %moblin %patch300 -p1 %endif