From: Jonathan Rajotte Date: Tue, 28 Apr 2020 14:37:55 +0000 (-0400) Subject: sessiond: ust-app: add utils to add a capture bytecode to a ust object X-Git-Tag: v2.13.0-rc1~241 X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=commitdiff_plain;h=f2eafd2d6170ab8974bb8ceb1eec6d89ab969623 sessiond: ust-app: add utils to add a capture bytecode to a ust object Signed-off-by: Jonathan Rajotte Signed-off-by: Jérémie Galarneau Change-Id: If5b5954cadfafbf851e3fc3a9e37c76c3840a4a3 Depends-on: lttng-ust: I8423c510bf6af2f9bf85256e8d6f931d36f7054b --- diff --git a/src/bin/lttng-sessiond/ust-app.c b/src/bin/lttng-sessiond/ust-app.c index f7d8c985b..01fa7fc93 100644 --- a/src/bin/lttng-sessiond/ust-app.c +++ b/src/bin/lttng-sessiond/ust-app.c @@ -1331,15 +1331,15 @@ error: * * Return allocated filter or NULL on error. */ -static struct lttng_ust_filter_bytecode *create_ust_bytecode_from_bytecode( - const struct lttng_bytecode *orig_f) +static struct lttng_ust_filter_bytecode * +create_ust_filter_bytecode_from_bytecode(const struct lttng_bytecode *orig_f) { struct lttng_ust_filter_bytecode *filter = NULL; - /* Copy filter bytecode */ + /* Copy filter bytecode. */ filter = zmalloc(sizeof(*filter) + orig_f->len); if (!filter) { - PERROR("zmalloc alloc ust filter bytecode"); + PERROR("Failed to allocate lttng_ust_filter_bytecode: bytecode len = %" PRIu32 " bytes", orig_f->len); goto error; } @@ -1350,6 +1350,30 @@ error: return filter; } +/* + * Create a liblttng-ust capture bytecode from given bytecode. + * + * Return allocated filter or NULL on error. + */ +static struct lttng_ust_capture_bytecode * +create_ust_capture_bytecode_from_bytecode(const struct lttng_bytecode *orig_f) +{ + struct lttng_ust_capture_bytecode *capture = NULL; + + /* Copy capture bytecode. */ + capture = zmalloc(sizeof(*capture) + orig_f->len); + if (!capture) { + PERROR("Failed to allocate lttng_ust_capture_bytecode: bytecode len = %" PRIu32 " bytes", orig_f->len); + goto error; + } + + assert(sizeof(struct lttng_bytecode) == + sizeof(struct lttng_ust_capture_bytecode)); + memcpy(capture, orig_f, sizeof(*capture) + orig_f->len); +error: + return capture; +} + /* * Find an ust_app using the sock and return it. RCU read side lock must be * held before calling this helper function. @@ -1519,7 +1543,7 @@ static int set_ust_object_filter(struct ust_app *app, health_code_update(); - ust_bytecode = create_ust_bytecode_from_bytecode(bytecode); + ust_bytecode = create_ust_filter_bytecode_from_bytecode(bytecode); if (!ust_bytecode) { ret = -LTTNG_ERR_NOMEM; goto error; @@ -1530,8 +1554,8 @@ static int set_ust_object_filter(struct ust_app *app, pthread_mutex_unlock(&app->sock_lock); if (ret < 0) { if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("UST app set object filter failed for object %p of app (pid: %d) " - "with ret %d", ust_object, app->pid, ret); + ERR("UST app set object filter failed: object = %p of app pid = %d, ret = %d", + ust_object, app->pid, ret); } else { /* * This is normal behavior, an application can die during the @@ -1544,7 +1568,54 @@ static int set_ust_object_filter(struct ust_app *app, goto error; } - DBG2("UST filter successfully set for object %p", ust_object); + DBG2("UST filter successfully set: object = %p", ust_object); + +error: + health_code_update(); + free(ust_bytecode); + return ret; +} + +/* + * Set a capture bytecode for the passed object. + */ +static int set_ust_capture(struct ust_app *app, + const struct lttng_bytecode *bytecode, + struct lttng_ust_object_data *ust_object) +{ + int ret; + struct lttng_ust_capture_bytecode *ust_bytecode = NULL; + + health_code_update(); + + ust_bytecode = create_ust_capture_bytecode_from_bytecode(bytecode); + if (!ust_bytecode) { + ret = -LTTNG_ERR_NOMEM; + goto error; + } + + pthread_mutex_lock(&app->sock_lock); + ret = ustctl_set_capture(app->sock, ust_bytecode, + ust_object); + pthread_mutex_unlock(&app->sock_lock); + if (ret < 0) { + if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { + ERR("UST app set object capture failed: object = %p of app pid = %d, ret = %d", + ust_object, app->pid, ret); + } else { + /* + * This is normal behavior, an application can die during the + * creation process. Don't report an error so the execution can + * continue normally. + */ + ret = 0; + DBG3("Failed to set UST app object capture. Application is dead."); + } + + goto error; + } + + DBG2("UST capture successfully set: object = %p", ust_object); error: health_code_update(); diff --git a/src/bin/lttng-sessiond/ust-ctl-internal.h b/src/bin/lttng-sessiond/ust-ctl-internal.h index 8d7217f31..7a89dbc26 100644 --- a/src/bin/lttng-sessiond/ust-ctl-internal.h +++ b/src/bin/lttng-sessiond/ust-ctl-internal.h @@ -79,6 +79,8 @@ int ustctl_set_filter(int sock, struct lttng_ust_filter_bytecode *bytecode, struct lttng_ust_object_data *obj_data); int ustctl_set_exclusion(int sock, struct lttng_ust_event_exclusion *exclusion, struct lttng_ust_object_data *obj_data); +int ustctl_set_capture(int sock, struct lttng_ust_capture_bytecode *bytecode, + struct lttng_ust_object_data *obj_data); int ustctl_enable(int sock, struct lttng_ust_object_data *object); int ustctl_disable(int sock, struct lttng_ust_object_data *object);