Handle refcount of modules having dynamically alloc event description
[lttng-modules.git] / ltt-probes.c
CommitLineData
02119ee5
MD
1/*
2 * ltt-probes.c
3 *
4 * Copyright 2010 (c) - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 *
6 * Holds LTTng probes registry.
7 */
8
9#include <linux/module.h>
10#include <linux/list.h>
11#include <linux/mutex.h>
02119ee5 12
85a9ca7f 13#include "ltt-events.h"
02119ee5
MD
14
15static LIST_HEAD(probe_list);
16static DEFINE_MUTEX(probe_mutex);
02119ee5 17
85a9ca7f
MD
18static
19const struct lttng_event_desc *find_event(const char *name)
02119ee5 20{
85a9ca7f
MD
21 struct lttng_probe_desc *probe_desc;
22 int i;
02119ee5 23
85a9ca7f
MD
24 list_for_each_entry(probe_desc, &probe_list, head) {
25 for (i = 0; i < probe_desc->nr_events; i++) {
26 if (!strcmp(probe_desc->event_desc[i].name, name))
27 return &probe_desc->event_desc[i];
28 }
02119ee5
MD
29 }
30 return NULL;
31}
32
85a9ca7f 33int ltt_probe_register(struct lttng_probe_desc *desc)
02119ee5 34{
02119ee5 35 int ret = 0;
85a9ca7f 36 int i;
02119ee5
MD
37
38 mutex_lock(&probe_mutex);
85a9ca7f
MD
39 /*
40 * TODO: This is O(N^2). Turn into a hash table when probe registration
41 * overhead becomes an issue.
42 */
43 for (i = 0; i < desc->nr_events; i++) {
44 if (find_event(desc->event_desc[i].name)) {
45 ret = -EEXIST;
46 goto end;
47 }
02119ee5 48 }
85a9ca7f 49 list_add(&desc->head, &probe_list);
02119ee5
MD
50end:
51 mutex_unlock(&probe_mutex);
52 return ret;
53}
54EXPORT_SYMBOL_GPL(ltt_probe_register);
55
85a9ca7f 56void ltt_probe_unregister(struct lttng_probe_desc *desc)
02119ee5 57{
02119ee5 58 mutex_lock(&probe_mutex);
85a9ca7f 59 list_del(&desc->head);
02119ee5 60 mutex_unlock(&probe_mutex);
02119ee5
MD
61}
62EXPORT_SYMBOL_GPL(ltt_probe_unregister);
63
85a9ca7f 64const struct lttng_event_desc *ltt_event_get(const char *name)
02119ee5 65{
85a9ca7f 66 const struct lttng_event_desc *event;
02119ee5
MD
67 int ret;
68
69 mutex_lock(&probe_mutex);
85a9ca7f 70 event = find_event(name);
c099397a 71 mutex_unlock(&probe_mutex);
85a9ca7f 72 if (!event)
c099397a 73 return NULL;
dc7f600a 74 ret = try_module_get(event->owner);
02119ee5 75 WARN_ON_ONCE(!ret);
85a9ca7f 76 return event;
02119ee5 77}
85a9ca7f 78EXPORT_SYMBOL_GPL(ltt_event_get);
02119ee5 79
85a9ca7f 80void ltt_event_put(const struct lttng_event_desc *event)
02119ee5 81{
dc7f600a 82 module_put(event->owner);
02119ee5 83}
85a9ca7f 84EXPORT_SYMBOL_GPL(ltt_event_put);
This page took 0.029848 seconds and 4 git commands to generate.