From 6566528bd873067b5e68a0599d57044060908e29 Mon Sep 17 00:00:00 2001 From: Francis Deslauriers Date: Mon, 12 Oct 2020 12:24:49 -0400 Subject: [PATCH] Implement event notifier error counter Signed-off-by: Francis Deslauriers Signed-off-by: Mathieu Desnoyers Change-Id: Ia8008a162a1e4c881fdc948a390847cb5258e4f7 --- include/lttng/ust-events.h | 1 + liblttng-ust/event-notifier-notification.c | 28 ++++++++++++++++++---- liblttng-ust/lttng-events.c | 4 +++- liblttng-ust/ust-events-internal.h | 1 + 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/include/lttng/ust-events.h b/include/lttng/ust-events.h index 721b0aed..19726f88 100644 --- a/include/lttng/ust-events.h +++ b/include/lttng/ust-events.h @@ -511,6 +511,7 @@ struct lttng_event { struct lttng_event_notifier { uint64_t user_token; + uint64_t error_counter_index; int enabled; int registered; /* has reg'd tracepoint probe */ size_t num_captures; /* Needed to allocate the msgpack array. */ diff --git a/liblttng-ust/event-notifier-notification.c b/liblttng-ust/event-notifier-notification.c index 6fce4357..f1fb8adc 100644 --- a/liblttng-ust/event-notifier-notification.c +++ b/liblttng-ust/event-notifier-notification.c @@ -280,8 +280,24 @@ void notification_append_empty_capture( lttng_msgpack_write_nil(¬if->writer); } +static void record_error(struct lttng_event_notifier *event_notifier) +{ + struct lttng_event_notifier_group *event_notifier_group = + event_notifier->group; + size_t dimension_index[1]; + int ret; + + dimension_index[0] = event_notifier->error_counter_index; + ret = event_notifier_group->error_counter->ops->counter_add( + event_notifier_group->error_counter->counter, + dimension_index, 1); + if (ret) + WARN_ON_ONCE(1); +} + static -void notification_send(struct lttng_event_notifier_notification *notif) +void notification_send(struct lttng_event_notifier_notification *notif, + struct lttng_event_notifier *event_notifier) { ssize_t ret; size_t content_len; @@ -291,7 +307,7 @@ void notification_send(struct lttng_event_notifier_notification *notif) assert(notif); - ust_notif.token = notif->event_notifier_token; + ust_notif.token = event_notifier->user_token; /* * Prepare sending the notification from multiple buffers using an @@ -329,7 +345,8 @@ void notification_send(struct lttng_event_notifier_notification *notif) ret = patient_writev(notif->notification_fd, iov, iovec_count); if (ret == -1) { if (errno == EAGAIN) { - DBG("Cannot send event notifier notification without blocking: %s", + record_error(event_notifier); + DBG("Cannot send event_notifier notification without blocking: %s", strerror(errno)); } else { DBG("Error to sending event notifier notification: %s", @@ -339,7 +356,8 @@ void notification_send(struct lttng_event_notifier_notification *notif) } } -void lttng_event_notifier_notification_send(struct lttng_event_notifier *event_notifier, +void lttng_event_notifier_notification_send( + struct lttng_event_notifier *event_notifier, const char *stack_data) { /* @@ -375,5 +393,5 @@ void lttng_event_notifier_notification_send(struct lttng_event_notifier *event_n * Send the notification (including the capture buffer) to the * sessiond. */ - notification_send(¬if); + notification_send(¬if, event_notifier); } diff --git a/liblttng-ust/lttng-events.c b/liblttng-ust/lttng-events.c index 6a089122..b455c363 100644 --- a/liblttng-ust/lttng-events.c +++ b/liblttng-ust/lttng-events.c @@ -841,7 +841,7 @@ socket_error: static int lttng_event_notifier_create(const struct lttng_event_desc *desc, - uint64_t token, + uint64_t token, uint64_t error_counter_index, struct lttng_event_notifier_group *event_notifier_group) { struct lttng_event_notifier *event_notifier; @@ -864,6 +864,7 @@ int lttng_event_notifier_create(const struct lttng_event_desc *desc, event_notifier->group = event_notifier_group; event_notifier->user_token = token; + event_notifier->error_counter_index = error_counter_index; /* Event notifier will be enabled by enabler sync. */ event_notifier->enabled = 0; @@ -1766,6 +1767,7 @@ void lttng_create_event_notifier_if_missing( */ ret = lttng_event_notifier_create(desc, event_notifier_enabler->user_token, + event_notifier_enabler->error_counter_index, event_notifier_group); if (ret) { DBG("Unable to create event_notifier %s, error %d\n", diff --git a/liblttng-ust/ust-events-internal.h b/liblttng-ust/ust-events-internal.h index 966fce6e..be5c549c 100644 --- a/liblttng-ust/ust-events-internal.h +++ b/liblttng-ust/ust-events-internal.h @@ -46,6 +46,7 @@ struct lttng_event_enabler { struct lttng_event_notifier_enabler { struct lttng_enabler base; + uint64_t error_counter_index; struct cds_list_head node; /* per-app list of event_notifier enablers */ struct cds_list_head capture_bytecode_head; struct lttng_event_notifier_group *group; /* weak ref */ -- 2.34.1