X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fcmd.c;h=a2af8882f289397b55f889f6f6995566b02aa3f6;hb=1a3d8cf37eaa418f7c4a7629cd9fe058db3d1054;hp=2ba825da006cae03d2bb5a8ab396d4642843f5df;hpb=ce0b1d61919f37517a6212f7af2afe0fa1b1dcb0;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/cmd.c b/src/bin/lttng-sessiond/cmd.c index 2ba825da0..a2af8882f 100644 --- a/src/bin/lttng-sessiond/cmd.c +++ b/src/bin/lttng-sessiond/cmd.c @@ -115,7 +115,7 @@ static int cmd_enable_event_internal(struct ltt_session *session, const struct lttng_domain *domain, char *channel_name, struct lttng_event *event, char *filter_expression, - struct lttng_filter_bytecode *filter, + struct lttng_bytecode *filter, struct lttng_event_exclusion *exclusion, int wpipe); @@ -488,7 +488,7 @@ static int list_lttng_agent_events(struct agent *agt, cds_lfht_for_each_entry ( agt->events->ht, &iter.iter, agent_event, node.node) { struct lttng_event event = { - .enabled = agent_event->enabled, + .enabled = AGENT_EVENT_IS_ENABLED(agent_event), .loglevel = agent_event->loglevel_value, .loglevel_type = agent_event->loglevel_type, }; @@ -2083,7 +2083,7 @@ static int _cmd_enable_event(struct ltt_session *session, const struct lttng_domain *domain, char *channel_name, struct lttng_event *event, char *filter_expression, - struct lttng_filter_bytecode *filter, + struct lttng_bytecode *filter, struct lttng_event_exclusion *exclusion, int wpipe, bool internal_event) { @@ -2166,7 +2166,7 @@ static int _cmd_enable_event(struct ltt_session *session, case LTTNG_EVENT_ALL: { char *filter_expression_a = NULL; - struct lttng_filter_bytecode *filter_a = NULL; + struct lttng_bytecode *filter_a = NULL; /* * We need to duplicate filter_expression and filter, @@ -2401,11 +2401,11 @@ static int _cmd_enable_event(struct ltt_session *session, { char *filter_expression_copy = NULL; - struct lttng_filter_bytecode *filter_copy = NULL; + struct lttng_bytecode *filter_copy = NULL; if (filter) { const size_t filter_size = sizeof( - struct lttng_filter_bytecode) + struct lttng_bytecode) + filter->len; filter_copy = zmalloc(filter_size); @@ -2481,7 +2481,7 @@ int cmd_enable_event(struct ltt_session *session, const struct lttng_domain *domain, char *channel_name, struct lttng_event *event, char *filter_expression, - struct lttng_filter_bytecode *filter, + struct lttng_bytecode *filter, struct lttng_event_exclusion *exclusion, int wpipe) { @@ -2498,7 +2498,7 @@ static int cmd_enable_event_internal(struct ltt_session *session, const struct lttng_domain *domain, char *channel_name, struct lttng_event *event, char *filter_expression, - struct lttng_filter_bytecode *filter, + struct lttng_bytecode *filter, struct lttng_event_exclusion *exclusion, int wpipe) { @@ -4203,7 +4203,7 @@ end: * then regenerate the metadata. Live and per-pid sessions are not * supported and return an error. * - * Return 0 on success or else a LTTNG_ERR code. + * Return LTTNG_OK on success or else a LTTNG_ERR code. */ int cmd_regenerate_metadata(struct ltt_session *session) { @@ -4244,7 +4244,7 @@ end: * * Ask the tracer to regenerate a new statedump. * - * Return 0 on success or else a LTTNG_ERR code. + * Return LTTNG_OK on success or else a LTTNG_ERR code. */ int cmd_regenerate_statedump(struct ltt_session *session) { @@ -4317,7 +4317,7 @@ enum lttng_error_code cmd_register_trigger(const struct lttng_credentials *cmd_c struct lttng_trigger **return_trigger) { enum lttng_error_code ret_code; - bool must_update_event_notifier; + bool must_update_event_notifiers; const char *trigger_name; uid_t trigger_owner; enum lttng_trigger_status trigger_status; @@ -4377,27 +4377,31 @@ enum lttng_error_code cmd_register_trigger(const struct lttng_credentials *cmd_c if (ret_code != LTTNG_OK) { DBG("Failed to register trigger to notification thread: trigger name = '%s', trigger owner uid = %d, error code = %d", trigger_name, (int) trigger_owner, ret_code); - goto end_notification_thread; + goto end; } trigger_status = lttng_trigger_get_name(trigger, &trigger_name); trigger_name = trigger_status == LTTNG_TRIGGER_STATUS_OK ? trigger_name : "(unnamed)"; - ret_code = trigger_modifies_event_notifier(trigger, &must_update_event_notifier); + ret_code = trigger_modifies_event_notifier(trigger, &must_update_event_notifiers); if (ret_code != LTTNG_OK) { ERR("Failed to determine if event modifies event notifiers: trigger name = '%s', trigger owner uid = %d, error code = %d", trigger_name, (int) trigger_owner, ret_code); - goto end_notification_thread; + goto end; } /* * Synchronize tracers if the trigger adds an event notifier. */ - if (must_update_event_notifier) { - if (lttng_trigger_get_underlying_domain_type_restriction( - trigger) == LTTNG_DOMAIN_KERNEL) { + if (must_update_event_notifiers) { + const enum lttng_domain_type trigger_domain = + lttng_trigger_get_underlying_domain_type_restriction(trigger); + session_lock_list(); + switch (trigger_domain) { + case LTTNG_DOMAIN_KERNEL: + { ret_code = kernel_register_event_notifier( trigger, cmd_creds); if (ret_code != LTTNG_OK) { @@ -4413,12 +4417,39 @@ enum lttng_error_code cmd_register_trigger(const struct lttng_credentials *cmd_c (int) trigger_owner, ret_code); } - - goto end; } - } else { + break; + } + case LTTNG_DOMAIN_UST: ust_app_global_update_all_event_notifier_rules(); + break; + case LTTNG_DOMAIN_NONE: + abort(); + default: + { + /* Agent domains. */ + struct agent *agt = agent_find_by_event_notifier_domain( + trigger_domain); + + if (!agt) { + agt = agent_create(trigger_domain); + if (!agt) { + ret_code = LTTNG_ERR_NOMEM; + goto end_unlock_session_list; + } + agent_add(agt, trigger_agents_ht_by_domain); + } + + ret_code = trigger_agent_enable(trigger, agt); + if (ret_code != LTTNG_OK) { + goto end_unlock_session_list; + } + + break; } + } + + session_unlock_list(); } /* @@ -4428,14 +4459,17 @@ enum lttng_error_code cmd_register_trigger(const struct lttng_credentials *cmd_c * reference to the trigger so the caller doesn't have to care if those * are distinct instances or not. */ - lttng_trigger_get(trigger); - *return_trigger = trigger; - -end_notification_thread: - /* Ownership of trigger was transferred. */ - trigger = NULL; + if (ret_code == LTTNG_OK) { + lttng_trigger_get(trigger); + *return_trigger = trigger; + /* Ownership of trigger was transferred to caller. */ + trigger = NULL; + } end: return ret_code; +end_unlock_session_list: + session_unlock_list(); + return ret_code; } enum lttng_error_code cmd_unregister_trigger(const struct lttng_credentials *cmd_creds, @@ -4443,7 +4477,7 @@ enum lttng_error_code cmd_unregister_trigger(const struct lttng_credentials *cmd struct notification_thread_handle *notification_thread) { enum lttng_error_code ret_code; - bool must_update_event_notifier; + bool must_update_event_notifiers; const char *trigger_name; uid_t trigger_owner; enum lttng_trigger_status trigger_status; @@ -4475,7 +4509,7 @@ enum lttng_error_code cmd_unregister_trigger(const struct lttng_credentials *cmd } } - ret_code = trigger_modifies_event_notifier(trigger, &must_update_event_notifier); + ret_code = trigger_modifies_event_notifier(trigger, &must_update_event_notifiers); if (ret_code != LTTNG_OK) { ERR("Failed to determine if event modifies event notifiers: trigger name = '%s', trigger owner uid = %d, error code = %d", trigger_name, (int) trigger_owner, ret_code); @@ -4491,21 +4525,60 @@ enum lttng_error_code cmd_unregister_trigger(const struct lttng_credentials *cmd /* * Synchronize tracers if the trigger removes an event notifier. + * Do this even if the trigger unregistration failed to at least stop + * the tracers from producing notifications associated with this + * event notifier. */ - if (must_update_event_notifier) { - if (lttng_trigger_get_underlying_domain_type_restriction( - trigger) == LTTNG_DOMAIN_KERNEL) { - + if (must_update_event_notifiers) { + const enum lttng_domain_type trigger_domain = + lttng_trigger_get_underlying_domain_type_restriction( + trigger); + + session_lock_list(); + switch (trigger_domain) { + case LTTNG_DOMAIN_KERNEL: + { ret_code = kernel_unregister_event_notifier( trigger); - } else { + break; + } + case LTTNG_DOMAIN_UST: ust_app_global_update_all_event_notifier_rules(); + break; + case LTTNG_DOMAIN_NONE: + abort(); + default: + { + /* Agent domains. */ + struct agent *agt = agent_find_by_event_notifier_domain( + trigger_domain); + + if (!agt) { + agt = agent_create(trigger_domain); + if (!agt) { + ret_code = LTTNG_ERR_NOMEM; + goto end_unlock_session_list; + } + agent_add(agt, trigger_agents_ht_by_domain); + } + + ret_code = trigger_agent_disable(trigger, agt); + if (ret_code != LTTNG_OK) { + goto end_unlock_session_list; + } + + break; + } } + + session_unlock_list(); } end: return ret_code; -} +end_unlock_session_list: + session_unlock_list(); + return ret_code;} int cmd_list_triggers(struct command_ctx *cmd_ctx, struct notification_thread_handle *notification_thread, @@ -5051,7 +5124,7 @@ int cmd_set_session_shm_path(struct ltt_session *session, sizeof(session->shm_path)); session->shm_path[sizeof(session->shm_path) - 1] = '\0'; - return 0; + return LTTNG_OK; } /* @@ -5404,7 +5477,7 @@ end: * 'activate' to false means deactivate the rotation schedule and validate that * 'new_value' has the same value as the currently active value. * - * Return 0 on success or else a positive LTTNG_ERR code. + * Return LTTNG_OK on success or else a positive LTTNG_ERR code. */ int cmd_rotation_set_schedule(struct ltt_session *session, bool activate, enum lttng_rotation_schedule_type schedule_type,