X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt-events.c;h=3532dee5a1c8d46e246fa14c8e6c07a1257f26c7;hb=da4e23320ee3bed6a19fe29c8a0b8b78387be7f3;hp=a94e8f9a1dde6a6e315133e59c66e3659455f99d;hpb=e64957da15e3652322dcf6a5389beb01901de8e6;p=lttng-modules.git diff --git a/ltt-events.c b/ltt-events.c index a94e8f9a..3532dee5 100644 --- a/ltt-events.c +++ b/ltt-events.c @@ -14,7 +14,7 @@ #include #include #include -#include +#include "wrapper/uuid.h" #include "wrapper/vmalloc.h" /* for wrapper_vmalloc_sync_all() */ #include "ltt-events.h" #include "ltt-tracer.h" @@ -34,8 +34,6 @@ int _ltt_event_metadata_statedump(struct ltt_session *session, static int _ltt_session_metadata_statedump(struct ltt_session *session); - -static void synchronize_trace(void) { synchronize_sched(); @@ -108,12 +106,9 @@ int ltt_session_enable(struct ltt_session *session) ACCESS_ONCE(session->active) = 1; ACCESS_ONCE(session->been_active) = 1; - synchronize_trace(); /* Wait for in-flight events to complete */ ret = _ltt_session_metadata_statedump(session); - if (ret) { + if (ret) ACCESS_ONCE(session->active) = 0; - synchronize_trace(); /* Wait for in-flight events to complete */ - } end: mutex_unlock(&sessions_mutex); return ret; @@ -129,7 +124,6 @@ int ltt_session_disable(struct ltt_session *session) goto end; } ACCESS_ONCE(session->active) = 0; - synchronize_trace(); /* Wait for in-flight events to complete */ end: mutex_unlock(&sessions_mutex); return ret; @@ -139,6 +133,8 @@ int ltt_channel_enable(struct ltt_channel *channel) { int old; + if (channel == channel->session->metadata) + return -EPERM; old = xchg(&channel->enabled, 1); if (old) return -EEXIST; @@ -149,6 +145,8 @@ int ltt_channel_disable(struct ltt_channel *channel) { int old; + if (channel == channel->session->metadata) + return -EPERM; old = xchg(&channel->enabled, 0); if (!old) return -EEXIST; @@ -159,6 +157,8 @@ int ltt_event_enable(struct ltt_event *event) { int old; + if (event->chan == event->chan->session->metadata) + return -EPERM; old = xchg(&event->enabled, 1); if (old) return -EEXIST; @@ -169,6 +169,8 @@ int ltt_event_disable(struct ltt_event *event) { int old; + if (event->chan == event->chan->session->metadata) + return -EPERM; old = xchg(&event->enabled, 0); if (!old) return -EEXIST; @@ -194,7 +196,7 @@ struct ltt_channel *ltt_channel_create(struct ltt_session *session, unsigned int read_timer_interval) { struct ltt_channel *chan; - struct ltt_transport *transport; + struct ltt_transport *transport = NULL; mutex_lock(&sessions_mutex); if (session->been_active) @@ -205,6 +207,10 @@ struct ltt_channel *ltt_channel_create(struct ltt_session *session, transport_name); goto notransport; } + if (!try_module_get(transport->owner)) { + printk(KERN_WARNING "LTT : Can't lock transport module.\n"); + goto notransport; + } chan = kzalloc(sizeof(struct ltt_channel), GFP_KERNEL); if (!chan) goto nomem; @@ -222,6 +228,7 @@ struct ltt_channel *ltt_channel_create(struct ltt_session *session, goto create_error; chan->enabled = 1; chan->ops = &transport->ops; + chan->transport = transport; list_add(&chan->list, &session->chan); mutex_unlock(&sessions_mutex); return chan; @@ -229,6 +236,8 @@ struct ltt_channel *ltt_channel_create(struct ltt_session *session, create_error: kfree(chan); nomem: + if (transport) + module_put(transport->owner); notransport: active: mutex_unlock(&sessions_mutex); @@ -242,6 +251,7 @@ static void _ltt_channel_destroy(struct ltt_channel *chan) { chan->ops->channel_destroy(chan->chan); + module_put(chan->transport->owner); list_del(&chan->list); lttng_destroy_context(chan->ctx); kfree(chan);