Move headers under include/
[lttng-modules.git] / lttng-context-vppid.c
1 /* SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only)
2 *
3 * lttng-context-vppid.c
4 *
5 * LTTng vPPID context.
6 *
7 * Copyright (C) 2009-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
8 */
9
10 #include <linux/module.h>
11 #include <linux/slab.h>
12 #include <linux/sched.h>
13 #include <linux/syscalls.h>
14 #include <lttng/lttng-events.h>
15 #include <ringbuffer/frontend_types.h>
16 #include <lttng/lttng-tracer.h>
17
18 static
19 size_t vppid_get_size(size_t offset)
20 {
21 size_t size = 0;
22
23 size += lib_ring_buffer_align(offset, lttng_alignof(pid_t));
24 size += sizeof(pid_t);
25 return size;
26 }
27
28 static
29 void vppid_record(struct lttng_ctx_field *field,
30 struct lib_ring_buffer_ctx *ctx,
31 struct lttng_channel *chan)
32 {
33 struct task_struct *parent;
34 pid_t vppid;
35
36 /*
37 * current nsproxy can be NULL when scheduled out of exit. pid_vnr uses
38 * the current thread nsproxy to perform the lookup.
39 */
40
41 /*
42 * TODO: when we eventually add RCU subsystem instrumentation,
43 * taking the rcu read lock here will trigger RCU tracing
44 * recursively. We should modify the kernel synchronization so
45 * it synchronizes both for RCU and RCU sched, and rely on
46 * rcu_read_lock_sched_notrace.
47 */
48
49 rcu_read_lock();
50 parent = rcu_dereference(current->real_parent);
51 if (!current->nsproxy)
52 vppid = 0;
53 else
54 vppid = task_tgid_vnr(parent);
55 rcu_read_unlock();
56 lib_ring_buffer_align_ctx(ctx, lttng_alignof(vppid));
57 chan->ops->event_write(ctx, &vppid, sizeof(vppid));
58 }
59
60 static
61 void vppid_get_value(struct lttng_ctx_field *field,
62 struct lttng_probe_ctx *lttng_probe_ctx,
63 union lttng_ctx_value *value)
64 {
65 struct task_struct *parent;
66 pid_t vppid;
67
68 /*
69 * current nsproxy can be NULL when scheduled out of exit. pid_vnr uses
70 * the current thread nsproxy to perform the lookup.
71 */
72
73 /*
74 * TODO: when we eventually add RCU subsystem instrumentation,
75 * taking the rcu read lock here will trigger RCU tracing
76 * recursively. We should modify the kernel synchronization so
77 * it synchronizes both for RCU and RCU sched, and rely on
78 * rcu_read_lock_sched_notrace.
79 */
80
81 rcu_read_lock();
82 parent = rcu_dereference(current->real_parent);
83 if (!current->nsproxy)
84 vppid = 0;
85 else
86 vppid = task_tgid_vnr(parent);
87 rcu_read_unlock();
88 value->s64 = vppid;
89 }
90
91 int lttng_add_vppid_to_ctx(struct lttng_ctx **ctx)
92 {
93 struct lttng_ctx_field *field;
94
95 field = lttng_append_context(ctx);
96 if (!field)
97 return -ENOMEM;
98 if (lttng_find_context(*ctx, "vppid")) {
99 lttng_remove_context_field(ctx, field);
100 return -EEXIST;
101 }
102 field->event_field.name = "vppid";
103 field->event_field.type.atype = atype_integer;
104 field->event_field.type.u.integer.size = sizeof(pid_t) * CHAR_BIT;
105 field->event_field.type.u.integer.alignment = lttng_alignof(pid_t) * CHAR_BIT;
106 field->event_field.type.u.integer.signedness = lttng_is_signed_type(pid_t);
107 field->event_field.type.u.integer.reverse_byte_order = 0;
108 field->event_field.type.u.integer.base = 10;
109 field->event_field.type.u.integer.encoding = lttng_encode_none;
110 field->get_size = vppid_get_size;
111 field->record = vppid_record;
112 field->get_value = vppid_get_value;
113 lttng_context_update(*ctx);
114 return 0;
115 }
116 EXPORT_SYMBOL_GPL(lttng_add_vppid_to_ctx);
This page took 0.031021 seconds and 4 git commands to generate.