From 6b757027d2404725d3ae002ae682f4db878adfbb Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Mon, 1 Nov 2021 15:31:04 -0400 Subject: [PATCH] Refactoring: channel enable/disable using common type Signed-off-by: Mathieu Desnoyers Change-Id: Ie86e23937d00a5d53aa3dbadb7666c176f3c0d52 --- include/lttng/events-internal.h | 4 ++-- src/lttng-abi.c | 4 ++-- src/lttng-events.c | 37 ++++++++++++++++++++++----------- 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/include/lttng/events-internal.h b/include/lttng/events-internal.h index 84c0d009..a016bdf4 100644 --- a/include/lttng/events-internal.h +++ b/include/lttng/events-internal.h @@ -1108,8 +1108,8 @@ struct lttng_kernel_event_notifier *_lttng_event_notifier_create( struct lttng_kernel_abi_event_notifier *event_notifier_param, enum lttng_kernel_abi_instrumentation itype); -int lttng_channel_enable(struct lttng_kernel_channel_buffer *channel); -int lttng_channel_disable(struct lttng_kernel_channel_buffer *channel); +int lttng_channel_enable(struct lttng_kernel_channel_common *channel); +int lttng_channel_disable(struct lttng_kernel_channel_common *channel); int lttng_event_enable(struct lttng_kernel_event_common *event); int lttng_event_disable(struct lttng_kernel_event_common *event); diff --git a/src/lttng-abi.c b/src/lttng-abi.c index 7eafe2d0..d4760561 100644 --- a/src/lttng-abi.c +++ b/src/lttng-abi.c @@ -2527,10 +2527,10 @@ old_ctx_end: } case LTTNG_KERNEL_ABI_OLD_ENABLE: case LTTNG_KERNEL_ABI_ENABLE: - return lttng_channel_enable(channel); + return lttng_channel_enable(&channel->parent); case LTTNG_KERNEL_ABI_OLD_DISABLE: case LTTNG_KERNEL_ABI_DISABLE: - return lttng_channel_disable(channel); + return lttng_channel_disable(&channel->parent); case LTTNG_KERNEL_ABI_SYSCALL_MASK: return lttng_channel_syscall_mask(channel, (struct lttng_kernel_abi_syscall_mask __user *) arg); diff --git a/src/lttng-events.c b/src/lttng-events.c index fe29870d..bed65028 100644 --- a/src/lttng-events.c +++ b/src/lttng-events.c @@ -578,47 +578,60 @@ end: return ret; } -int lttng_channel_enable(struct lttng_kernel_channel_buffer *channel) +static +bool is_channel_buffer_metadata(struct lttng_kernel_channel_common *channel) +{ + struct lttng_kernel_channel_buffer *chan_buf; + + if (channel->type != LTTNG_KERNEL_CHANNEL_TYPE_BUFFER) + return false; + chan_buf = container_of(channel, struct lttng_kernel_channel_buffer, parent); + if (chan_buf->priv->channel_type == METADATA_CHANNEL) + return true; + return false; +} + +int lttng_channel_enable(struct lttng_kernel_channel_common *channel) { int ret = 0; mutex_lock(&sessions_mutex); - if (channel->priv->channel_type == METADATA_CHANNEL) { + if (is_channel_buffer_metadata(channel)) { ret = -EPERM; goto end; } - if (channel->parent.enabled) { + if (channel->enabled) { ret = -EEXIST; goto end; } /* Set transient enabler state to "enabled" */ - channel->priv->parent.tstate = 1; - lttng_session_sync_event_enablers(channel->parent.session); + channel->priv->tstate = 1; + lttng_session_sync_event_enablers(channel->session); /* Set atomically the state to "enabled" */ - WRITE_ONCE(channel->parent.enabled, 1); + WRITE_ONCE(channel->enabled, 1); end: mutex_unlock(&sessions_mutex); return ret; } -int lttng_channel_disable(struct lttng_kernel_channel_buffer *channel) +int lttng_channel_disable(struct lttng_kernel_channel_common *channel) { int ret = 0; mutex_lock(&sessions_mutex); - if (channel->priv->channel_type == METADATA_CHANNEL) { + if (is_channel_buffer_metadata(channel)) { ret = -EPERM; goto end; } - if (!channel->parent.enabled) { + if (!channel->enabled) { ret = -EEXIST; goto end; } /* Set atomically the state to "disabled" */ - WRITE_ONCE(channel->parent.enabled, 0); + WRITE_ONCE(channel->enabled, 0); /* Set transient enabler state to "enabled" */ - channel->priv->parent.tstate = 0; - lttng_session_sync_event_enablers(channel->parent.session); + channel->priv->tstate = 0; + lttng_session_sync_event_enablers(channel->session); end: mutex_unlock(&sessions_mutex); return ret; -- 2.34.1