From: Jérémie Galarneau Date: Thu, 21 Jan 2021 17:30:38 +0000 (-0500) Subject: Fix: sessiond: ust-app: account for the event notification pipes fds X-Git-Tag: v2.13.0-rc1~362 X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=commitdiff_plain;h=5e2abfaf5887f5af81f2b9da7fd18ea07c21366c Fix: sessiond: ust-app: account for the event notification pipes fds The file descriptors of the event notifier group's event pipe are not accounted by the lttng_fd_*() module, which tracks the use the file descriptors by the userspace tracer. Add the necessary lttng_fd_*() uses to account for the pipe's file descriptors over their lifetime. Signed-off-by: Jérémie Galarneau Change-Id: Ib24b4c2934655573965f06fa7998859335053083 --- diff --git a/src/bin/lttng-sessiond/ust-app.c b/src/bin/lttng-sessiond/ust-app.c index 38d1d7871..5ab55ec29 100644 --- a/src/bin/lttng-sessiond/ust-app.c +++ b/src/bin/lttng-sessiond/ust-app.c @@ -952,6 +952,7 @@ void delete_ust_app(struct ust_app *app) struct ust_app_session *ua_sess, *tmp_ua_sess; struct lttng_ht_iter iter; struct ust_app_event_notifier_rule *event_notifier_rule; + bool event_notifier_write_fd_is_open; /* * The session list lock must be held during this function to guarantee @@ -1009,7 +1010,16 @@ void delete_ust_app(struct ust_app *app) free(app->event_notifier_group.object); } + event_notifier_write_fd_is_open = lttng_pipe_is_write_open( + app->event_notifier_group.event_pipe); lttng_pipe_destroy(app->event_notifier_group.event_pipe); + /* + * Release the file descriptors reserved for the event notifier pipe. + * The app could be destroyed before the write end of the pipe could be + * passed to the application (and closed). In that case, both file + * descriptors must be released. + */ + lttng_fd_put(LTTNG_FD_APPS, event_notifier_write_fd_is_open ? 2 : 1); /* * Wait until we have deleted the application from the sock hash table @@ -3708,6 +3718,7 @@ error: */ struct ust_app *ust_app_create(struct ust_register_msg *msg, int sock) { + int ret; struct ust_app *lta = NULL; struct lttng_pipe *event_notifier_event_source_pipe = NULL; @@ -3726,6 +3737,18 @@ struct ust_app *ust_app_create(struct ust_register_msg *msg, int sock) goto error; } + /* + * Reserve the two file descriptors of the event source pipe. The write + * end will be closed once it is passed to the application, at which + * point a single 'put' will be performed. + */ + ret = lttng_fd_get(LTTNG_FD_APPS, 2); + if (ret) { + ERR("Failed to reserve two file descriptors for the event source pipe while creating a new application instance: app = '%s' (ppid: %d)", + msg->name, (int) msg->ppid); + goto error; + } + event_notifier_event_source_pipe = lttng_pipe_open(FD_CLOEXEC); if (!event_notifier_event_source_pipe) { PERROR("Failed to open application event source pipe: '%s' (ppid = %d)", @@ -3783,6 +3806,7 @@ struct ust_app *ust_app_create(struct ust_register_msg *msg, int sock) error_free_pipe: lttng_pipe_destroy(event_notifier_event_source_pipe); + lttng_fd_put(LTTNG_FD_APPS, 2); error: return NULL; } @@ -3892,6 +3916,12 @@ int ust_app_setup_event_notifier_group(struct ust_app *app) goto error; } + /* + * Release the file descriptor that was reserved for the write-end of + * the pipe. + */ + lttng_fd_put(LTTNG_FD_APPS, 1); + lttng_ret = notification_thread_command_add_tracer_event_source( notification_thread_handle, lttng_pipe_get_readfd(app->event_notifier_group.event_pipe),