summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
3a5713d)
This following example was NOT returning a correct error message.
"event1" is set with a loglevel "TRACE_CRIT". The normal behavior here
is that once enabled, you can not change the loglevel of the enable
event on the tracer side with a second command. It now returns a new
error message like so:
$ lttng enable-event event1 --loglevel-only TRACE-CRIT -u
$ lttng enable-event event1 --loglevel-only TRACE-WARNING -u
[...] Event already enabled with different loglevel
This commit makes the session daemon verify if _both_ the name and
loglevel are the same when enabling an event or else an error is
returned.
Also, the session daemon will continue enabling events and not return an
error is the loglevel does not match event for ust app on the tracer
which returns an EPERM at that stage. This is to address the case where
two applications have the same event name but with different loglevel.
Reported-by: Tan Dung Le Tran <tan.dung.le.tran@ericsson.com>
Signed-off-by: David Goulet <dgoulet@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
.IP "99"
No Kernel consumer detected
.IP "99"
No Kernel consumer detected
+
+.IP "100"
+Event already enabled with different loglevel
.PP
.SH "ENVIRONMENT VARIABLES"
.PP
.SH "ENVIRONMENT VARIABLES"
event->type = LTTNG_EVENT_SYSCALL;
}
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)
+{
+ 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.
*/
/*
* Disable kernel tracepoint event for a channel from the kernel session.
*/
+ /* 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 */
if (uevent->enabled) {
/* It's already enabled so everything is OK */
ret = ustctl_create_event(app->sock, &ua_event->attr, ua_chan->obj,
&ua_event->obj);
if (ret < 0) {
ret = ustctl_create_event(app->sock, &ua_event->attr, ua_chan->obj,
&ua_event->obj);
if (ret < 0) {
+ if (ret == -EEXIST || ret == -EPERM) {
[ LTTCOMM_ERR_INDEX(LTTCOMM_INVALID) ] = "Invalid parameter",
[ LTTCOMM_ERR_INDEX(LTTCOMM_NO_USTCONSUMERD) ] = "No UST consumer detected",
[ LTTCOMM_ERR_INDEX(LTTCOMM_NO_KERNCONSUMERD) ] = "No kernel consumer detected",
[ LTTCOMM_ERR_INDEX(LTTCOMM_INVALID) ] = "Invalid parameter",
[ LTTCOMM_ERR_INDEX(LTTCOMM_NO_USTCONSUMERD) ] = "No UST consumer detected",
[ LTTCOMM_ERR_INDEX(LTTCOMM_NO_KERNCONSUMERD) ] = "No kernel consumer detected",
+ [ LTTCOMM_ERR_INDEX(LTTCOMM_EVENT_EXIST_LOGLEVEL) ] = "Event already enabled with different loglevel",
LTTCOMM_INVALID, /* Invalid parameter */
LTTCOMM_NO_USTCONSUMERD, /* No UST consumer detected */
LTTCOMM_NO_KERNCONSUMERD, /* No Kernel consumer detected */
LTTCOMM_INVALID, /* Invalid parameter */
LTTCOMM_NO_USTCONSUMERD, /* No UST consumer detected */
LTTCOMM_NO_KERNCONSUMERD, /* No Kernel consumer detected */
+ LTTCOMM_EVENT_EXIST_LOGLEVEL, /* Event already enabled with different loglevel */
/* MUST be last element */
LTTCOMM_NR, /* Last element */
/* MUST be last element */
LTTCOMM_NR, /* Last element */