X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fkernel.c;h=03a358a0d3f1da9478ef220c3e93309298b469f7;hp=4bb8045e7ca9e68f078a69cfaa6e2e095b40c911;hb=e8b1187d0ff0323106069738b2fff5c9e5a7d9bb;hpb=352b58f55f53e7d11fb286ddc26a3bd0ecdd02f5 diff --git a/src/bin/lttng-sessiond/kernel.c b/src/bin/lttng-sessiond/kernel.c index 4bb8045e7..03a358a0d 100644 --- a/src/bin/lttng-sessiond/kernel.c +++ b/src/bin/lttng-sessiond/kernel.c @@ -28,11 +28,11 @@ #include #include -#include -#include +#include +#include #include #include -#include +#include #include "lttng-sessiond.h" #include "lttng-syscall.h" @@ -540,9 +540,9 @@ static int userspace_probe_event_rule_add_callsites( assert(creds); event_rule_type = lttng_event_rule_get_type(rule); - assert(event_rule_type == LTTNG_EVENT_RULE_TYPE_UPROBE); + assert(event_rule_type == LTTNG_EVENT_RULE_TYPE_USERSPACE_PROBE); - status = lttng_event_rule_uprobe_get_location(rule, &location); + status = lttng_event_rule_userspace_probe_get_location(rule, &location); if (status != LTTNG_EVENT_RULE_STATUS_OK || !location) { ret = -1; goto end; @@ -568,7 +568,7 @@ end: int kernel_create_event(struct lttng_event *ev, struct ltt_kernel_channel *channel, char *filter_expression, - struct lttng_filter_bytecode *filter) + struct lttng_bytecode *filter) { int err, fd; enum lttng_error_code ret; @@ -2065,20 +2065,9 @@ error: LTTNG_HIDDEN void cleanup_kernel_tracer(void) { - int ret; - struct cds_lfht_iter iter; - struct ltt_kernel_event_notifier_rule *rule = NULL; - - rcu_read_lock(); - cds_lfht_for_each_entry(kernel_token_to_event_notifier_rule_ht, &iter, rule, ht_node) { - kernel_disable_event_notifier_rule(rule); - trace_kernel_destroy_event_notifier_rule(rule); - } - rcu_read_unlock(); - DBG2("Closing kernel event notifier group notification file descriptor"); if (kernel_tracer_event_notifier_group_notification_fd >= 0) { - ret = notification_thread_command_remove_tracer_event_source( + int ret = notification_thread_command_remove_tracer_event_source( notification_thread_handle, kernel_tracer_event_notifier_group_notification_fd); if (ret != LTTNG_OK) { @@ -2095,13 +2084,15 @@ void cleanup_kernel_tracer(void) } if (kernel_token_to_event_notifier_rule_ht) { - ret = cds_lfht_destroy(kernel_token_to_event_notifier_rule_ht, NULL); + const int ret = cds_lfht_destroy( + kernel_token_to_event_notifier_rule_ht, NULL); assert(ret == 0); } DBG2("Closing kernel event notifier group file descriptor"); if (kernel_tracer_event_notifier_group_fd >= 0) { - ret = close(kernel_tracer_event_notifier_group_fd); + const int ret = close(kernel_tracer_event_notifier_group_fd); + if (ret) { PERROR("Failed to close kernel event notifier group file descriptor: fd = %d", kernel_tracer_event_notifier_group_fd); @@ -2112,7 +2103,8 @@ void cleanup_kernel_tracer(void) DBG2("Closing kernel fd"); if (kernel_tracer_fd >= 0) { - ret = close(kernel_tracer_fd); + const int ret = close(kernel_tracer_fd); + if (ret) { PERROR("Failed to close kernel tracer file descriptor: fd = %d", kernel_tracer_fd); @@ -2307,8 +2299,10 @@ static enum lttng_error_code kernel_create_event_notifier_rule( enum lttng_event_rule_type event_rule_type; struct ltt_kernel_event_notifier_rule *event_notifier_rule; struct lttng_kernel_event_notifier kernel_event_notifier = {}; + unsigned int capture_bytecode_count = 0, i; const struct lttng_condition *condition = NULL; const struct lttng_event_rule *event_rule = NULL; + enum lttng_condition_status cond_status; assert(trigger); @@ -2316,10 +2310,10 @@ static enum lttng_error_code kernel_create_event_notifier_rule( assert(condition); condition_type = lttng_condition_get_type(condition); - assert(condition_type == LTTNG_CONDITION_TYPE_EVENT_RULE_HIT); + assert(condition_type == LTTNG_CONDITION_TYPE_ON_EVENT); /* Does not acquire a reference. */ - condition_status = lttng_condition_event_rule_get_rule( + condition_status = lttng_condition_on_event_get_rule( condition, &event_rule); assert(condition_status == LTTNG_CONDITION_STATUS_OK); assert(event_rule); @@ -2336,7 +2330,7 @@ static enum lttng_error_code kernel_create_event_notifier_rule( error_code_ret = trace_kernel_init_event_notifier_from_event_rule( event_rule, &kernel_event_notifier); if (error_code_ret != LTTNG_OK) { - goto error; + goto free_event; } kernel_event_notifier.event.token = event_notifier_rule->token; @@ -2392,7 +2386,7 @@ static enum lttng_error_code kernel_create_event_notifier_rule( } if (lttng_event_rule_get_type(event_rule) == - LTTNG_EVENT_RULE_TYPE_UPROBE) { + LTTNG_EVENT_RULE_TYPE_USERSPACE_PROBE) { ret = userspace_probe_event_rule_add_callsites( event_rule, creds, event_notifier_rule->fd); if (ret) { @@ -2401,6 +2395,31 @@ static enum lttng_error_code kernel_create_event_notifier_rule( } } + /* Set the capture bytecode if any. */ + cond_status = lttng_condition_on_event_get_capture_descriptor_count( + condition, &capture_bytecode_count); + assert(cond_status == LTTNG_CONDITION_STATUS_OK); + + for (i = 0; i < capture_bytecode_count; i++) { + const struct lttng_bytecode *capture_bytecode = + lttng_condition_on_event_get_capture_bytecode_at_index( + condition, i); + + if (capture_bytecode == NULL) { + ERR("Unexpected NULL capture bytecode on condition"); + error_code_ret = LTTNG_ERR_KERN_ENABLE_FAIL; + goto capture_error; + } + + ret = kernctl_capture(event_notifier_rule->fd, capture_bytecode); + if (ret < 0) { + ERR("Failed to set capture bytecode on event notifier rule fd: fd = %d", + event_notifier_rule->fd); + error_code_ret = LTTNG_ERR_KERN_ENABLE_FAIL; + goto capture_error; + } + } + err = kernctl_enable(event_notifier_rule->fd); if (err < 0) { switch (-err) { @@ -2427,6 +2446,7 @@ static enum lttng_error_code kernel_create_event_notifier_rule( return LTTNG_OK; +capture_error: add_callsite_error: enable_error: set_cloexec_error: @@ -2460,7 +2480,7 @@ enum lttng_error_code kernel_register_event_notifier( assert(condition); /* Does not acquire a reference to the event rule. */ - status = lttng_condition_event_rule_get_rule( + status = lttng_condition_on_event_get_rule( condition, &event_rule); assert(status == LTTNG_CONDITION_STATUS_OK); @@ -2469,7 +2489,7 @@ enum lttng_error_code kernel_register_event_notifier( ret = kernel_create_event_notifier_rule(trigger, cmd_creds, token); if (ret != LTTNG_OK) { - ERR("Failed to create kernel trigger"); + ERR("Failed to create kernel event notifier rule"); } return ret;