X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=liblttng-ust%2Flttng-ust-abi.c;h=05f3d5881b49ae1565fe45027719e107577315ac;hb=902e13794ab77170a59123c3c62c5d6204941756;hp=548b3a5298ebdd8c1e86e4099abf2b39c5c07191;hpb=1f18504e513d549093432516f983105ad5142808;p=lttng-ust.git diff --git a/liblttng-ust/lttng-ust-abi.c b/liblttng-ust/lttng-ust-abi.c index 548b3a52..05f3d588 100644 --- a/liblttng-ust/lttng-ust-abi.c +++ b/liblttng-ust/lttng-ust-abi.c @@ -29,10 +29,10 @@ #include #include #include +#include #include #include #include "ltt-tracer.h" -#include "tracepoint-internal.h" static int lttng_ust_abi_close_in_progress; @@ -203,7 +203,7 @@ static const struct lttng_ust_objd_ops lttng_session_ops; static const struct lttng_ust_objd_ops lttng_channel_ops; static const struct lttng_ust_objd_ops lttng_metadata_ops; static const struct lttng_ust_objd_ops lttng_event_ops; -static const struct lttng_ust_objd_ops lttng_loglevel_ops; +static const struct lttng_ust_objd_ops lttng_wildcard_ops; static const struct lttng_ust_objd_ops lib_ring_buffer_objd_ops; static const struct lttng_ust_objd_ops lttng_tracepoint_list_ops; @@ -280,6 +280,7 @@ long lttng_abi_add_context(int objd, * @objd: the object descriptor * @cmd: the command * @arg: command arg + * @uargs: UST arguments (internal) * * This descriptor implements lttng commands: * LTTNG_UST_SESSION @@ -294,7 +295,8 @@ long lttng_abi_add_context(int objd, * The returned session will be deleted when its file descriptor is closed. */ static -long lttng_cmd(int objd, unsigned int cmd, unsigned long arg) +long lttng_cmd(int objd, unsigned int cmd, unsigned long arg, + union ust_args *uargs) { switch (cmd) { case LTTNG_UST_SESSION: @@ -328,6 +330,8 @@ void lttng_metadata_create_events(int channel_objd) static struct lttng_ust_event metadata_params = { .instrumentation = LTTNG_UST_TRACEPOINT, .name = "lttng_ust:metadata", + .loglevel_type = LTTNG_UST_LOGLEVEL_ALL, + .loglevel = TRACE_DEFAULT, }; struct ltt_event *event; int ret; @@ -349,7 +353,8 @@ create_error: int lttng_abi_create_channel(int session_objd, struct lttng_ust_channel *chan_param, - enum channel_type channel_type) + enum channel_type channel_type, + union ust_args *uargs) { struct ltt_session *session = objd_private(session_objd); const struct lttng_ust_objd_ops *ops; @@ -398,9 +403,9 @@ int lttng_abi_create_channel(int session_objd, chan_param->num_subbuf, chan_param->switch_timer_interval, chan_param->read_timer_interval, - &chan_param->shm_fd, - &chan_param->wait_fd, - &chan_param->memory_map_size, + &uargs->channel.shm_fd, + &uargs->channel.wait_fd, + &uargs->channel.memory_map_size, &chan_priv_init); if (!chan) { ret = -EINVAL; @@ -434,6 +439,7 @@ objd_error: * @obj: the object * @cmd: the command * @arg: command arg + * @uargs: UST arguments (internal) * * This descriptor implements lttng commands: * LTTNG_UST_CHANNEL @@ -448,7 +454,8 @@ objd_error: * The returned channel will be deleted when its file descriptor is closed. */ static -long lttng_session_cmd(int objd, unsigned int cmd, unsigned long arg) +long lttng_session_cmd(int objd, unsigned int cmd, unsigned long arg, + union ust_args *uargs) { struct ltt_session *session = objd_private(objd); @@ -456,7 +463,7 @@ long lttng_session_cmd(int objd, unsigned int cmd, unsigned long arg) case LTTNG_UST_CHANNEL: return lttng_abi_create_channel(objd, (struct lttng_ust_channel *) arg, - PER_CPU_CHANNEL); + PER_CPU_CHANNEL, uargs); case LTTNG_UST_SESSION_START: case LTTNG_UST_ENABLE: return ltt_session_enable(session); @@ -466,7 +473,7 @@ long lttng_session_cmd(int objd, unsigned int cmd, unsigned long arg) case LTTNG_UST_METADATA: return lttng_abi_create_channel(objd, (struct lttng_ust_channel *) arg, - METADATA_CHANNEL); + METADATA_CHANNEL, uargs); default: return -EINVAL; } @@ -499,7 +506,8 @@ static const struct lttng_ust_objd_ops lttng_session_ops = { }; static -long lttng_tracepoint_list_cmd(int objd, unsigned int cmd, unsigned long arg) +long lttng_tracepoint_list_cmd(int objd, unsigned int cmd, unsigned long arg, + union ust_args *uargs) { struct lttng_ust_tracepoint_list *list = objd_private(objd); struct lttng_ust_tracepoint_iter *tp = @@ -586,7 +594,8 @@ struct stream_priv_data { }; static -int lttng_abi_open_stream(int channel_objd, struct lttng_ust_stream *info) +int lttng_abi_open_stream(int channel_objd, struct lttng_ust_stream *info, + union ust_args *uargs) { struct ltt_channel *channel = objd_private(channel_objd); struct lttng_ust_lib_ring_buffer *buf; @@ -594,7 +603,9 @@ int lttng_abi_open_stream(int channel_objd, struct lttng_ust_stream *info) int stream_objd, ret; buf = channel->ops->buffer_read_open(channel->chan, channel->handle, - &info->shm_fd, &info->wait_fd, &info->memory_map_size); + &uargs->stream.shm_fd, + &uargs->stream.wait_fd, + &uargs->stream.memory_map_size); if (!buf) return -ENOENT; @@ -660,37 +671,37 @@ objd_error: } static -int lttng_abi_create_loglevel(int channel_objd, +int lttng_abi_create_wildcard(int channel_objd, struct lttng_ust_event *event_param) { struct ltt_channel *channel = objd_private(channel_objd); - struct loglevel_entry *loglevel; - int loglevel_objd, ret; + struct session_wildcard *wildcard; + int wildcard_objd, ret; event_param->name[LTTNG_UST_SYM_NAME_LEN - 1] = '\0'; - loglevel_objd = objd_alloc(NULL, <tng_loglevel_ops); - if (loglevel_objd < 0) { - ret = loglevel_objd; + wildcard_objd = objd_alloc(NULL, <tng_wildcard_ops); + if (wildcard_objd < 0) { + ret = wildcard_objd; goto objd_error; } /* - * We tolerate no failure path after loglevel creation. It will + * We tolerate no failure path after wildcard creation. It will * stay invariant for the rest of the session. */ - ret = ltt_loglevel_create(channel, event_param, &loglevel); + ret = ltt_wildcard_create(channel, event_param, &wildcard); if (ret < 0) { - goto loglevel_error; + goto wildcard_error; } - objd_set_private(loglevel_objd, loglevel); - /* The loglevel holds a reference on the channel */ + objd_set_private(wildcard_objd, wildcard); + /* The wildcard holds a reference on the channel */ objd_ref(channel_objd); - return loglevel_objd; + return wildcard_objd; -loglevel_error: +wildcard_error: { int err; - err = lttng_ust_objd_unref(loglevel_objd); + err = lttng_ust_objd_unref(wildcard_objd); assert(!err); } objd_error: @@ -703,6 +714,7 @@ objd_error: * @objd: the object descriptor * @cmd: the command * @arg: command arg + * @uargs: UST arguments (internal) * * This object descriptor implements lttng commands: * LTTNG_UST_STREAM @@ -720,7 +732,8 @@ objd_error: * Channel and event file descriptors also hold a reference on the session. */ static -long lttng_channel_cmd(int objd, unsigned int cmd, unsigned long arg) +long lttng_channel_cmd(int objd, unsigned int cmd, unsigned long arg, + union ust_args *uargs) { struct ltt_channel *channel = objd_private(objd); @@ -731,14 +744,15 @@ long lttng_channel_cmd(int objd, unsigned int cmd, unsigned long arg) stream = (struct lttng_ust_stream *) arg; /* stream used as output */ - return lttng_abi_open_stream(objd, stream); + return lttng_abi_open_stream(objd, stream, uargs); } case LTTNG_UST_EVENT: { struct lttng_ust_event *event_param = (struct lttng_ust_event *) arg; - if (event_param->instrumentation == LTTNG_UST_TRACEPOINT_LOGLEVEL) { - return lttng_abi_create_loglevel(objd, event_param); + if (event_param->name[strlen(event_param->name) - 1] == '*') { + /* If ends with wildcard, create wildcard. */ + return lttng_abi_create_wildcard(objd, event_param); } else { return lttng_abi_create_event(objd, event_param); } @@ -764,6 +778,7 @@ long lttng_channel_cmd(int objd, unsigned int cmd, unsigned long arg) * @objd: the object descriptor * @cmd: the command * @arg: command arg + * @uargs: UST arguments (internal) * * This object descriptor implements lttng commands: * LTTNG_UST_STREAM @@ -772,7 +787,8 @@ long lttng_channel_cmd(int objd, unsigned int cmd, unsigned long arg) * Channel and event file descriptors also hold a reference on the session. */ static -long lttng_metadata_cmd(int objd, unsigned int cmd, unsigned long arg) +long lttng_metadata_cmd(int objd, unsigned int cmd, unsigned long arg, + union ust_args *uargs) { struct ltt_channel *channel = objd_private(objd); @@ -783,7 +799,7 @@ long lttng_metadata_cmd(int objd, unsigned int cmd, unsigned long arg) stream = (struct lttng_ust_stream *) arg; /* stream used as output */ - return lttng_abi_open_stream(objd, stream); + return lttng_abi_open_stream(objd, stream, uargs); } case LTTNG_UST_FLUSH_BUFFER: return channel->ops->flush_buffer(channel->chan, channel->handle); @@ -849,12 +865,14 @@ static const struct lttng_ust_objd_ops lttng_metadata_ops = { * @objd: the object descriptor * @cmd: the command * @arg: command arg + * @uargs: UST arguments (internal) * * This object descriptor implements lttng commands: * (None for now. Access is done directly though shm.) */ static -long lttng_rb_cmd(int objd, unsigned int cmd, unsigned long arg) +long lttng_rb_cmd(int objd, unsigned int cmd, unsigned long arg, + union ust_args *uargs) { switch (cmd) { default: @@ -905,6 +923,7 @@ static const struct lttng_ust_objd_ops lib_ring_buffer_objd_ops = { * @objd: the object descriptor * @cmd: the command * @arg: command arg + * @uargs: UST arguments (internal) * * This object descriptor implements lttng commands: * LTTNG_UST_CONTEXT @@ -915,7 +934,8 @@ static const struct lttng_ust_objd_ops lib_ring_buffer_objd_ops = { * Disable recording for this event (strong disable) */ static -long lttng_event_cmd(int objd, unsigned int cmd, unsigned long arg) +long lttng_event_cmd(int objd, unsigned int cmd, unsigned long arg, + union ust_args *uargs) { struct ltt_event *event = objd_private(objd); @@ -950,25 +970,27 @@ static const struct lttng_ust_objd_ops lttng_event_ops = { }; /** - * lttng_loglevel_cmd - lttng control through object descriptors + * lttng_wildcard_cmd - lttng control through object descriptors * * @objd: the object descriptor * @cmd: the command * @arg: command arg + * @uargs: UST arguments (internal) * * This object descriptor implements lttng commands: * LTTNG_UST_CONTEXT * Prepend a context field to each record of events of this - * loglevel. + * wildcard. * LTTNG_UST_ENABLE - * Enable recording for these loglevel events (weak enable) + * Enable recording for these wildcard events (weak enable) * LTTNG_UST_DISABLE - * Disable recording for these loglevel events (strong disable) + * Disable recording for these wildcard events (strong disable) */ static -long lttng_loglevel_cmd(int objd, unsigned int cmd, unsigned long arg) +long lttng_wildcard_cmd(int objd, unsigned int cmd, unsigned long arg, + union ust_args *uargs) { - struct loglevel_entry *loglevel = objd_private(objd); + struct session_wildcard *wildcard = objd_private(objd); switch (cmd) { case LTTNG_UST_CONTEXT: @@ -976,31 +998,31 @@ long lttng_loglevel_cmd(int objd, unsigned int cmd, unsigned long arg) #if 0 return lttng_abi_add_context(objd, (struct lttng_ust_context *) arg, - &loglevel->ctx, loglevel->chan->session); + &wildcard->ctx, wildcard->chan->session); #endif case LTTNG_UST_ENABLE: - return ltt_loglevel_enable(loglevel); + return ltt_wildcard_enable(wildcard); case LTTNG_UST_DISABLE: - return ltt_loglevel_disable(loglevel); + return ltt_wildcard_disable(wildcard); default: return -EINVAL; } } static -int lttng_loglevel_release(int objd) +int lttng_wildcard_release(int objd) { - struct loglevel_entry *loglevel = objd_private(objd); + struct session_wildcard *wildcard = objd_private(objd); - if (loglevel) - return lttng_ust_objd_unref(loglevel->chan->objd); + if (wildcard) + return lttng_ust_objd_unref(wildcard->chan->objd); return 0; } /* TODO: filter control ioctl */ -static const struct lttng_ust_objd_ops lttng_loglevel_ops = { - .release = lttng_loglevel_release, - .cmd = lttng_loglevel_cmd, +static const struct lttng_ust_objd_ops lttng_wildcard_ops = { + .release = lttng_wildcard_release, + .cmd = lttng_wildcard_cmd, }; void lttng_ust_abi_exit(void)