From 37ed587a8b9aea32c383058b4765a5730497d74a Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Mon, 29 Aug 2011 19:43:33 -0400 Subject: [PATCH] Print appropriate error on FUTEX_WAIT efault for RO shm Signed-off-by: Mathieu Desnoyers --- include/ust/usterr-signal-safe.h | 6 ++++-- libust/lttng-ust-comm.c | 18 ++++++++++++++---- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/include/ust/usterr-signal-safe.h b/include/ust/usterr-signal-safe.h index 483e7f54..71e7437a 100644 --- a/include/ust/usterr-signal-safe.h +++ b/include/ust/usterr-signal-safe.h @@ -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. */ \ diff --git a/libust/lttng-ust-comm.c b/libust/lttng-ust-comm.c index a5f2b0b0..2fd16573 100644 --- a/libust/lttng-ust-comm.c +++ b/libust/lttng-ust-comm.c @@ -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); } -- 2.34.1