3060c07e05d2386d8d90d0482b3040d3d0f970b9
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
;
74 init_waitqueue_head(&chan
->notify_wait
);
76 /* TODO: create rb channel */
77 list_add(&chan
->list
, &session
->chan
);
78 mutex_unlock(&sessions_mutex
);
83 mutex_unlock(&sessions_mutex
);
88 * Only used internally at session destruction.
90 int _ltt_channel_destroy(struct ltt_channel
*chan
)
92 /* TODO: destroy rb channel */
93 list_del(&chan
->list
);
98 * Supports event creation while tracing session is active.
100 struct ltt_event
*ltt_event_create(struct ltt_channel
*chan
, char *name
,
101 enum instrum_type itype
,
102 void *probe
, void *filter
)
104 struct ltt_event
*event
;
107 mutex_lock(&sessions_mutex
);
108 if (chan
->free_event_id
== -1UL)
111 * This is O(n^2) (for each event loop called at event creation).
112 * Might require a hash if we have lots of events.
114 list_for_each_entry(event
, &chan
->session
->events
, list
)
115 if (!strcmp(event
->name
, name
))
117 event
= kmem_cache_zalloc(events_cache
, GFP_KERNEL
);
120 event
->name
= kmalloc(strlen(name
) + 1, GFP_KERNEL
);
123 strcpy(event
->name
, name
);
125 event
->probe
= probe
;
126 event
->filter
= filter
;
127 event
->id
= chan
->free_event_id
++;
128 event
->itype
= itype
;
129 mutex_unlock(&sessions_mutex
);
130 /* Populate ltt_event structure before tracepoint registration. */
133 case INSTRUM_TRACEPOINTS
:
134 ret
= tracepoint_probe_register(name
, probe
, event
);
142 kmem_cache_free(event
);
146 mutex_unlock(&sessions_mutex
);
151 * Only used internally at session destruction.
153 int _ltt_event_destroy(struct ltt_event
*event
)
155 switch (event
->itype
) {
156 case INSTRUM_TRACEPOINTS
:
157 ret
= tracepoint_probe_unregister(name
, event
->probe
, event
);
163 kmem_cache_free(event
);
166 static int __init
ltt_events_init(void)
170 events_cache
= KMEM_CACHE(ltt_event
, 0);
174 /* TODO: show ABI to userspace */
179 static void __exit
ltt_events_exit(void)
181 struct ltt_session
*session
, *tmpsession
;
183 /* TODO: hide ABI from userspace, wait for callers to release refs. */
185 list_for_each_entry_safe(session
, tmpsession
, &sessions
, list
)
186 ltt_session_destroy(session
);
187 kmem_cache_destroy(events_cache
);
190 MODULE_LICENSE("GPL and additional rights");
191 MODULE_AUTHOR("Mathieu Desnoyers <mathieu.desnoyers@efficios.com>");
192 MODULE_DESCRIPTION("LTTng Events");
This page took 0.034369 seconds and 4 git commands to generate.