f22351fcb0f92fc83070f3a0b90009ee3adba7ab
4 * Copyright 2010 (c) - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
6 * Holds LTTng per-session event registry.
9 #include <linux/module.h>
10 #include "ltt-events.h"
12 static LIST_HEAD(sessions
);
13 static DEFINE_MUTEX(sessions_mutex
);
14 static struct kmem_cache
*event_cache
;
16 static void synchronize_trace(void)
19 #ifdef CONFIG_PREEMPT_RT
24 struct ltt_session
*ltt_session_create(void)
26 struct ltt_session
*session
;
28 mutex_lock(&sessions_mutex
);
29 session
= kmalloc(sizeof(struct ltt_session
));
32 INIT_LIST_HEAD(&session
->chan
);
33 list_add(&session
->list
, &sessions
);
34 mutex_unlock(&sessions_mutex
);
38 mutex_unlock(&sessions_mutex
);
42 int ltt_session_destroy(struct ltt_session
*session
)
44 struct ltt_channel
*chan
, *tmpchan
;
45 struct ltt_event
*event
, *tmpevent
;
47 mutex_lock(&sessions_mutex
);
49 synchronize_trace(); /* Wait for in-flight events to complete */
50 list_for_each_entry_safe(event
, tmpevent
, &session
->events
, list
)
51 _ltt_event_destroy(event
);
52 list_for_each_entry_safe(chan
, tmpchan
, &session
->chan
, list
)
53 _ltt_channel_destroy(chan
);
54 list_del(&session
->list
);
55 mutex_unlock(&sessions_mutex
);
59 struct ltt_channel
*ltt_channel_create(struct ltt_session
*session
,
60 int overwrite
, void *buf_addr
,
61 size_t subbuf_size
, size_t num_subbuf
,
62 unsigned int switch_timer_interval
,
63 unsigned int read_timer_interval
)
65 struct ltt_channel
*chan
;
67 mutex_lock(&sessions_mutex
);
69 goto active
; /* Refuse to add channel to active session */
70 chan
= kmalloc(sizeof(struct ltt_channel
), GFP_KERNEL
);
73 chan
->session
= session
;
75 /* TODO: create rb channel */
76 list_add(&chan
->list
, &session
->chan
);
77 mutex_unlock(&sessions_mutex
);
82 mutex_unlock(&sessions_mutex
);
87 * Only used internally at session destruction.
89 int _ltt_channel_destroy(struct ltt_channel
*chan
)
91 /* TODO: destroy rb channel */
92 list_del(&chan
->list
);
97 * Supports event creation while tracing session is active.
99 struct ltt_event
*ltt_event_create(struct ltt_channel
*chan
, char *name
,
100 enum instrum_type itype
,
101 void *probe
, void *filter
)
103 struct ltt_event
*event
;
106 mutex_lock(&sessions_mutex
);
107 if (chan
->free_event_id
== -1UL)
110 * This is O(n^2) (for each event loop called at event creation).
111 * Might require a hash if we have lots of events.
113 list_for_each_entry(event
, &chan
->session
->events
, list
)
114 if (!strcmp(event
->name
, name
))
116 event
= kmem_cache_zalloc(events_cache
, GFP_KERNEL
);
119 event
->name
= kmalloc(strlen(name
) + 1, GFP_KERNEL
);
122 strcpy(event
->name
, name
);
124 event
->probe
= probe
;
125 event
->filter
= filter
;
126 event
->id
= chan
->free_event_id
++;
127 event
->itype
= itype
;
128 mutex_unlock(&sessions_mutex
);
129 /* Populate ltt_event structure before tracepoint registration. */
132 case INSTRUM_TRACEPOINTS
:
133 ret
= tracepoint_probe_register(name
, probe
, event
);
141 kmem_cache_free(event
);
145 mutex_unlock(&sessions_mutex
);
150 * Only used internally at session destruction.
152 int _ltt_event_destroy(struct ltt_event
*event
)
154 switch (event
->itype
) {
155 case INSTRUM_TRACEPOINTS
:
156 ret
= tracepoint_probe_unregister(name
, event
->probe
, event
);
162 kmem_cache_free(event
);
165 static int __init
ltt_events_init(void)
169 events_cache
= KMEM_CACHE(ltt_event
, 0);
173 /* TODO: show ABI to userspace */
178 static void __exit
ltt_events_exit(void)
180 struct ltt_session
*session
, *tmpsession
;
182 /* TODO: hide ABI from userspace, wait for callers to release refs. */
184 list_for_each_entry_safe(session
, tmpsession
, &sessions
, list
)
185 ltt_session_destroy(session
);
186 kmem_cache_destroy(events_cache
);
189 MODULE_LICENSE("GPL and additional rights");
190 MODULE_AUTHOR("Mathieu Desnoyers <mathieu.desnoyers@efficios.com>");
191 MODULE_DESCRIPTION("LTTng Events");
This page took 0.03734 seconds and 3 git commands to generate.