Commit | Line | Data |
---|---|---|
b7cdc182 | 1 | /* SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only) |
9f36eaed | 2 | * |
2754583e MD |
3 | * lttng-clock.c |
4 | * | |
5 | * Copyright (C) 2014 Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | |
2754583e MD |
6 | */ |
7 | ||
8 | #include <linux/module.h> | |
9 | #include <linux/kmod.h> | |
10 | #include <linux/mutex.h> | |
11 | ||
241ae9a8 | 12 | #include <wrapper/trace-clock.h> |
2df37e95 MD |
13 | #include <lttng/events.h> |
14 | #include <lttng/tracer.h> | |
9139e0fa | 15 | #include <lttng/events-internal.h> |
2754583e MD |
16 | |
17 | struct lttng_trace_clock *lttng_trace_clock; | |
18 | EXPORT_SYMBOL_GPL(lttng_trace_clock); | |
19 | ||
20 | static DEFINE_MUTEX(clock_mutex); | |
21 | static struct module *lttng_trace_clock_mod; /* plugin */ | |
22 | static int clock_used; /* refcount */ | |
23 | ||
24 | int lttng_clock_register_plugin(struct lttng_trace_clock *ltc, | |
25 | struct module *mod) | |
26 | { | |
27 | int ret = 0; | |
28 | ||
29 | mutex_lock(&clock_mutex); | |
30 | if (clock_used) { | |
31 | ret = -EBUSY; | |
32 | goto end; | |
33 | } | |
34 | if (lttng_trace_clock_mod) { | |
35 | ret = -EEXIST; | |
36 | goto end; | |
37 | } | |
38 | /* set clock */ | |
a8f2d0c7 | 39 | WRITE_ONCE(lttng_trace_clock, ltc); |
2754583e MD |
40 | lttng_trace_clock_mod = mod; |
41 | end: | |
42 | mutex_unlock(&clock_mutex); | |
43 | return ret; | |
44 | } | |
45 | EXPORT_SYMBOL_GPL(lttng_clock_register_plugin); | |
46 | ||
47 | void lttng_clock_unregister_plugin(struct lttng_trace_clock *ltc, | |
48 | struct module *mod) | |
49 | { | |
50 | mutex_lock(&clock_mutex); | |
51 | WARN_ON_ONCE(clock_used); | |
52 | if (!lttng_trace_clock_mod) { | |
53 | goto end; | |
54 | } | |
55 | WARN_ON_ONCE(lttng_trace_clock_mod != mod); | |
56 | ||
a8f2d0c7 | 57 | WRITE_ONCE(lttng_trace_clock, NULL); |
2754583e MD |
58 | lttng_trace_clock_mod = NULL; |
59 | end: | |
60 | mutex_unlock(&clock_mutex); | |
61 | } | |
62 | EXPORT_SYMBOL_GPL(lttng_clock_unregister_plugin); | |
63 | ||
64 | void lttng_clock_ref(void) | |
65 | { | |
66 | mutex_lock(&clock_mutex); | |
67 | clock_used++; | |
68 | if (lttng_trace_clock_mod) { | |
69 | int ret; | |
70 | ||
71 | ret = try_module_get(lttng_trace_clock_mod); | |
72 | if (!ret) { | |
5a15f70c | 73 | printk(KERN_ERR "LTTng: LTTng-clock cannot get clock plugin module\n"); |
a8f2d0c7 | 74 | WRITE_ONCE(lttng_trace_clock, NULL); |
2754583e MD |
75 | lttng_trace_clock_mod = NULL; |
76 | } | |
77 | } | |
78 | mutex_unlock(&clock_mutex); | |
79 | } | |
80 | EXPORT_SYMBOL_GPL(lttng_clock_ref); | |
81 | ||
82 | void lttng_clock_unref(void) | |
83 | { | |
84 | mutex_lock(&clock_mutex); | |
85 | clock_used--; | |
86 | if (lttng_trace_clock_mod) | |
87 | module_put(lttng_trace_clock_mod); | |
88 | mutex_unlock(&clock_mutex); | |
89 | } | |
90 | EXPORT_SYMBOL_GPL(lttng_clock_unref); | |
91 | ||
92 | MODULE_LICENSE("GPL and additional rights"); | |
93 | MODULE_AUTHOR("Mathieu Desnoyers <mathieu.desnoyers@efficios.com>"); | |
94 | MODULE_DESCRIPTION("LTTng Clock"); | |
95 | MODULE_VERSION(__stringify(LTTNG_MODULES_MAJOR_VERSION) "." | |
96 | __stringify(LTTNG_MODULES_MINOR_VERSION) "." | |
97 | __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION) | |
98 | LTTNG_MODULES_EXTRAVERSION); |