X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=liblttng-ust%2Flttng-ust-abi.c;h=12b42ea9b0a1d335b0a937330ab24c4806d11e1d;hb=1879f67f1532fe1644a0657a5d52f063b43c0bf4;hp=baea888586536c6555dbad8422db5d86b4a08cba;hpb=6b0e60f149100b0b83b4a813689f75b04b3acb8f;p=lttng-ust.git diff --git a/liblttng-ust/lttng-ust-abi.c b/liblttng-ust/lttng-ust-abi.c index baea8885..12b42ea9 100644 --- a/liblttng-ust/lttng-ust-abi.c +++ b/liblttng-ust/lttng-ust-abi.c @@ -1,10 +1,25 @@ /* * lttng-ust-abi.c * - * Copyright 2010-2011 (c) - Mathieu Desnoyers - * * LTTng UST ABI * + * Copyright (C) 2010-2012 Mathieu Desnoyers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * * Mimic system calls for: * - session creation, returns an object descriptor or failure. * - channel creation, returns an object descriptor or failure. @@ -20,8 +35,6 @@ * - Takes an instrumentation source as parameter * - e.g. tracepoints, dynamic_probes... * - Takes instrumentation source specific arguments. - * - * Dual LGPL v2.1/GPL v2 license. */ #include @@ -29,15 +42,18 @@ #include #include #include +#include +#include "tracepoint-internal.h" #include #include #include "ltt-tracer.h" -#include "tracepoint-internal.h" static int lttng_ust_abi_close_in_progress; static int lttng_abi_tracepoint_list(void); +static +int lttng_abi_tracepoint_field_list(void); /* * Object descriptor table. Should be protected from concurrent access @@ -203,10 +219,10 @@ 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; +static const struct lttng_ust_objd_ops lttng_tracepoint_field_list_ops; enum channel_type { PER_CPU_CHANNEL, @@ -290,6 +306,8 @@ long lttng_abi_add_context(int objd, * Returns the LTTng kernel tracer version * LTTNG_UST_TRACEPOINT_LIST * Returns a file descriptor listing available tracepoints + * LTTNG_UST_TRACEPOINT_FIELD_LIST + * Returns a file descriptor listing available tracepoint fields * LTTNG_UST_WAIT_QUIESCENT * Returns after all previously running probes have completed * @@ -307,6 +325,8 @@ long lttng_cmd(int objd, unsigned int cmd, unsigned long arg, (struct lttng_ust_tracer_version *) arg); case LTTNG_UST_TRACEPOINT_LIST: return lttng_abi_tracepoint_list(); + case LTTNG_UST_TRACEPOINT_FIELD_LIST: + return lttng_abi_tracepoint_field_list(); case LTTNG_UST_WAIT_QUIESCENT: synchronize_trace(); return 0; @@ -331,6 +351,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; @@ -339,7 +361,7 @@ void lttng_metadata_create_events(int channel_objd) * We tolerate no failure path after event creation. It will stay * invariant for the rest of the session. */ - ret = ltt_event_create(channel, &metadata_params, NULL, &event); + ret = ltt_event_create(channel, &metadata_params, &event); if (ret < 0) { goto create_error; } @@ -587,6 +609,88 @@ static const struct lttng_ust_objd_ops lttng_tracepoint_list_ops = { .cmd = lttng_tracepoint_list_cmd, }; +static +long lttng_tracepoint_field_list_cmd(int objd, unsigned int cmd, + unsigned long arg, union ust_args *uargs) +{ + struct lttng_ust_field_list *list = objd_private(objd); + struct lttng_ust_field_iter *tp = &uargs->field_list.entry; + struct lttng_ust_field_iter *iter; + + switch (cmd) { + case LTTNG_UST_TRACEPOINT_FIELD_LIST_GET: + { + retry: + iter = lttng_ust_field_list_get_iter_next(list); + if (!iter) + return -ENOENT; + if (!strcmp(iter->event_name, "lttng_ust:metadata")) + goto retry; + memcpy(tp, iter, sizeof(*tp)); + return 0; + } + default: + return -EINVAL; + } +} + +static +int lttng_abi_tracepoint_field_list(void) +{ + int list_objd, ret; + struct lttng_ust_field_list *list; + + list_objd = objd_alloc(NULL, <tng_tracepoint_field_list_ops); + if (list_objd < 0) { + ret = list_objd; + goto objd_error; + } + list = zmalloc(sizeof(*list)); + if (!list) { + ret = -ENOMEM; + goto alloc_error; + } + objd_set_private(list_objd, list); + + /* populate list by walking on all registered probes. */ + ret = ltt_probes_get_field_list(list); + if (ret) { + goto list_error; + } + return list_objd; + +list_error: + free(list); +alloc_error: + { + int err; + + err = lttng_ust_objd_unref(list_objd); + assert(!err); + } +objd_error: + return ret; +} + +static +int lttng_release_tracepoint_field_list(int objd) +{ + struct lttng_ust_field_list *list = objd_private(objd); + + if (list) { + ltt_probes_prune_field_list(list); + free(list); + return 0; + } else { + return -EINVAL; + } +} + +static const struct lttng_ust_objd_ops lttng_tracepoint_field_list_ops = { + .release = lttng_release_tracepoint_field_list, + .cmd = lttng_tracepoint_field_list_cmd, +}; + struct stream_priv_data { struct lttng_ust_lib_ring_buffer *buf; struct ltt_channel *ltt_chan; @@ -649,7 +753,7 @@ int lttng_abi_create_event(int channel_objd, * We tolerate no failure path after event creation. It will stay * invariant for the rest of the session. */ - ret = ltt_event_create(channel, event_param, NULL, &event); + ret = ltt_event_create(channel, event_param, &event); if (ret < 0) { goto event_error; } @@ -931,6 +1035,8 @@ static const struct lttng_ust_objd_ops lib_ring_buffer_objd_ops = { * Enable recording for this event (weak enable) * LTTNG_UST_DISABLE * Disable recording for this event (strong disable) + * LTTNG_UST_FILTER + * Attach a filter to an event. */ static long lttng_event_cmd(int objd, unsigned int cmd, unsigned long arg, @@ -947,6 +1053,17 @@ long lttng_event_cmd(int objd, unsigned int cmd, unsigned long arg, return ltt_event_enable(event); case LTTNG_UST_DISABLE: return ltt_event_disable(event); + case LTTNG_UST_FILTER: + { + int ret; + ret = lttng_filter_event_attach_bytecode(event, + (struct lttng_ust_filter_bytecode *) arg); + if (ret) + return ret; + lttng_filter_event_link_bytecode(event, + event->filter_bytecode); + return 0; + } default: return -EINVAL; } @@ -968,62 +1085,6 @@ static const struct lttng_ust_objd_ops lttng_event_ops = { .cmd = lttng_event_cmd, }; -/** - * lttng_loglevel_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. - * LTTNG_UST_ENABLE - * Enable recording for these loglevel events (weak enable) - * LTTNG_UST_DISABLE - * Disable recording for these loglevel events (strong disable) - */ -static -long lttng_loglevel_cmd(int objd, unsigned int cmd, unsigned long arg, - union ust_args *uargs) -{ - struct session_loglevel *loglevel = objd_private(objd); - - switch (cmd) { - case LTTNG_UST_CONTEXT: - return -ENOSYS; /* not implemented yet */ -#if 0 - return lttng_abi_add_context(objd, - (struct lttng_ust_context *) arg, - &loglevel->ctx, loglevel->chan->session); -#endif - case LTTNG_UST_ENABLE: - return ltt_loglevel_enable(loglevel); - case LTTNG_UST_DISABLE: - return ltt_loglevel_disable(loglevel); - default: - return -EINVAL; - } -} - -static -int lttng_loglevel_release(int objd) -{ - struct session_loglevel *loglevel = objd_private(objd); - - if (loglevel) - return lttng_ust_objd_unref(loglevel->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, -}; - /** * lttng_wildcard_cmd - lttng control through object descriptors * @@ -1040,6 +1101,8 @@ static const struct lttng_ust_objd_ops lttng_loglevel_ops = { * Enable recording for these wildcard events (weak enable) * LTTNG_UST_DISABLE * Disable recording for these wildcard events (strong disable) + * LTTNG_UST_FILTER + * Attach a filter to a wildcard. */ static long lttng_wildcard_cmd(int objd, unsigned int cmd, unsigned long arg, @@ -1059,6 +1122,17 @@ long lttng_wildcard_cmd(int objd, unsigned int cmd, unsigned long arg, return ltt_wildcard_enable(wildcard); case LTTNG_UST_DISABLE: return ltt_wildcard_disable(wildcard); + case LTTNG_UST_FILTER: + { + int ret; + + ret = lttng_filter_wildcard_attach_bytecode(wildcard, + (struct lttng_ust_filter_bytecode *) arg); + if (ret) + return ret; + lttng_filter_wildcard_link_bytecode(wildcard); + return 0; + } default: return -EINVAL; }