From: Jonathan Rajotte Date: Thu, 27 Jul 2017 22:39:45 +0000 (-0400) Subject: Use pipe instead of eventfd() for notification command queue X-Git-Tag: v2.11.0-rc1~473 X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=commitdiff_plain;h=814b4934e2604a419bcb8eec57c0450dbb47e2c3 Use pipe instead of eventfd() for notification command queue Signed-off-by: Jonathan Rajotte Signed-off-by: Jérémie Galarneau --- diff --git a/src/bin/lttng-sessiond/notification-thread-commands.c b/src/bin/lttng-sessiond/notification-thread-commands.c index d9fdf0158..cca667476 100644 --- a/src/bin/lttng-sessiond/notification-thread-commands.c +++ b/src/bin/lttng-sessiond/notification-thread-commands.c @@ -44,7 +44,7 @@ int run_command_wait(struct notification_thread_handle *handle, cds_list_add_tail(&cmd->cmd_list_node, &handle->cmd_queue.list); /* Wake-up thread. */ - ret = write(handle->cmd_queue.event_fd, + ret = write(lttng_pipe_get_writefd(handle->cmd_queue.event_pipe), ¬ification_counter, sizeof(notification_counter)); if (ret < 0) { PERROR("write to notification thread's queue event fd"); diff --git a/src/bin/lttng-sessiond/notification-thread-events.c b/src/bin/lttng-sessiond/notification-thread-events.c index bfdbb2085..327ea7fc3 100644 --- a/src/bin/lttng-sessiond/notification-thread-events.c +++ b/src/bin/lttng-sessiond/notification-thread-events.c @@ -1275,7 +1275,7 @@ int handle_notification_thread_command( struct notification_thread_command *cmd; /* Read event_fd to put it back into a quiescent state. */ - ret = read(handle->cmd_queue.event_fd, &counter, sizeof(counter)); + ret = read(lttng_pipe_get_readfd(handle->cmd_queue.event_pipe), &counter, sizeof(counter)); if (ret == -1) { goto error; } diff --git a/src/bin/lttng-sessiond/notification-thread.c b/src/bin/lttng-sessiond/notification-thread.c index b580faa26..c47b36533 100644 --- a/src/bin/lttng-sessiond/notification-thread.c +++ b/src/bin/lttng-sessiond/notification-thread.c @@ -54,17 +54,12 @@ void notification_thread_handle_destroy( goto end; } - if (handle->cmd_queue.event_fd < 0) { - goto end; - } - ret = close(handle->cmd_queue.event_fd); - if (ret < 0) { - PERROR("close notification command queue event_fd"); - } - assert(cds_list_empty(&handle->cmd_queue.list)); pthread_mutex_destroy(&handle->cmd_queue.lock); + if (handle->cmd_queue.event_pipe) { + lttng_pipe_destroy(handle->cmd_queue.event_pipe); + } if (handle->channel_monitoring_pipes.ust32_consumer >= 0) { ret = close(handle->channel_monitoring_pipes.ust32_consumer); if (ret) { @@ -94,18 +89,22 @@ struct notification_thread_handle *notification_thread_handle_create( { int ret; struct notification_thread_handle *handle; + struct lttng_pipe *event_pipe = NULL; handle = zmalloc(sizeof(*handle)); if (!handle) { goto end; } - /* FIXME Replace eventfd by a pipe to support older kernels. */ - handle->cmd_queue.event_fd = eventfd(0, EFD_CLOEXEC | EFD_SEMAPHORE); - if (handle->cmd_queue.event_fd < 0) { - PERROR("eventfd notification command queue"); + event_pipe = lttng_pipe_open(O_CLOEXEC); + if (!event_pipe) { + ERR("event_pipe creation"); goto error; } + + handle->cmd_queue.event_pipe = event_pipe; + event_pipe = NULL; + CDS_INIT_LIST_HEAD(&handle->cmd_queue.list); ret = pthread_mutex_init(&handle->cmd_queue.lock, NULL); if (ret) { @@ -145,6 +144,7 @@ struct notification_thread_handle *notification_thread_handle_create( end: return handle; error: + lttng_pipe_destroy(event_pipe); notification_thread_handle_destroy(handle); return NULL; } @@ -282,7 +282,7 @@ int init_poll_set(struct lttng_poll_event *poll_set, ERR("[notification-thread] Failed to add notification channel socket to pollset"); goto error; } - ret = lttng_poll_add(poll_set, handle->cmd_queue.event_fd, + ret = lttng_poll_add(poll_set, lttng_pipe_get_readfd(handle->cmd_queue.event_pipe), LPOLLIN | LPOLLERR); if (ret < 0) { ERR("[notification-thread] Failed to add notification command queue event fd to pollset"); @@ -544,7 +544,7 @@ void *thread_notification(void *data) ERR("[notification-thread] Unexpected poll events %u for notification socket %i", revents, fd); goto error; } - } else if (fd == handle->cmd_queue.event_fd) { + } else if (fd == lttng_pipe_get_readfd(handle->cmd_queue.event_pipe)) { ret = handle_notification_thread_command(handle, &state); if (ret < 0) { diff --git a/src/bin/lttng-sessiond/notification-thread.h b/src/bin/lttng-sessiond/notification-thread.h index a9c771104..2aa76e71c 100644 --- a/src/bin/lttng-sessiond/notification-thread.h +++ b/src/bin/lttng-sessiond/notification-thread.h @@ -30,11 +30,11 @@ struct notification_thread_handle { /* * Queue of struct notification command. - * event_fd must be WRITE(2) to signal that a new command + * event_pipe must be WRITE(2) to signal that a new command * has been enqueued. */ struct { - int event_fd; + struct lttng_pipe *event_pipe; struct cds_list_head list; pthread_mutex_t lock; } cmd_queue;