X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=liblttng-ust%2Flttng-ust-abi.c;h=61105ace6dccd9d83e00865454e7580252b21199;hb=6ba6fd60507f8e045bdc4f1be14e9d99c6a15f7f;hp=9ba5acd5a60d72f9e9ede918a70b2cab87243abc;hpb=ab89263ef2f50399e608e74557900aa0a3165a61;p=lttng-ust.git diff --git a/liblttng-ust/lttng-ust-abi.c b/liblttng-ust/lttng-ust-abi.c index 9ba5acd5..61105ace 100644 --- a/liblttng-ust/lttng-ust-abi.c +++ b/liblttng-ust/lttng-ust-abi.c @@ -1,24 +1,9 @@ /* - * lttng-ust-abi.c - * - * LTTng UST ABI + * SPDX-License-Identifier: LGPL-2.1-only * * 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 - * + * LTTng UST ABI * * Mimic system calls for: * - session creation, returns an object descriptor or failure. @@ -45,7 +30,6 @@ #include #include -#include #include #include #include @@ -55,12 +39,15 @@ #include #include "../libringbuffer/frontend_types.h" +#include "../libringbuffer/frontend.h" #include "../libringbuffer/shm.h" #include "../libcounter/counter.h" #include "tracepoint-internal.h" #include "lttng-tracer.h" #include "string-utils.h" #include "ust-events-internal.h" +#include "context-internal.h" +#include "ust-helper.h" #define OBJ_NAME_LEN 16 @@ -76,11 +63,11 @@ int lttng_abi_tracepoint_field_list(void *owner); * by the caller. */ -struct lttng_ust_obj { +struct lttng_ust_abi_obj { union { struct { void *private_data; - const struct lttng_ust_objd_ops *ops; + const struct lttng_ust_abi_objd_ops *ops; int f_count; int owner_ref; /* has ref from owner */ void *owner; @@ -90,21 +77,21 @@ struct lttng_ust_obj { } u; }; -struct lttng_ust_objd_table { - struct lttng_ust_obj *array; +struct lttng_ust_abi_objd_table { + struct lttng_ust_abi_obj *array; unsigned int len, allocated_len; int freelist_head; /* offset freelist head. end is -1 */ }; -static struct lttng_ust_objd_table objd_table = { +static struct lttng_ust_abi_objd_table objd_table = { .freelist_head = -1, }; static -int objd_alloc(void *private_data, const struct lttng_ust_objd_ops *ops, +int objd_alloc(void *private_data, const struct lttng_ust_abi_objd_ops *ops, void *owner, const char *name) { - struct lttng_ust_obj *obj; + struct lttng_ust_abi_obj *obj; if (objd_table.freelist_head != -1) { obj = &objd_table.array[objd_table.freelist_head]; @@ -114,7 +101,7 @@ int objd_alloc(void *private_data, const struct lttng_ust_objd_ops *ops, if (objd_table.len >= objd_table.allocated_len) { unsigned int new_allocated_len, old_allocated_len; - struct lttng_ust_obj *new_table, *old_table; + struct lttng_ust_abi_obj *new_table, *old_table; old_allocated_len = objd_table.allocated_len; old_table = objd_table.array; @@ -122,11 +109,11 @@ int objd_alloc(void *private_data, const struct lttng_ust_objd_ops *ops, new_allocated_len = 1; else new_allocated_len = old_allocated_len << 1; - new_table = zmalloc(sizeof(struct lttng_ust_obj) * new_allocated_len); + new_table = zmalloc(sizeof(struct lttng_ust_abi_obj) * new_allocated_len); if (!new_table) return -ENOMEM; memcpy(new_table, old_table, - sizeof(struct lttng_ust_obj) * old_allocated_len); + sizeof(struct lttng_ust_abi_obj) * old_allocated_len); free(old_table); objd_table.array = new_table; objd_table.allocated_len = new_allocated_len; @@ -146,7 +133,7 @@ end: } static -struct lttng_ust_obj *_objd_get(int id) +struct lttng_ust_abi_obj *_objd_get(int id) { if (id >= objd_table.len) return NULL; @@ -158,7 +145,7 @@ struct lttng_ust_obj *_objd_get(int id) static void *objd_private(int id) { - struct lttng_ust_obj *obj = _objd_get(id); + struct lttng_ust_abi_obj *obj = _objd_get(id); assert(obj); return obj->u.s.private_data; } @@ -166,14 +153,14 @@ void *objd_private(int id) static void objd_set_private(int id, void *private_data) { - struct lttng_ust_obj *obj = _objd_get(id); + struct lttng_ust_abi_obj *obj = _objd_get(id); assert(obj); obj->u.s.private_data = private_data; } -const struct lttng_ust_objd_ops *objd_ops(int id) +const struct lttng_ust_abi_objd_ops *lttng_ust_abi_objd_ops(int id) { - struct lttng_ust_obj *obj = _objd_get(id); + struct lttng_ust_abi_obj *obj = _objd_get(id); if (!obj) return NULL; @@ -183,7 +170,7 @@ const struct lttng_ust_objd_ops *objd_ops(int id) static void objd_free(int id) { - struct lttng_ust_obj *obj = _objd_get(id); + struct lttng_ust_abi_obj *obj = _objd_get(id); assert(obj); obj->u.freelist_next = objd_table.freelist_head; @@ -195,14 +182,14 @@ void objd_free(int id) static void objd_ref(int id) { - struct lttng_ust_obj *obj = _objd_get(id); + struct lttng_ust_abi_obj *obj = _objd_get(id); assert(obj != NULL); obj->u.s.f_count++; } -int lttng_ust_objd_unref(int id, int is_owner) +int lttng_ust_abi_objd_unref(int id, int is_owner) { - struct lttng_ust_obj *obj = _objd_get(id); + struct lttng_ust_abi_obj *obj = _objd_get(id); if (!obj) return -EINVAL; @@ -218,7 +205,7 @@ int lttng_ust_objd_unref(int id, int is_owner) obj->u.s.owner_ref--; } if ((--obj->u.s.f_count) == 1) { - const struct lttng_ust_objd_ops *ops = objd_ops(id); + const struct lttng_ust_abi_objd_ops *ops = lttng_ust_abi_objd_ops(id); if (ops->release) ops->release(id); @@ -233,14 +220,14 @@ void objd_table_destroy(void) int i; for (i = 0; i < objd_table.allocated_len; i++) { - struct lttng_ust_obj *obj; + struct lttng_ust_abi_obj *obj; obj = _objd_get(i); if (!obj) continue; if (!obj->u.s.owner_ref) continue; /* only unref owner ref. */ - (void) lttng_ust_objd_unref(i, 1); + (void) lttng_ust_abi_objd_unref(i, 1); } free(objd_table.array); objd_table.array = NULL; @@ -251,19 +238,19 @@ void objd_table_destroy(void) const char *lttng_ust_obj_get_name(int id) { - struct lttng_ust_obj *obj = _objd_get(id); + struct lttng_ust_abi_obj *obj = _objd_get(id); if (!obj) return NULL; return obj->u.s.name; } -void lttng_ust_objd_table_owner_cleanup(void *owner) +void lttng_ust_abi_objd_table_owner_cleanup(void *owner) { int i; for (i = 0; i < objd_table.allocated_len; i++) { - struct lttng_ust_obj *obj; + struct lttng_ust_abi_obj *obj; obj = _objd_get(i); if (!obj) @@ -273,7 +260,7 @@ void lttng_ust_objd_table_owner_cleanup(void *owner) if (!obj->u.s.owner_ref) continue; /* only unref owner ref. */ if (obj->u.s.owner == owner) - (void) lttng_ust_objd_unref(i, 1); + (void) lttng_ust_abi_objd_unref(i, 1); } } @@ -282,14 +269,14 @@ void lttng_ust_objd_table_owner_cleanup(void *owner) * We send commands over a socket. */ -static const struct lttng_ust_objd_ops lttng_ops; -static const struct lttng_ust_objd_ops lttng_event_notifier_group_ops; -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_event_enabler_ops; -static const struct lttng_ust_objd_ops lttng_event_notifier_enabler_ops; -static const struct lttng_ust_objd_ops lttng_tracepoint_list_ops; -static const struct lttng_ust_objd_ops lttng_tracepoint_field_list_ops; +static const struct lttng_ust_abi_objd_ops lttng_ops; +static const struct lttng_ust_abi_objd_ops lttng_event_notifier_group_ops; +static const struct lttng_ust_abi_objd_ops lttng_session_ops; +static const struct lttng_ust_abi_objd_ops lttng_channel_ops; +static const struct lttng_ust_abi_objd_ops lttng_event_enabler_ops; +static const struct lttng_ust_abi_objd_ops lttng_event_notifier_enabler_ops; +static const struct lttng_ust_abi_objd_ops lttng_tracepoint_list_ops; +static const struct lttng_ust_abi_objd_ops lttng_tracepoint_field_list_ops; int lttng_abi_create_root_handle(void) { @@ -301,13 +288,13 @@ int lttng_abi_create_root_handle(void) } static -int lttng_is_channel_ready(struct lttng_channel *lttng_chan) +int lttng_is_channel_ready(struct lttng_ust_channel_buffer *lttng_chan) { - struct channel *chan; + struct lttng_ust_lib_ring_buffer_channel *chan; unsigned int nr_streams, exp_streams; - chan = lttng_chan->chan; - nr_streams = channel_handle_get_nr_streams(lttng_chan->handle); + chan = lttng_chan->priv->rb_chan; + nr_streams = channel_handle_get_nr_streams(lttng_chan->priv->rb_chan->handle); exp_streams = chan->nr_streams; return nr_streams == exp_streams; } @@ -315,7 +302,7 @@ int lttng_is_channel_ready(struct lttng_channel *lttng_chan) static int lttng_abi_create_session(void *owner) { - struct lttng_session *session; + struct lttng_ust_session *session; int session_objd, ret; session = lttng_session_create(); @@ -326,8 +313,8 @@ int lttng_abi_create_session(void *owner) ret = session_objd; goto objd_error; } - session->objd = session_objd; - session->owner = owner; + session->priv->objd = session_objd; + session->priv->owner = owner; return session_objd; objd_error: @@ -336,8 +323,8 @@ objd_error: } static -long lttng_abi_tracer_version(int objd, - struct lttng_ust_tracer_version *v) +long lttng_abi_tracer_version(int objd __attribute__((unused)), + struct lttng_ust_abi_tracer_version *v) { v->major = LTTNG_UST_MAJOR_VERSION; v->minor = LTTNG_UST_MINOR_VERSION; @@ -390,10 +377,10 @@ fd_error: } static -long lttng_abi_add_context(int objd, - struct lttng_ust_context *context_param, - union ust_args *uargs, - struct lttng_ctx **ctx, struct lttng_session *session) +long lttng_abi_add_context(int objd __attribute__((unused)), + struct lttng_ust_abi_context *context_param, + union lttng_ust_abi_args *uargs, + struct lttng_ust_ctx **ctx, struct lttng_ust_session *session) { return lttng_attach_context(context_param, uargs, ctx, session); } @@ -408,37 +395,37 @@ long lttng_abi_add_context(int objd, * @owner: objd owner * * This descriptor implements lttng commands: - * LTTNG_UST_SESSION + * LTTNG_UST_ABI_SESSION * Returns a LTTng trace session object descriptor - * LTTNG_UST_TRACER_VERSION + * LTTNG_UST_ABI_TRACER_VERSION * Returns the LTTng kernel tracer version - * LTTNG_UST_TRACEPOINT_LIST + * LTTNG_UST_ABI_TRACEPOINT_LIST * Returns a file descriptor listing available tracepoints - * LTTNG_UST_TRACEPOINT_FIELD_LIST + * LTTNG_UST_ABI_TRACEPOINT_FIELD_LIST * Returns a file descriptor listing available tracepoint fields - * LTTNG_UST_WAIT_QUIESCENT + * LTTNG_UST_ABI_WAIT_QUIESCENT * Returns after all previously running probes have completed * * The returned session will be deleted when its file descriptor is closed. */ static long lttng_cmd(int objd, unsigned int cmd, unsigned long arg, - union ust_args *uargs, void *owner) + union lttng_ust_abi_args *uargs, void *owner) { switch (cmd) { - case LTTNG_UST_SESSION: + case LTTNG_UST_ABI_SESSION: return lttng_abi_create_session(owner); - case LTTNG_UST_TRACER_VERSION: + case LTTNG_UST_ABI_TRACER_VERSION: return lttng_abi_tracer_version(objd, - (struct lttng_ust_tracer_version *) arg); - case LTTNG_UST_TRACEPOINT_LIST: + (struct lttng_ust_abi_tracer_version *) arg); + case LTTNG_UST_ABI_TRACEPOINT_LIST: return lttng_abi_tracepoint_list(owner); - case LTTNG_UST_TRACEPOINT_FIELD_LIST: + case LTTNG_UST_ABI_TRACEPOINT_FIELD_LIST: return lttng_abi_tracepoint_field_list(owner); - case LTTNG_UST_WAIT_QUIESCENT: - lttng_ust_synchronize_trace(); + case LTTNG_UST_ABI_WAIT_QUIESCENT: + lttng_ust_urcu_synchronize_rcu(); return 0; - case LTTNG_UST_EVENT_NOTIFIER_GROUP_CREATE: + case LTTNG_UST_ABI_EVENT_NOTIFIER_GROUP_CREATE: return lttng_abi_event_notifier_send_fd(owner, &uargs->event_notifier_handle.event_notifier_notif_fd); default: @@ -446,30 +433,31 @@ long lttng_cmd(int objd, unsigned int cmd, unsigned long arg, } } -static const struct lttng_ust_objd_ops lttng_ops = { +static const struct lttng_ust_abi_objd_ops lttng_ops = { .cmd = lttng_cmd, }; static int lttng_abi_map_channel(int session_objd, - struct lttng_ust_channel *ust_chan, - union ust_args *uargs, + struct lttng_ust_abi_channel *ust_chan, + union lttng_ust_abi_args *uargs, void *owner) { - struct lttng_session *session = objd_private(session_objd); + struct lttng_ust_session *session = objd_private(session_objd); const char *transport_name; - const struct lttng_transport *transport; + struct lttng_transport *transport; const char *chan_name; int chan_objd; struct lttng_ust_shm_handle *channel_handle; - struct lttng_channel *lttng_chan; - struct channel *chan; + struct lttng_ust_abi_channel_config *lttng_chan_config; + struct lttng_ust_channel_buffer *lttng_chan_buf; + struct lttng_ust_lib_ring_buffer_channel *chan; struct lttng_ust_lib_ring_buffer_config *config; void *chan_data; int wakeup_fd; uint64_t len; int ret; - enum lttng_ust_chan_type type; + enum lttng_ust_abi_chan_type type; chan_data = uargs->channel.chan_data; wakeup_fd = uargs->channel.wakeup_fd; @@ -477,18 +465,24 @@ int lttng_abi_map_channel(int session_objd, type = ust_chan->type; switch (type) { - case LTTNG_UST_CHAN_PER_CPU: + case LTTNG_UST_ABI_CHAN_PER_CPU: break; default: ret = -EINVAL; goto invalid; } - if (session->been_active) { + if (session->priv->been_active) { ret = -EBUSY; goto active; /* Refuse to add channel to active session */ } + lttng_chan_buf = lttng_ust_alloc_channel_buffer(); + if (!lttng_chan_buf) { + ret = -ENOMEM; + goto lttng_chan_buf_error; + } + channel_handle = channel_handle_create(chan_data, len, wakeup_fd); if (!channel_handle) { ret = -EINVAL; @@ -503,15 +497,20 @@ int lttng_abi_map_channel(int session_objd, assert(chan); chan->handle = channel_handle; config = &chan->backend.config; - lttng_chan = channel_get_private(chan); - if (!lttng_chan) { + lttng_chan_config = channel_get_private_config(chan); + if (!lttng_chan_config) { ret = -EINVAL; goto alloc_error; } + if (lttng_ust_session_uuid_validate(session, lttng_chan_config->uuid)) { + ret = -EINVAL; + goto uuid_error; + } + /* Lookup transport name */ switch (type) { - case LTTNG_UST_CHAN_PER_CPU: + case LTTNG_UST_ABI_CHAN_PER_CPU: if (config->output == RING_BUFFER_MMAP) { if (config->mode == RING_BUFFER_OVERWRITE) { if (config->wakeup == RING_BUFFER_WAKEUP_BY_WRITER) { @@ -536,7 +535,7 @@ int lttng_abi_map_channel(int session_objd, ret = -EINVAL; goto notransport; } - transport = lttng_transport_find(transport_name); + transport = lttng_ust_transport_find(transport_name); if (!transport) { DBG("LTTng transport %s not found\n", transport_name); @@ -551,26 +550,32 @@ int lttng_abi_map_channel(int session_objd, } /* Initialize our lttng chan */ - lttng_chan->chan = chan; - lttng_chan->tstate = 1; - lttng_chan->enabled = 1; - lttng_chan->ctx = NULL; - lttng_chan->session = session; - lttng_chan->ops = &transport->ops; - memcpy(<tng_chan->chan->backend.config, + lttng_chan_buf->parent->enabled = 1; + lttng_chan_buf->parent->session = session; + + lttng_chan_buf->priv->parent.tstate = 1; + lttng_chan_buf->priv->ctx = NULL; + lttng_chan_buf->priv->rb_chan = chan; + + lttng_chan_buf->ops = &transport->ops; + + memcpy(&chan->backend.config, transport->client_config, - sizeof(lttng_chan->chan->backend.config)); - cds_list_add(<tng_chan->node, &session->chan_head); - lttng_chan->header_type = 0; - lttng_chan->handle = channel_handle; - lttng_chan->type = type; + sizeof(chan->backend.config)); + cds_list_add(<tng_chan_buf->priv->node, &session->priv->chan_head); + lttng_chan_buf->priv->header_type = 0; + lttng_chan_buf->priv->type = type; + /* Copy fields from lttng ust chan config. */ + lttng_chan_buf->priv->id = lttng_chan_config->id; + memcpy(lttng_chan_buf->priv->uuid, lttng_chan_config->uuid, LTTNG_UST_UUID_LEN); + channel_set_private(chan, lttng_chan_buf); /* * We tolerate no failure path after channel creation. It will stay * invariant for the rest of the session. */ - objd_set_private(chan_objd, lttng_chan); - lttng_chan->objd = chan_objd; + objd_set_private(chan_objd, lttng_chan_buf); + lttng_chan_buf->priv->parent.objd = chan_objd; /* The channel created holds a reference on the session */ objd_ref(session_objd); return chan_objd; @@ -578,11 +583,15 @@ int lttng_abi_map_channel(int session_objd, /* error path after channel was created */ objd_error: notransport: +uuid_error: alloc_error: channel_destroy(chan, channel_handle, 0); + lttng_ust_free_channel_common(lttng_chan_buf->parent); return ret; handle_error: + lttng_ust_free_channel_common(lttng_chan_buf->parent); +lttng_chan_buf_error: active: invalid: return ret; @@ -598,37 +607,37 @@ invalid: * @owner: objd owner * * This descriptor implements lttng commands: - * LTTNG_UST_CHANNEL + * LTTNG_UST_ABI_CHANNEL * Returns a LTTng channel object descriptor - * LTTNG_UST_ENABLE + * LTTNG_UST_ABI_ENABLE * Enables tracing for a session (weak enable) - * LTTNG_UST_DISABLE + * LTTNG_UST_ABI_DISABLE * Disables tracing for a session (strong disable) * * 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, - union ust_args *uargs, void *owner) + union lttng_ust_abi_args *uargs, void *owner) { - struct lttng_session *session = objd_private(objd); + struct lttng_ust_session *session = objd_private(objd); switch (cmd) { - case LTTNG_UST_CHANNEL: + case LTTNG_UST_ABI_CHANNEL: return lttng_abi_map_channel(objd, - (struct lttng_ust_channel *) arg, + (struct lttng_ust_abi_channel *) arg, uargs, owner); - case LTTNG_UST_SESSION_START: - case LTTNG_UST_ENABLE: + case LTTNG_UST_ABI_SESSION_START: + case LTTNG_UST_ABI_ENABLE: return lttng_session_enable(session); - case LTTNG_UST_SESSION_STOP: - case LTTNG_UST_DISABLE: + case LTTNG_UST_ABI_SESSION_STOP: + case LTTNG_UST_ABI_DISABLE: return lttng_session_disable(session); - case LTTNG_UST_SESSION_STATEDUMP: + case LTTNG_UST_ABI_SESSION_STATEDUMP: return lttng_session_statedump(session); - case LTTNG_UST_COUNTER: - case LTTNG_UST_COUNTER_GLOBAL: - case LTTNG_UST_COUNTER_CPU: + case LTTNG_UST_ABI_COUNTER: + case LTTNG_UST_ABI_COUNTER_GLOBAL: + case LTTNG_UST_ABI_COUNTER_CPU: /* Not implemented yet. */ return -EINVAL; default: @@ -647,7 +656,7 @@ long lttng_session_cmd(int objd, unsigned int cmd, unsigned long arg, static int lttng_release_session(int objd) { - struct lttng_session *session = objd_private(objd); + struct lttng_ust_session *session = objd_private(objd); if (session) { lttng_session_destroy(session); @@ -657,13 +666,13 @@ int lttng_release_session(int objd) } } -static const struct lttng_ust_objd_ops lttng_session_ops = { +static const struct lttng_ust_abi_objd_ops lttng_session_ops = { .release = lttng_release_session, .cmd = lttng_session_cmd, }; static int lttng_ust_event_notifier_enabler_create(int event_notifier_group_obj, - void *owner, struct lttng_ust_event_notifier *event_notifier_param, + void *owner, struct lttng_ust_abi_event_notifier *event_notifier_param, enum lttng_enabler_format_type type) { struct lttng_event_notifier_group *event_notifier_group = @@ -671,7 +680,7 @@ static int lttng_ust_event_notifier_enabler_create(int event_notifier_group_obj, struct lttng_event_notifier_enabler *event_notifier_enabler; int event_notifier_objd, ret; - event_notifier_param->event.name[LTTNG_UST_SYM_NAME_LEN - 1] = '\0'; + event_notifier_param->event.name[LTTNG_UST_ABI_SYM_NAME_LEN - 1] = '\0'; event_notifier_objd = objd_alloc(NULL, <tng_event_notifier_enabler_ops, owner, "event_notifier enabler"); if (event_notifier_objd < 0) { @@ -696,7 +705,7 @@ event_notifier_error: { int err; - err = lttng_ust_objd_unref(event_notifier_objd, 1); + err = lttng_ust_abi_objd_unref(event_notifier_objd, 1); assert(!err); } objd_error: @@ -705,24 +714,25 @@ objd_error: static long lttng_event_notifier_enabler_cmd(int objd, unsigned int cmd, unsigned long arg, - union ust_args *uargs, void *owner) + union lttng_ust_abi_args *uargs __attribute__((unused)), + void *owner __attribute__((unused))) { struct lttng_event_notifier_enabler *event_notifier_enabler = objd_private(objd); switch (cmd) { - case LTTNG_UST_FILTER: + case LTTNG_UST_ABI_FILTER: return lttng_event_notifier_enabler_attach_filter_bytecode( event_notifier_enabler, (struct lttng_ust_bytecode_node **) arg); - case LTTNG_UST_EXCLUSION: + case LTTNG_UST_ABI_EXCLUSION: return lttng_event_notifier_enabler_attach_exclusion(event_notifier_enabler, (struct lttng_ust_excluder_node **) arg); - case LTTNG_UST_CAPTURE: + case LTTNG_UST_ABI_CAPTURE: return lttng_event_notifier_enabler_attach_capture_bytecode( event_notifier_enabler, - (struct lttng_ust_bytecode_node *) arg); - case LTTNG_UST_ENABLE: + (struct lttng_ust_bytecode_node **) arg); + case LTTNG_UST_ABI_ENABLE: return lttng_event_notifier_enabler_enable(event_notifier_enabler); - case LTTNG_UST_DISABLE: + case LTTNG_UST_ABI_DISABLE: return lttng_event_notifier_enabler_disable(event_notifier_enabler); default: return -EINVAL; @@ -739,51 +749,64 @@ long lttng_event_notifier_enabler_cmd(int objd, unsigned int cmd, unsigned long * @owner: objd owner * * This descriptor implements lttng commands: - * LTTNG_UST_COUNTER_GLOBAL + * LTTNG_UST_ABI_COUNTER_GLOBAL * Return negative error code on error, 0 on success. - * LTTNG_UST_COUNTER_CPU + * LTTNG_UST_ABI_COUNTER_CPU * Return negative error code on error, 0 on success. */ static long lttng_event_notifier_group_error_counter_cmd(int objd, unsigned int cmd, unsigned long arg, - union ust_args *uargs, void *owner) + union lttng_ust_abi_args *uargs, void *owner __attribute__((unused))) { + int ret; struct lttng_counter *counter = objd_private(objd); switch (cmd) { - case LTTNG_UST_COUNTER_GLOBAL: - return -EINVAL; /* Unimplemented. */ - case LTTNG_UST_COUNTER_CPU: + case LTTNG_UST_ABI_COUNTER_GLOBAL: + ret = -EINVAL; /* Unimplemented. */ + break; + case LTTNG_UST_ABI_COUNTER_CPU: { - struct lttng_ust_counter_cpu *counter_cpu = - (struct lttng_ust_counter_cpu *)arg; - return lttng_counter_set_cpu_shm(counter->counter, + struct lttng_ust_abi_counter_cpu *counter_cpu = + (struct lttng_ust_abi_counter_cpu *)arg; + + ret = lttng_counter_set_cpu_shm(counter->counter, counter_cpu->cpu_nr, uargs->counter_shm.shm_fd); + if (!ret) { + /* Take ownership of the shm_fd. */ + uargs->counter_shm.shm_fd = -1; + } + break; } default: - return -EINVAL; + ret = -EINVAL; + break; } + + return ret; } +int lttng_release_event_notifier_group_error_counter(int objd) + __attribute__((visibility("hidden"))); int lttng_release_event_notifier_group_error_counter(int objd) { struct lttng_counter *counter = objd_private(objd); if (counter) { - return lttng_ust_objd_unref(counter->event_notifier_group->objd, 0); + return lttng_ust_abi_objd_unref(counter->event_notifier_group->objd, 0); } else { return -EINVAL; } } -static const struct lttng_ust_objd_ops lttng_event_notifier_group_error_counter_ops = { +static const struct lttng_ust_abi_objd_ops lttng_event_notifier_group_error_counter_ops = { .release = lttng_release_event_notifier_group_error_counter, .cmd = lttng_event_notifier_group_error_counter_cmd, }; static int lttng_ust_event_notifier_group_create_error_counter(int event_notifier_group_objd, void *owner, - struct lttng_ust_counter_conf *error_counter_conf) + struct lttng_ust_abi_counter_conf *error_counter_conf) { const char *counter_transport_name; struct lttng_event_notifier_group *event_notifier_group = @@ -796,17 +819,17 @@ int lttng_ust_event_notifier_group_create_error_counter(int event_notifier_group if (event_notifier_group->error_counter) return -EBUSY; - if (error_counter_conf->arithmetic != LTTNG_UST_COUNTER_ARITHMETIC_MODULAR) + if (error_counter_conf->arithmetic != LTTNG_UST_ABI_COUNTER_ARITHMETIC_MODULAR) return -EINVAL; if (error_counter_conf->number_dimensions != 1) return -EINVAL; switch (error_counter_conf->bitness) { - case LTTNG_UST_COUNTER_BITNESS_64: + case LTTNG_UST_ABI_COUNTER_BITNESS_64: counter_transport_name = "counter-per-cpu-64-modular"; break; - case LTTNG_UST_COUNTER_BITNESS_32: + case LTTNG_UST_ABI_COUNTER_BITNESS_32: counter_transport_name = "counter-per-cpu-32-modular"; break; default: @@ -857,7 +880,7 @@ create_error: { int err; - err = lttng_ust_objd_unref(counter_objd, 1); + err = lttng_ust_abi_objd_unref(counter_objd, 1); assert(!err); } objd_error: @@ -866,13 +889,13 @@ objd_error: static long lttng_event_notifier_group_cmd(int objd, unsigned int cmd, unsigned long arg, - union ust_args *uargs, void *owner) + union lttng_ust_abi_args *uargs, void *owner) { switch (cmd) { - case LTTNG_UST_EVENT_NOTIFIER_CREATE: + case LTTNG_UST_ABI_EVENT_NOTIFIER_CREATE: { - struct lttng_ust_event_notifier *event_notifier_param = - (struct lttng_ust_event_notifier *) arg; + struct lttng_ust_abi_event_notifier *event_notifier_param = + (struct lttng_ust_abi_event_notifier *) arg; if (strutils_is_star_glob_pattern(event_notifier_param->event.name)) { /* * If the event name is a star globbing pattern, @@ -887,10 +910,10 @@ long lttng_event_notifier_group_cmd(int objd, unsigned int cmd, unsigned long ar LTTNG_ENABLER_FORMAT_EVENT); } } - case LTTNG_UST_COUNTER: + case LTTNG_UST_ABI_COUNTER: { - struct lttng_ust_counter_conf *counter_conf = - (struct lttng_ust_counter_conf *) uargs->counter.counter_data; + struct lttng_ust_abi_counter_conf *counter_conf = + (struct lttng_ust_abi_counter_conf *) uargs->counter.counter_data; return lttng_ust_event_notifier_group_create_error_counter( objd, owner, counter_conf); } @@ -905,11 +928,11 @@ int lttng_event_notifier_enabler_release(int objd) struct lttng_event_notifier_enabler *event_notifier_enabler = objd_private(objd); if (event_notifier_enabler) - return lttng_ust_objd_unref(event_notifier_enabler->group->objd, 0); + return lttng_ust_abi_objd_unref(event_notifier_enabler->group->objd, 0); return 0; } -static const struct lttng_ust_objd_ops lttng_event_notifier_enabler_ops = { +static const struct lttng_ust_abi_objd_ops lttng_event_notifier_enabler_ops = { .release = lttng_event_notifier_enabler_release, .cmd = lttng_event_notifier_enabler_cmd, }; @@ -927,22 +950,23 @@ int lttng_release_event_notifier_group(int objd) } } -static const struct lttng_ust_objd_ops lttng_event_notifier_group_ops = { +static const struct lttng_ust_abi_objd_ops lttng_event_notifier_group_ops = { .release = lttng_release_event_notifier_group, .cmd = lttng_event_notifier_group_cmd, }; static long lttng_tracepoint_list_cmd(int objd, unsigned int cmd, unsigned long arg, - union ust_args *uargs, void *owner) + union lttng_ust_abi_args *uargs __attribute__((unused)), + void *owner __attribute__((unused))) { struct lttng_ust_tracepoint_list *list = objd_private(objd); - struct lttng_ust_tracepoint_iter *tp = - (struct lttng_ust_tracepoint_iter *) arg; - struct lttng_ust_tracepoint_iter *iter; + struct lttng_ust_abi_tracepoint_iter *tp = + (struct lttng_ust_abi_tracepoint_iter *) arg; + struct lttng_ust_abi_tracepoint_iter *iter; switch (cmd) { - case LTTNG_UST_TRACEPOINT_LIST_GET: + case LTTNG_UST_ABI_TRACEPOINT_LIST_GET: { iter = lttng_ust_tracepoint_list_get_iter_next(list); if (!iter) @@ -986,7 +1010,7 @@ alloc_error: { int err; - err = lttng_ust_objd_unref(list_objd, 1); + err = lttng_ust_abi_objd_unref(list_objd, 1); assert(!err); } objd_error: @@ -1007,21 +1031,22 @@ int lttng_release_tracepoint_list(int objd) } } -static const struct lttng_ust_objd_ops lttng_tracepoint_list_ops = { +static const struct lttng_ust_abi_objd_ops lttng_tracepoint_list_ops = { .release = lttng_release_tracepoint_list, .cmd = lttng_tracepoint_list_cmd, }; static long lttng_tracepoint_field_list_cmd(int objd, unsigned int cmd, - unsigned long arg, union ust_args *uargs, void *owner) + unsigned long arg __attribute__((unused)), union lttng_ust_abi_args *uargs, + void *owner __attribute__((unused))) { 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; + struct lttng_ust_abi_field_iter *tp = &uargs->field_list.entry; + struct lttng_ust_abi_field_iter *iter; switch (cmd) { - case LTTNG_UST_TRACEPOINT_FIELD_LIST_GET: + case LTTNG_UST_ABI_TRACEPOINT_FIELD_LIST_GET: { iter = lttng_ust_field_list_get_iter_next(list); if (!iter) @@ -1066,7 +1091,7 @@ alloc_error: { int err; - err = lttng_ust_objd_unref(list_objd, 1); + err = lttng_ust_abi_objd_unref(list_objd, 1); assert(!err); } objd_error: @@ -1087,19 +1112,19 @@ int lttng_release_tracepoint_field_list(int objd) } } -static const struct lttng_ust_objd_ops lttng_tracepoint_field_list_ops = { +static const struct lttng_ust_abi_objd_ops lttng_tracepoint_field_list_ops = { .release = lttng_release_tracepoint_field_list, .cmd = lttng_tracepoint_field_list_cmd, }; static -int lttng_abi_map_stream(int channel_objd, struct lttng_ust_stream *info, - union ust_args *uargs, void *owner) +int lttng_abi_map_stream(int channel_objd, struct lttng_ust_abi_stream *info, + union lttng_ust_abi_args *uargs, void *owner __attribute__((unused))) { - struct lttng_channel *channel = objd_private(channel_objd); + struct lttng_ust_channel_buffer *lttng_chan_buf = objd_private(channel_objd); int ret; - ret = channel_handle_add_stream(channel->handle, + ret = channel_handle_add_stream(lttng_chan_buf->priv->rb_chan->handle, uargs->stream.shm_fd, uargs->stream.wakeup_fd, info->stream_nr, info->len); if (ret) @@ -1116,15 +1141,15 @@ error_add_stream: static int lttng_abi_create_event_enabler(int channel_objd, - struct lttng_ust_event *event_param, + struct lttng_ust_abi_event *event_param, void *owner, enum lttng_enabler_format_type format_type) { - struct lttng_channel *channel = objd_private(channel_objd); + struct lttng_ust_channel_buffer *channel = objd_private(channel_objd); struct lttng_event_enabler *enabler; int event_objd, ret; - event_param->name[LTTNG_UST_SYM_NAME_LEN - 1] = '\0'; + event_param->name[LTTNG_UST_ABI_SYM_NAME_LEN - 1] = '\0'; event_objd = objd_alloc(NULL, <tng_event_enabler_ops, owner, "event enabler"); if (event_objd < 0) { @@ -1149,7 +1174,7 @@ event_error: { int err; - err = lttng_ust_objd_unref(event_objd, 1); + err = lttng_ust_abi_objd_unref(event_objd, 1); assert(!err); } objd_error: @@ -1166,47 +1191,47 @@ objd_error: * @owner: objd owner * * This object descriptor implements lttng commands: - * LTTNG_UST_STREAM + * LTTNG_UST_ABI_STREAM * Returns an event stream object descriptor or failure. * (typically, one event stream records events from one CPU) - * LTTNG_UST_EVENT + * LTTNG_UST_ABI_EVENT * Returns an event object descriptor or failure. - * LTTNG_UST_CONTEXT + * LTTNG_UST_ABI_CONTEXT * Prepend a context field to each event in the channel - * LTTNG_UST_ENABLE + * LTTNG_UST_ABI_ENABLE * Enable recording for events in this channel (weak enable) - * LTTNG_UST_DISABLE + * LTTNG_UST_ABI_DISABLE * Disable recording for events in this channel (strong disable) * * 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, - union ust_args *uargs, void *owner) + union lttng_ust_abi_args *uargs, void *owner) { - struct lttng_channel *channel = objd_private(objd); + struct lttng_ust_channel_buffer *lttng_chan_buf = objd_private(objd); - if (cmd != LTTNG_UST_STREAM) { + if (cmd != LTTNG_UST_ABI_STREAM) { /* * Check if channel received all streams. */ - if (!lttng_is_channel_ready(channel)) + if (!lttng_is_channel_ready(lttng_chan_buf)) return -EPERM; } switch (cmd) { - case LTTNG_UST_STREAM: + case LTTNG_UST_ABI_STREAM: { - struct lttng_ust_stream *stream; + struct lttng_ust_abi_stream *stream; - stream = (struct lttng_ust_stream *) arg; + stream = (struct lttng_ust_abi_stream *) arg; /* stream used as output */ return lttng_abi_map_stream(objd, stream, uargs, owner); } - case LTTNG_UST_EVENT: + case LTTNG_UST_ABI_EVENT: { - struct lttng_ust_event *event_param = - (struct lttng_ust_event *) arg; + struct lttng_ust_abi_event *event_param = + (struct lttng_ust_abi_event *) arg; if (strutils_is_star_glob_pattern(event_param->name)) { /* @@ -1220,16 +1245,17 @@ long lttng_channel_cmd(int objd, unsigned int cmd, unsigned long arg, owner, LTTNG_ENABLER_FORMAT_EVENT); } } - case LTTNG_UST_CONTEXT: + case LTTNG_UST_ABI_CONTEXT: return lttng_abi_add_context(objd, - (struct lttng_ust_context *) arg, uargs, - &channel->ctx, channel->session); - case LTTNG_UST_ENABLE: - return lttng_channel_enable(channel); - case LTTNG_UST_DISABLE: - return lttng_channel_disable(channel); - case LTTNG_UST_FLUSH_BUFFER: - return channel->ops->flush_buffer(channel->chan, channel->handle); + (struct lttng_ust_abi_context *) arg, uargs, + <tng_chan_buf->priv->ctx, + lttng_chan_buf->parent->session); + case LTTNG_UST_ABI_ENABLE: + return lttng_channel_enable(lttng_chan_buf->parent); + case LTTNG_UST_ABI_DISABLE: + return lttng_channel_disable(lttng_chan_buf->parent); + case LTTNG_UST_ABI_FLUSH_BUFFER: + return lttng_chan_buf->ops->priv->flush_buffer(lttng_chan_buf); default: return -EINVAL; } @@ -1238,14 +1264,14 @@ long lttng_channel_cmd(int objd, unsigned int cmd, unsigned long arg, static int lttng_channel_release(int objd) { - struct lttng_channel *channel = objd_private(objd); + struct lttng_ust_channel_buffer *lttng_chan_buf = objd_private(objd); - if (channel) - return lttng_ust_objd_unref(channel->session->objd, 0); + if (lttng_chan_buf) + return lttng_ust_abi_objd_unref(lttng_chan_buf->parent->session->priv->objd, 0); return 0; } -static const struct lttng_ust_objd_ops lttng_channel_ops = { +static const struct lttng_ust_abi_objd_ops lttng_channel_ops = { .release = lttng_channel_release, .cmd = lttng_channel_cmd, }; @@ -1260,33 +1286,34 @@ static const struct lttng_ust_objd_ops lttng_channel_ops = { * @owner: objd owner * * This object descriptor implements lttng commands: - * LTTNG_UST_CONTEXT + * LTTNG_UST_ABI_CONTEXT * Prepend a context field to each record of events of this * enabler. - * LTTNG_UST_ENABLE + * LTTNG_UST_ABI_ENABLE * Enable recording for this enabler - * LTTNG_UST_DISABLE + * LTTNG_UST_ABI_DISABLE * Disable recording for this enabler - * LTTNG_UST_FILTER + * LTTNG_UST_ABI_FILTER * Attach a filter to an enabler. - * LTTNG_UST_EXCLUSION + * LTTNG_UST_ABI_EXCLUSION * Attach exclusions to an enabler. */ static long lttng_event_enabler_cmd(int objd, unsigned int cmd, unsigned long arg, - union ust_args *uargs, void *owner) + union lttng_ust_abi_args *uargs __attribute__((unused)), + void *owner __attribute__((unused))) { struct lttng_event_enabler *enabler = objd_private(objd); switch (cmd) { - case LTTNG_UST_CONTEXT: + case LTTNG_UST_ABI_CONTEXT: return lttng_event_enabler_attach_context(enabler, - (struct lttng_ust_context *) arg); - case LTTNG_UST_ENABLE: + (struct lttng_ust_abi_context *) arg); + case LTTNG_UST_ABI_ENABLE: return lttng_event_enabler_enable(enabler); - case LTTNG_UST_DISABLE: + case LTTNG_UST_ABI_DISABLE: return lttng_event_enabler_disable(enabler); - case LTTNG_UST_FILTER: + case LTTNG_UST_ABI_FILTER: { int ret; @@ -1296,7 +1323,7 @@ long lttng_event_enabler_cmd(int objd, unsigned int cmd, unsigned long arg, return ret; return 0; } - case LTTNG_UST_EXCLUSION: + case LTTNG_UST_ABI_EXCLUSION: { return lttng_event_enabler_attach_exclusion(enabler, (struct lttng_ust_excluder_node **) arg); @@ -1312,12 +1339,12 @@ int lttng_event_enabler_release(int objd) struct lttng_event_enabler *event_enabler = objd_private(objd); if (event_enabler) - return lttng_ust_objd_unref(event_enabler->chan->objd, 0); + return lttng_ust_abi_objd_unref(event_enabler->chan->priv->parent.objd, 0); return 0; } -static const struct lttng_ust_objd_ops lttng_event_enabler_ops = { +static const struct lttng_ust_abi_objd_ops lttng_event_enabler_ops = { .release = lttng_event_enabler_release, .cmd = lttng_event_enabler_cmd, };