X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ltt-events.c;h=f22351fcb0f92fc83070f3a0b90009ee3adba7ab;hb=ad1c05e136eba463795ba592e5f6c27542643e16;hp=688d7f3bb491811e131cf846e14d251706f80dfa;hpb=e5382b6d90ebe0752f5955a91525f3207f440e18;p=lttng-modules.git diff --git a/ltt-events.c b/ltt-events.c index 688d7f3b..f22351fc 100644 --- a/ltt-events.c +++ b/ltt-events.c @@ -13,18 +13,22 @@ static LIST_HEAD(sessions); static DEFINE_MUTEX(sessions_mutex); static struct kmem_cache *event_cache; -struct ltt_session *ltt_session_create(char *name) +static void synchronize_trace(void) +{ + synchronize_sched(); +#ifdef CONFIG_PREEMPT_RT + synchronize_rcu(); +#endif +} + +struct ltt_session *ltt_session_create(void) { struct ltt_session *session; mutex_lock(&sessions_mutex); - list_for_each_entry(session, &sessions, list) - if (!strcmp(session->name, name)) - goto exist; - session = kmalloc(sizeof(struct ltt_session) + strlen(name) + 1); + session = kmalloc(sizeof(struct ltt_session)); if (!session) return NULL; - strcpy(session->name, name); INIT_LIST_HEAD(&session->chan); list_add(&session->list, &sessions); mutex_unlock(&sessions_mutex); @@ -41,6 +45,8 @@ int ltt_session_destroy(struct ltt_session *session) struct ltt_event *event, *tmpevent; mutex_lock(&sessions_mutex); + session->active = 0; + synchronize_trace(); /* Wait for in-flight events to complete */ list_for_each_entry_safe(event, tmpevent, &session->events, list) _ltt_event_destroy(event); list_for_each_entry_safe(chan, tmpchan, &session->chan, list) @@ -50,7 +56,7 @@ int ltt_session_destroy(struct ltt_session *session) kfree(session); } -struct ltt_channel *ltt_channel_create(struct ltt_session *session, char *name, +struct ltt_channel *ltt_channel_create(struct ltt_session *session, int overwrite, void *buf_addr, size_t subbuf_size, size_t num_subbuf, unsigned int switch_timer_interval, @@ -61,13 +67,9 @@ struct ltt_channel *ltt_channel_create(struct ltt_session *session, char *name, mutex_lock(&sessions_mutex); if (session->active) goto active; /* Refuse to add channel to active session */ - list_for_each_entry(chan, &session->chan, list) - if (!strcmp(chan->name, name)) - goto exist; - chan = kmalloc(sizeof(struct ltt_channel) + strlen(name) + 1, GFP_KERNEL); + chan = kmalloc(sizeof(struct ltt_channel), GFP_KERNEL); if (!chan) return NULL; - strcpy(chan->name, name); chan->session = session; /* TODO: create rb channel */ @@ -86,6 +88,7 @@ active: */ int _ltt_channel_destroy(struct ltt_channel *chan) { + /* TODO: destroy rb channel */ list_del(&chan->list); kfree(chan); } @@ -94,9 +97,11 @@ int _ltt_channel_destroy(struct ltt_channel *chan) * Supports event creation while tracing session is active. */ struct ltt_event *ltt_event_create(struct ltt_channel *chan, char *name, - void *filter) + enum instrum_type itype, + void *probe, void *filter) { struct ltt_event *event; + int ret; mutex_lock(&sessions_mutex); if (chan->free_event_id == -1UL) @@ -116,12 +121,20 @@ struct ltt_event *ltt_event_create(struct ltt_channel *chan, char *name, goto error; strcpy(event->name, name); event->chan = chan; + event->probe = probe; event->filter = filter; event->id = chan->free_event_id++; + event->itype = itype; mutex_unlock(&sessions_mutex); /* Populate ltt_event structure before tracepoint registration. */ smp_wmb(); - /* TODO register to tracepoint */ + switch (itype) { + case INSTRUM_TRACEPOINTS: + ret = tracepoint_probe_register(name, probe, event); + break; + default: + WARN_ON_ONCE(1); + } return event; error: @@ -138,7 +151,13 @@ full: */ int _ltt_event_destroy(struct ltt_event *event) { - /* TODO unregister from tracepoint */ + switch (event->itype) { + case INSTRUM_TRACEPOINTS: + ret = tracepoint_probe_unregister(name, event->probe, event); + break; + default: + WARN_ON_ONCE(1); + } kfree(event->name); kmem_cache_free(event); } @@ -150,10 +169,23 @@ static int __init ltt_events_init(void) events_cache = KMEM_CACHE(ltt_event, 0); if (!events_cache) return -ENOMEM; + + /* TODO: show ABI to userspace */ + return 0; } static void __exit ltt_events_exit(void) { + struct ltt_session *session, *tmpsession; + + /* TODO: hide ABI from userspace, wait for callers to release refs. */ + + list_for_each_entry_safe(session, tmpsession, &sessions, list) + ltt_session_destroy(session); kmem_cache_destroy(events_cache); } + +MODULE_LICENSE("GPL and additional rights"); +MODULE_AUTHOR("Mathieu Desnoyers "); +MODULE_DESCRIPTION("LTTng Events");