#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.
*/
#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. */ \
.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);
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)
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);
}