[xorg-x11-server/f16] Re-do xf86IDrvMsg() logging to avoid spurious malloc during signal
Peter Hutterer
whot at fedoraproject.org
Tue Mar 27 05:04:30 UTC 2012
commit 9af4283a112a03678bd7c44db910e8133a839360
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date: Tue Mar 27 15:06:19 2012 +1000
Re-do xf86IDrvMsg() logging to avoid spurious malloc during signal
handlers (#754674)
...-LogMessageTypeVerbString-out-of-LogVMess.patch | 147 ++++++++++++++++++++
...os-log-Add-LogVHdrMessageVerb-and-friends.patch | 117 ++++++++++++++++
...use-LogHdrMessageVerb-in-xf86VIDrvMsgVerb.patch | 57 ++++++++
xorg-x11-server.spec | 11 ++-
4 files changed, 331 insertions(+), 1 deletions(-)
---
diff --git a/0001-os-log-Pull-LogMessageTypeVerbString-out-of-LogVMess.patch b/0001-os-log-Pull-LogMessageTypeVerbString-out-of-LogVMess.patch
new file mode 100644
index 0000000..98a9ba5
--- /dev/null
+++ b/0001-os-log-Pull-LogMessageTypeVerbString-out-of-LogVMess.patch
@@ -0,0 +1,147 @@
+From 6610e2b4a67bfdda9f146b01ba260b4de787e869 Mon Sep 17 00:00:00 2001
+From: Daniel Kurtz <djkurtz at chromium.org>
+Date: Mon, 8 Aug 2011 15:09:45 +0800
+Subject: [PATCH 1/3] os/log: Pull LogMessageTypeVerbString out of
+ LogVMessageVerb
+
+Also, optimize how the type and format strings are combined.
+
+Signed-off-by: Daniel Kurtz <djkurtz at chromium.org>
+Reviewed-by: Guillem Jover <guillem at hadrons.org>
+Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
+(cherry picked from commit b82f934db661c59d7397ce180d08cf8f8f7118b1)
+---
+ os/log.c | 106 ++++++++++++++++++++++++++++++++++----------------------------
+ 1 files changed, 58 insertions(+), 48 deletions(-)
+
+diff --git a/os/log.c b/os/log.c
+index f519762..4ff0180 100644
+--- a/os/log.c
++++ b/os/log.c
+@@ -165,6 +165,9 @@ asm (".desc ___crashreporter_info__, 0x10");
+ #ifndef X_NOT_IMPLEMENTED_STRING
+ #define X_NOT_IMPLEMENTED_STRING "(NI)"
+ #endif
++#ifndef X_NONE_STRING
++#define X_NONE_STRING ""
++#endif
+
+ /*
+ * LogInit is called to start logging to a file. It is also called (with
+@@ -325,58 +328,65 @@ LogWrite(int verb, const char *f, ...)
+ va_end(args);
+ }
+
++/* Returns the Message Type string to prepend to a logging message, or NULL
++ * if the message will be dropped due to insufficient verbosity. */
++static const char *
++LogMessageTypeVerbString(MessageType type, int verb)
++{
++ if (type == X_ERROR)
++ verb = 0;
++
++ if (logVerbosity < verb && logFileVerbosity < verb)
++ return NULL;
++
++ switch (type) {
++ case X_PROBED:
++ return X_PROBE_STRING;
++ case X_CONFIG:
++ return X_CONFIG_STRING;
++ case X_DEFAULT:
++ return X_DEFAULT_STRING;
++ case X_CMDLINE:
++ return X_CMDLINE_STRING;
++ case X_NOTICE:
++ return X_NOTICE_STRING;
++ case X_ERROR:
++ return X_ERROR_STRING;
++ case X_WARNING:
++ return X_WARNING_STRING;
++ case X_INFO:
++ return X_INFO_STRING;
++ case X_NOT_IMPLEMENTED:
++ return X_NOT_IMPLEMENTED_STRING;
++ case X_UNKNOWN:
++ return X_UNKNOWN_STRING;
++ case X_NONE:
++ return X_NONE_STRING;
++ default:
++ return X_UNKNOWN_STRING;
++ }
++}
++
+ void
+ LogVMessageVerb(MessageType type, int verb, const char *format, va_list args)
+ {
+- const char *s = X_UNKNOWN_STRING;
+- char tmpBuf[1024];
+-
+- /* Ignore verbosity for X_ERROR */
+- if (logVerbosity >= verb || logFileVerbosity >= verb || type == X_ERROR) {
+- switch (type) {
+- case X_PROBED:
+- s = X_PROBE_STRING;
+- break;
+- case X_CONFIG:
+- s = X_CONFIG_STRING;
+- break;
+- case X_DEFAULT:
+- s = X_DEFAULT_STRING;
+- break;
+- case X_CMDLINE:
+- s = X_CMDLINE_STRING;
+- break;
+- case X_NOTICE:
+- s = X_NOTICE_STRING;
+- break;
+- case X_ERROR:
+- s = X_ERROR_STRING;
+- if (verb > 0)
+- verb = 0;
+- break;
+- case X_WARNING:
+- s = X_WARNING_STRING;
+- break;
+- case X_INFO:
+- s = X_INFO_STRING;
+- break;
+- case X_NOT_IMPLEMENTED:
+- s = X_NOT_IMPLEMENTED_STRING;
+- break;
+- case X_UNKNOWN:
+- s = X_UNKNOWN_STRING;
+- break;
+- case X_NONE:
+- s = NULL;
+- break;
+- }
+-
+- /* if s is not NULL we need a space before format */
+- snprintf(tmpBuf, sizeof(tmpBuf), "%s%s%s", s ? s : "",
+- s ? " " : "",
+- format);
+- LogVWrite(verb, tmpBuf, args);
++ const char *type_str;
++ char tmpFormat[1024];
++ char *new_format;
++
++ type_str = LogMessageTypeVerbString(type, verb);
++ if (!type_str)
++ return;
++
++ /* if type_str is not "", prepend it and ' ', to format */
++ if (type_str[0] == '\0')
++ new_format = format;
++ else {
++ new_format = tmpFormat;
++ snprintf(tmpFormat, sizeof(tmpFormat), "%s %s", type_str, format);
+ }
++
++ LogVWrite(verb, new_format, args);
+ }
+
+ /* Log message with verbosity level specified. */
+--
+1.7.7.6
+
diff --git a/0002-os-log-Add-LogVHdrMessageVerb-and-friends.patch b/0002-os-log-Add-LogVHdrMessageVerb-and-friends.patch
new file mode 100644
index 0000000..c2649ad
--- /dev/null
+++ b/0002-os-log-Add-LogVHdrMessageVerb-and-friends.patch
@@ -0,0 +1,117 @@
+From be22618d8eba3a922bfaa14437cd1590c65995be Mon Sep 17 00:00:00 2001
+From: Daniel Kurtz <djkurtz at chromium.org>
+Date: Mon, 8 Aug 2011 15:09:46 +0800
+Subject: [PATCH 2/3] os/log: Add LogVHdrMessageVerb and friends
+
+LogVHdrMessageVerb allows a custom header to be inserted in a log message,
+between the Log system's MessageType string, and a formatted variable
+message body. The custom header can itself be a formatted variable string.
+
+These functions can be used, for example, by driver abstraction layers to
+format specific driver messages in a standard format, but do it in a way
+that is efficient, obeys the log-layers verbosity settings, and is safe
+to use in signal handlers (because they don't call malloc), even for
+types besides X_NONE.
+
+Signed-off-by: Daniel Kurtz <djkurtz at chromium.org>
+Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>
+Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
+(cherry picked from commit b31d104fc09a7241856ff8d226be11ec562beac3)
+---
+ include/os.h | 13 +++++++++++++
+ os/log.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 68 insertions(+), 0 deletions(-)
+
+diff --git a/include/os.h b/include/os.h
+index c9a8b3e..fda0181 100644
+--- a/include/os.h
++++ b/include/os.h
+@@ -526,6 +526,19 @@ extern _X_EXPORT void LogMessageVerb(MessageType type, int verb, const char *for
+ ...) _X_ATTRIBUTE_PRINTF(3,4);
+ extern _X_EXPORT void LogMessage(MessageType type, const char *format, ...)
+ _X_ATTRIBUTE_PRINTF(2,3);
++
++extern _X_EXPORT void LogVHdrMessageVerb(MessageType type, int verb,
++ const char *msg_format, va_list msg_args,
++ const char *hdr_format, va_list hdr_args)
++ _X_ATTRIBUTE_PRINTF(3,0) _X_ATTRIBUTE_PRINTF(5,0);
++extern _X_EXPORT void LogHdrMessageVerb(MessageType type, int verb,
++ const char *msg_format, va_list msg_args,
++ const char *hdr_format, ...)
++ _X_ATTRIBUTE_PRINTF(3,0) _X_ATTRIBUTE_PRINTF(5,6);
++extern _X_EXPORT void LogHdrMessage(MessageType type, const char *msg_format,
++ va_list msg_args, const char *hdr_format, ...)
++ _X_ATTRIBUTE_PRINTF(2,0) _X_ATTRIBUTE_PRINTF(4,5);
++
+ extern _X_EXPORT void FreeAuditTimer(void);
+ extern _X_EXPORT void AuditF(const char *f, ...) _X_ATTRIBUTE_PRINTF(1,2);
+ extern _X_EXPORT void VAuditF(const char *f, va_list args) _X_ATTRIBUTE_PRINTF(1,0);
+diff --git a/os/log.c b/os/log.c
+index 4ff0180..2eddf06 100644
+--- a/os/log.c
++++ b/os/log.c
+@@ -411,6 +411,61 @@ LogMessage(MessageType type, const char *format, ...)
+ va_end(ap);
+ }
+
++
++void
++LogVHdrMessageVerb(MessageType type, int verb, const char *msg_format,
++ va_list msg_args, const char *hdr_format, va_list hdr_args)
++{
++ const char *type_str;
++ char tmpFormat[1024];
++ char *tmpFormat_end = &tmpFormat[sizeof(tmpFormat)];
++ char *p;
++ int left;
++
++ type_str = LogMessageTypeVerbString(type, verb);
++ if (!type_str)
++ return;
++
++ /* if type_str != "", copy it and ' ' to tmpFormat; set p after ' ' */
++ p = tmpFormat;
++ if (type_str[0] != '\0')
++ p += snprintf(tmpFormat, sizeof(tmpFormat), "%s ", type_str);
++
++ /* append as much of hdr as fits after type_str (if there was one) */
++ left = tmpFormat_end - p;
++ if (left > 1)
++ p += vsnprintf(p, left, hdr_format, hdr_args);
++
++ /* append as much of msg_format as will fit after hdr */
++ left = tmpFormat_end - p;
++ if (left > 1)
++ snprintf(p, left, "%s", msg_format);
++
++ LogVWrite(verb, tmpFormat, msg_args);
++}
++
++void
++LogHdrMessageVerb(MessageType type, int verb, const char *msg_format,
++ va_list msg_args, const char *hdr_format, ...)
++{
++ va_list hdr_args;
++
++ va_start(hdr_args, hdr_format);
++ LogVHdrMessageVerb(type, verb, msg_format, msg_args, hdr_format, hdr_args);
++ va_end(hdr_args);
++}
++
++void
++LogHdrMessage(MessageType type, const char *msg_format, va_list msg_args,
++ const char *hdr_format, ...)
++{
++ va_list hdr_args;
++
++ va_start(hdr_args, hdr_format);
++ LogVHdrMessageVerb(type, 1, msg_format, msg_args, hdr_format, hdr_args);
++ va_end(hdr_args);
++}
++
+ void
+ AbortServer(void) _X_NORETURN;
+
+--
+1.7.7.6
+
diff --git a/0003-xf86Helper-use-LogHdrMessageVerb-in-xf86VIDrvMsgVerb.patch b/0003-xf86Helper-use-LogHdrMessageVerb-in-xf86VIDrvMsgVerb.patch
new file mode 100644
index 0000000..e0da785
--- /dev/null
+++ b/0003-xf86Helper-use-LogHdrMessageVerb-in-xf86VIDrvMsgVerb.patch
@@ -0,0 +1,57 @@
+From 282b121d3def9e3cf34c9e35b0b8728ae1a7e42b Mon Sep 17 00:00:00 2001
+From: Daniel Kurtz <djkurtz at chromium.org>
+Date: Mon, 8 Aug 2011 15:09:47 +0800
+Subject: [PATCH 3/3] xf86Helper: use LogHdrMessageVerb in xf86VIDrvMsgVerb
+
+LogHdrMessageVerb allows passing a parameterized header to insert in a log
+message between MessageType and the formatted message body string.
+
+Signed-off-by: Daniel Kurtz <djkurtz at chromium.org>
+Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>
+Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
+(cherry picked from commit cd8ee3e5cb29b9cd6402d2fbc71463c6b04b6077)
+---
+ hw/xfree86/common/xf86Helper.c | 23 +++++++++++++----------
+ 1 files changed, 13 insertions(+), 10 deletions(-)
+
+diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c
+index f8e6c8b..f42d0f9 100644
+--- a/hw/xfree86/common/xf86Helper.c
++++ b/hw/xfree86/common/xf86Helper.c
+@@ -1082,20 +1082,23 @@ xf86DrvMsg(int scrnIndex, MessageType type, const char *format, ...)
+ }
+
+ /* Print input driver messages in the standard format of
+- <driver>: <device name>: <message> */
++ (<type>) <driver>: <device name>: <message> */
+ void
+-xf86VIDrvMsgVerb(InputInfoPtr dev, MessageType type, int verb, const char *format,
+- va_list args)
++xf86VIDrvMsgVerb(InputInfoPtr dev, MessageType type, int verb,
++ const char *format, va_list args)
+ {
+- char *msg;
++ const char *driverName = NULL;
++ const char *deviceName = NULL;
+
+- if (asprintf(&msg, "%s: %s: %s", dev->drv->driverName, dev->name, format)
+- == -1) {
+- LogVMessageVerb(type, verb, "%s", args);
+- } else {
+- LogVMessageVerb(type, verb, msg, args);
+- free(msg);
++ /* Prefix driver and device names to formatted message. */
++ if (dev) {
++ deviceName = dev->name;
++ if (dev->drv)
++ driverName = dev->drv->driverName;
+ }
++
++ LogHdrMessageVerb(type, verb, format, args, "%s: %s: ", driverName,
++ deviceName);
+ }
+
+ /* Print input driver message, with verbose level specified directly */
+--
+1.7.7.6
+
diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec
index a217d4e..4be64fa 100644
--- a/xorg-x11-server.spec
+++ b/xorg-x11-server.spec
@@ -30,7 +30,7 @@
Summary: X.Org X11 X server
Name: xorg-x11-server
Version: 1.11.4
-Release: 2%{?gitdate:.%{gitdate}}%{dist}
+Release: 3%{?gitdate:.%{gitdate}}%{dist}
URL: http://www.x.org
License: MIT
Group: User Interface/X
@@ -91,6 +91,11 @@ Patch7009: xserver-1.10.99-config-add-udev-systemd-multi-seat-support.patch
Patch7010: 0001-dix-send-focus-events-to-the-immediate-parent-44079.patch
Patch7011: 0001-dix-on-PointerRootWin-send-a-FocusIn-to-the-sprite-w.patch
+# Bug 754674 - F16 X hang due to frequent evdev mouse scrollwheel events
+Patch7012: 0001-os-log-Pull-LogMessageTypeVerbString-out-of-LogVMess.patch
+Patch7013: 0002-os-log-Add-LogVHdrMessageVerb-and-friends.patch
+Patch7014: 0003-xf86Helper-use-LogHdrMessageVerb-in-xf86VIDrvMsgVerb.patch
+
%define moduledir %{_libdir}/xorg/modules
%define drimoduledir %{_libdir}/dri
%define sdkdir %{_includedir}/xorg
@@ -555,6 +560,10 @@ rm -rf $RPM_BUILD_ROOT
%{xserver_source_dir}
%changelog
+* Tue Mar 27 2012 Peter Hutterer <peter.hutterer at redhat.com> 1.11.4-3
+- Re-do xf86IDrvMsg() logging to avoid spurious malloc during signal
+ handlers (#754674)
+
* Fri Mar 09 2012 Peter Hutterer <peter.hutterer at redhat.com> 1.11.4-2
- Fix fdo bug 44079, XI2 focus events missing on immediate parent of the
focus window
More information about the scm-commits
mailing list