From 4fd2697fac67a7dc7078bcaa9dad78b874d19b0b Mon Sep 17 00:00:00 2001 From: Francis Deslauriers Date: Wed, 4 Jul 2018 18:21:57 -0400 Subject: [PATCH] Error out if filter expression is attached to unsupported event types MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Attaching a filter on a probe event, a function event or an userspace-probe event is not supported by the LTTng kernel tracer. So we do an early sanity check in the lttng-enable-event and warn the user if the filtering is not supported. Signed-off-by: Francis Deslauriers Signed-off-by: Jérémie Galarneau --- src/bin/lttng/commands/enable_events.c | 24 +++++++++++++++++ src/bin/lttng/utils.c | 37 ++++++++++++++++++++++++++ src/bin/lttng/utils.h | 1 + 3 files changed, 62 insertions(+) diff --git a/src/bin/lttng/commands/enable_events.c b/src/bin/lttng/commands/enable_events.c index 62f99a1fc..d973c5f6e 100644 --- a/src/bin/lttng/commands/enable_events.c +++ b/src/bin/lttng/commands/enable_events.c @@ -965,6 +965,30 @@ static int enable_events(char *session_name) } } + /* + * Adding a filter to a probe, function or userspace-probe would be + * denied by the kernel tracer as it's not supported at the moment. We + * do an early check here to warn the user. + */ + if (opt_filter && opt_kernel) { + switch (opt_event_type) { + case LTTNG_EVENT_ALL: + case LTTNG_EVENT_TRACEPOINT: + case LTTNG_EVENT_SYSCALL: + break; + case LTTNG_EVENT_PROBE: + case LTTNG_EVENT_USERSPACE_PROBE: + case LTTNG_EVENT_FUNCTION: + ERR("Filter expressions are not supported for %s events", + get_event_type_str(opt_event_type)); + ret = CMD_ERROR; + goto error; + default: + ret = CMD_UNDEFINED; + goto error; + } + } + channel_name = opt_channel_name; handle = lttng_create_handle(session_name, &dom); diff --git a/src/bin/lttng/utils.c b/src/bin/lttng/utils.c index 52a2440e7..0e96ef0c3 100644 --- a/src/bin/lttng/utils.c +++ b/src/bin/lttng/utils.c @@ -41,6 +41,12 @@ static const char *str_ust = "UST"; static const char *str_jul = "JUL"; static const char *str_log4j = "LOG4J"; static const char *str_python = "Python"; +static const char *str_all = "ALL"; +static const char *str_tracepoint = "Tracepoint"; +static const char *str_syscall = "Syscall"; +static const char *str_probe = "Probe"; +static const char *str_userspace_probe = "Userspace Probe"; +static const char *str_function = "Function"; static char *_get_session_name(int quiet) @@ -311,6 +317,37 @@ const char *get_domain_str(enum lttng_domain_type domain) return str_dom; } +const char *get_event_type_str(enum lttng_event_type type) +{ + const char *str_event_type; + + switch (type) { + case LTTNG_EVENT_ALL: + str_event_type = str_all; + break; + case LTTNG_EVENT_TRACEPOINT: + str_event_type = str_tracepoint; + break; + case LTTNG_EVENT_SYSCALL: + str_event_type = str_syscall; + break; + case LTTNG_EVENT_PROBE: + str_event_type = str_probe; + break; + case LTTNG_EVENT_USERSPACE_PROBE: + str_event_type = str_userspace_probe; + break; + case LTTNG_EVENT_FUNCTION: + str_event_type = str_function; + break; + default: + /* Should not have an unknown event type or else define it. */ + assert(0); + } + + return str_event_type; +} + /* * Spawn a lttng relayd daemon by forking and execv. */ diff --git a/src/bin/lttng/utils.h b/src/bin/lttng/utils.h index 4de7f0fe3..b1b97d725 100644 --- a/src/bin/lttng/utils.h +++ b/src/bin/lttng/utils.h @@ -53,6 +53,7 @@ int get_count_order_u64(uint64_t x); int get_count_order_ulong(unsigned long x); const char *get_domain_str(enum lttng_domain_type domain); +const char *get_event_type_str(enum lttng_event_type event_type); int print_missing_or_multiple_domains(unsigned int sum); -- 2.34.1