[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