Print appropriate error on FUTEX_WAIT efault for RO shm
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 29 Aug 2011 23:43:33 +0000 (19:43 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 29 Aug 2011 23:43:33 +0000 (19:43 -0400)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
include/ust/usterr-signal-safe.h
libust/lttng-ust-comm.c

index 483e7f541a5b1bb6be916726422737ca167feed6..71e7437a9c58dbb6a9d84bcfa4acb21598ac6cbb 100644 (file)
@@ -54,6 +54,8 @@ static inline int ust_debug(void)
 #define UST_XSTR(d) UST_STR(d)
 #define UST_STR(s) #s
 
+#define USTERR_MAX_LEN 512
+
 /* We sometimes print in the tracing path, and tracing can occur in
  * signal handlers, so we must use a print method which is signal safe.
  */
@@ -68,8 +70,8 @@ static inline void __attribute__ ((format (printf, 1, 2)))
 
 #define sigsafe_print_err(fmt, args...)                                        \
 {                                                                      \
-       /* Can't use dynamic allocation. Limit ourselves to 250 chars. */ \
-       char ____buf[250];                                              \
+       /* Can't use dynamic allocation. Limit ourselves to USTERR_MAX_LEN chars. */ \
+       char ____buf[USTERR_MAX_LEN];                                   \
        int ____saved_errno;                                            \
                                                                        \
        /* Save the errno. */                                           \
index a5f2b0b0069de494f0fb44dd14fdde78537002e6..2fd165730abef212696e2fcc0c1aa3071a25d036 100644 (file)
@@ -119,6 +119,8 @@ struct sock_info local_apps = {
        .socket = -1,
 };
 
+static int wait_poll_fallback;
+
 extern void ltt_ring_buffer_client_overwrite_init(void);
 extern void ltt_ring_buffer_client_discard_init(void);
 extern void ltt_ring_buffer_metadata_client_init(void);
@@ -485,6 +487,9 @@ void wait_for_sessiond(struct sock_info *sock_info)
        if (lttng_ust_comm_should_quit) {
                goto quit;
        }
+       if (wait_poll_fallback) {
+               goto error;
+       }
        if (!sock_info->wait_shm_mmap) {
                sock_info->wait_shm_mmap = get_map_shm(sock_info);
                if (!sock_info->wait_shm_mmap)
@@ -497,11 +502,16 @@ void wait_for_sessiond(struct sock_info *sock_info)
        if (uatomic_read((int32_t *) sock_info->wait_shm_mmap) == 0) {
                ret = futex_async((int32_t *) sock_info->wait_shm_mmap,
                        FUTEX_WAIT, 0, NULL, NULL, 0);
-               /*
-                * FIXME: Currently, futexes on read-only shm seems to
-                * EFAULT.
-                */
                if (ret < 0) {
+                       if (errno == EFAULT) {
+                               wait_poll_fallback = 1;
+                               ERR(
+"Linux kernels 2.6.33 to 3.0 (with the exception of stable versions) "
+"do not support FUTEX_WAKE on read-only memory mappings correctly. "
+"Please upgrade your kernel "
+"(fix is commit 9ea71503a8ed9184d2d0b8ccc4d269d05f7940ae in Linux kernel "
+"mainline). LTTng-UST will use polling mode fallback.");
+                       }
                        PERROR("futex");
                        sleep(5);
                }
This page took 0.028558 seconds and 4 git commands to generate.