Fix mm_vmscan_lru_isolate tracepoint for RHEL 9.4 kernel
[lttng-modules.git] / src / lttng-clock.c
1 /* SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only)
2 *
3 * lttng-clock.c
4 *
5 * Copyright (C) 2014 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
6 */
7
8 #include <linux/module.h>
9 #include <linux/kmod.h>
10 #include <linux/mutex.h>
11
12 #include <wrapper/trace-clock.h>
13 #include <lttng/events.h>
14 #include <lttng/tracer.h>
15 #include <lttng/events-internal.h>
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 */
39 WRITE_ONCE(lttng_trace_clock, ltc);
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
57 WRITE_ONCE(lttng_trace_clock, NULL);
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) {
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;
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);
This page took 0.03257 seconds and 5 git commands to generate.