1 /* SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only)
5 * Copyright (C) 2014 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
8 #include <linux/module.h>
9 #include <linux/kmod.h>
10 #include <linux/mutex.h>
12 #include <wrapper/trace-clock.h>
13 #include <lttng/events.h>
14 #include <lttng/tracer.h>
15 #include <lttng/events-internal.h>
17 struct lttng_trace_clock
*lttng_trace_clock
;
18 EXPORT_SYMBOL_GPL(lttng_trace_clock
);
20 static DEFINE_MUTEX(clock_mutex
);
21 static struct module
*lttng_trace_clock_mod
; /* plugin */
22 static int clock_used
; /* refcount */
24 int lttng_clock_register_plugin(struct lttng_trace_clock
*ltc
,
29 mutex_lock(&clock_mutex
);
34 if (lttng_trace_clock_mod
) {
39 WRITE_ONCE(lttng_trace_clock
, ltc
);
40 lttng_trace_clock_mod
= mod
;
42 mutex_unlock(&clock_mutex
);
45 EXPORT_SYMBOL_GPL(lttng_clock_register_plugin
);
47 void lttng_clock_unregister_plugin(struct lttng_trace_clock
*ltc
,
50 mutex_lock(&clock_mutex
);
51 WARN_ON_ONCE(clock_used
);
52 if (!lttng_trace_clock_mod
) {
55 WARN_ON_ONCE(lttng_trace_clock_mod
!= mod
);
57 WRITE_ONCE(lttng_trace_clock
, NULL
);
58 lttng_trace_clock_mod
= NULL
;
60 mutex_unlock(&clock_mutex
);
62 EXPORT_SYMBOL_GPL(lttng_clock_unregister_plugin
);
64 void lttng_clock_ref(void)
66 mutex_lock(&clock_mutex
);
68 if (lttng_trace_clock_mod
) {
71 ret
= try_module_get(lttng_trace_clock_mod
);
73 printk(KERN_ERR
"LTTng: LTTng-clock cannot get clock plugin module\n");
74 WRITE_ONCE(lttng_trace_clock
, NULL
);
75 lttng_trace_clock_mod
= NULL
;
78 mutex_unlock(&clock_mutex
);
80 EXPORT_SYMBOL_GPL(lttng_clock_ref
);
82 void lttng_clock_unref(void)
84 mutex_lock(&clock_mutex
);
86 if (lttng_trace_clock_mod
)
87 module_put(lttng_trace_clock_mod
);
88 mutex_unlock(&clock_mutex
);
90 EXPORT_SYMBOL_GPL(lttng_clock_unref
);
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
);