X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fevent.c;h=24dd292a4e3fdd5f86e48cf0ae11762938766694;hp=c9c2f17f4a24450d561e7d4d607f95c5744de2a5;hb=51f1a3b9df60b6951e8748961893cb4129cf4832;hpb=6775595e33fcf411716849374390e5f8179c8735 diff --git a/src/bin/lttng-sessiond/event.c b/src/bin/lttng-sessiond/event.c index c9c2f17f4..24dd292a4 100644 --- a/src/bin/lttng-sessiond/event.c +++ b/src/bin/lttng-sessiond/event.c @@ -45,6 +45,32 @@ static void init_syscalls_kernel_event(struct lttng_event *event) event->type = LTTNG_EVENT_SYSCALL; } +/* + * Return 1 if loglevels match or 0 on failure. + */ +static int loglevel_match(struct ltt_ust_event *uevent, + enum lttng_ust_loglevel_type log_type, int loglevel) +{ + /* + * For the loglevel type ALL, the loglevel is set to -1 but the event + * received by the session daemon is 0 which does not match the negative + * value in the existing event. + */ + if (log_type == LTTNG_UST_LOGLEVEL_ALL) { + loglevel = -1; + } + + if (uevent == NULL || uevent->attr.loglevel_type != log_type || + uevent->attr.loglevel != loglevel) { + goto no_match; + } + + return 1; + +no_match: + return 0; +} + /* * Disable kernel tracepoint event for a channel from the kernel session. */ @@ -395,8 +421,23 @@ int event_ust_enable_tracepoint(struct ltt_ust_session *usess, int domain, to_create = 1; } + /* Check loglevels */ + ret = loglevel_match(uevent, event->loglevel_type, event->loglevel); + if (ret == 0) { + /* + * No match meaning that the user tried to enable a known event but + * with a different loglevel. + */ + DBG("Enable event %s does not match existing event %s with loglevel " + "respectively of %d and %d", event->name, uevent->attr.name, + uevent->attr.loglevel, event->loglevel); + ret = LTTCOMM_EVENT_EXIST_LOGLEVEL; + goto error; + } + if (uevent->enabled) { /* It's already enabled so everything is OK */ + ret = LTTCOMM_OK; goto end; }