static DEFINE_MUTEX(sessions_mutex);
static struct kmem_cache *event_cache;
+static void synchronize_trace(void)
+{
+ synchronize_sched();
+#ifdef CONFIG_PREEMPT_RT
+ synchronize_rcu();
+#endif
+}
+
struct ltt_session *ltt_session_create(char *name)
{
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)
*/
int _ltt_channel_destroy(struct ltt_channel *chan)
{
+ /* TODO: destroy rb channel */
list_del(&chan->list);
kfree(chan);
}
void *filter)
{
struct ltt_event *event;
+ int ret;
mutex_lock(&sessions_mutex);
if (chan->free_event_id == -1UL)
mutex_unlock(&sessions_mutex);
/* Populate ltt_event structure before tracepoint registration. */
smp_wmb();
- /* TODO register to tracepoint */
return event;
error:
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 <mathieu.desnoyers@efficios.com>");
+MODULE_DESCRIPTION("LTTng Events");