Skip to content

Commit 624f51d

Browse files
committed
improve: Fix/Simplify NFS
1 parent e508dec commit 624f51d

File tree

1 file changed

+73
-147
lines changed

1 file changed

+73
-147
lines changed

kernel/nfs_kern.c

Lines changed: 73 additions & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -14,218 +14,144 @@
1414
#include "netdata_ebpf.h"
1515

1616
/************************************************************************************
17-
*
17+
*
1818
* MAP Section
19-
*
19+
*
2020
***********************************************************************************/
2121

2222
NETDATA_BPF_PERCPU_ARRAY_DEF(tbl_nfs, __u32, __u64, NETDATA_FS_MAX_ELEMENTS);
2323
NETDATA_BPF_HASH_DEF(tmp_nfs, __u32, __u64, 4192);
2424
NETDATA_BPF_ARRAY_DEF(nfs_ctrl, __u32, __u64, NETDATA_CONTROLLER_END);
2525

2626
/************************************************************************************
27-
*
28-
* ENTRY Section
29-
*
27+
*
28+
* Helper Functions
29+
*
3030
***********************************************************************************/
3131

32-
static __always_inline int netdata_nfs_entry()
32+
static __always_inline void netdata_nfs_store_bin(__u32 bin, __u32 selection)
33+
{
34+
__u32 idx = selection * NETDATA_FS_MAX_BINS + bin;
35+
if (idx >= NETDATA_FS_MAX_ELEMENTS)
36+
return;
37+
38+
__u64 *fill = bpf_map_lookup_elem(&tbl_nfs, &idx);
39+
if (fill) {
40+
libnetdata_update_u64(fill, 1);
41+
return;
42+
}
43+
44+
bpf_map_update_elem(&tbl_nfs, &idx, &(unsigned long long){1}, BPF_ANY);
45+
libnetdata_update_global(&nfs_ctrl, NETDATA_CONTROLLER_TEMP_TABLE_DEL, 1);
46+
}
47+
48+
static __always_inline int netdata_nfs_ret(struct pt_regs *ctx, __u32 selector)
3349
{
3450
__u64 pid_tgid = bpf_get_current_pid_tgid();
3551
__u32 pid = (__u32)(pid_tgid >> 32);
36-
__u64 ts = bpf_ktime_get_ns();
3752

38-
bpf_map_update_elem(&tmp_nfs, &pid, &ts, BPF_ANY);
53+
__u64 *fill = bpf_map_lookup_elem(&tmp_nfs, &pid);
54+
if (!fill)
55+
return 0;
3956

40-
libnetdata_update_global(&nfs_ctrl, NETDATA_CONTROLLER_TEMP_TABLE_ADD, 1);
57+
__u64 data = bpf_ktime_get_ns() - *fill;
58+
bpf_map_delete_elem(&tmp_nfs, &pid);
59+
60+
if ((s64)data < 0)
61+
return 0;
62+
63+
data /= 1000;
64+
__u32 bin = libnetdata_select_idx(data, NETDATA_FS_MAX_BINS_POS);
65+
netdata_nfs_store_bin(bin, selector);
4166

4267
return 0;
4368
}
4469

70+
/************************************************************************************
71+
*
72+
* ENTRY Section
73+
*
74+
***********************************************************************************/
75+
4576
SEC("kprobe/nfs_file_read")
46-
int netdata_nfs_file_read(struct pt_regs *ctx)
77+
int netdata_nfs_file_read(struct pt_regs *ctx)
4778
{
48-
return netdata_nfs_entry();
79+
__u32 pid = bpf_get_current_pid_tgid() >> 32;
80+
bpf_map_update_elem(&tmp_nfs, &pid, &(unsigned long long){bpf_ktime_get_ns()}, BPF_ANY);
81+
libnetdata_update_global(&nfs_ctrl, NETDATA_CONTROLLER_TEMP_TABLE_ADD, 1);
82+
return 0;
4983
}
5084

5185
SEC("kprobe/nfs_file_write")
52-
int netdata_nfs_file_write(struct pt_regs *ctx)
86+
int netdata_nfs_file_write(struct pt_regs *ctx)
5387
{
54-
return netdata_nfs_entry();
88+
__u32 pid = bpf_get_current_pid_tgid() >> 32;
89+
bpf_map_update_elem(&tmp_nfs, &pid, &(unsigned long long){bpf_ktime_get_ns()}, BPF_ANY);
90+
libnetdata_update_global(&nfs_ctrl, NETDATA_CONTROLLER_TEMP_TABLE_ADD, 1);
91+
return 0;
5592
}
5693

5794
SEC("kprobe/nfs_file_open")
58-
int netdata_nfs_file_open(struct pt_regs *ctx)
95+
int netdata_nfs_file_open(struct pt_regs *ctx)
5996
{
60-
return netdata_nfs_entry();
97+
__u32 pid = bpf_get_current_pid_tgid() >> 32;
98+
bpf_map_update_elem(&tmp_nfs, &pid, &(unsigned long long){bpf_ktime_get_ns()}, BPF_ANY);
99+
libnetdata_update_global(&nfs_ctrl, NETDATA_CONTROLLER_TEMP_TABLE_ADD, 1);
100+
return 0;
61101
}
62102

63103
SEC("kprobe/nfs4_file_open")
64-
int netdata_nfs4_file_open(struct pt_regs *ctx)
104+
int netdata_nfs4_file_open(struct pt_regs *ctx)
65105
{
66-
return netdata_nfs_entry();
106+
__u32 pid = bpf_get_current_pid_tgid() >> 32;
107+
bpf_map_update_elem(&tmp_nfs, &pid, &(unsigned long long){bpf_ktime_get_ns()}, BPF_ANY);
108+
libnetdata_update_global(&nfs_ctrl, NETDATA_CONTROLLER_TEMP_TABLE_ADD, 1);
109+
return 0;
67110
}
68111

69112
SEC("kprobe/nfs_getattr")
70-
int netdata_nfs_getattr(struct pt_regs *ctx)
113+
int netdata_nfs_getattr(struct pt_regs *ctx)
71114
{
72-
return netdata_nfs_entry();
115+
__u32 pid = bpf_get_current_pid_tgid() >> 32;
116+
bpf_map_update_elem(&tmp_nfs, &pid, &(unsigned long long){bpf_ktime_get_ns()}, BPF_ANY);
117+
libnetdata_update_global(&nfs_ctrl, NETDATA_CONTROLLER_TEMP_TABLE_ADD, 1);
118+
return 0;
73119
}
74120

75121
/************************************************************************************
76-
*
122+
*
77123
* END Section
78-
*
124+
*
79125
***********************************************************************************/
80126

81-
static void netdata_nfs_store_bin(__u32 bin, __u32 selection)
82-
{
83-
__u64 *fill, data;
84-
__u32 idx = selection * NETDATA_FS_MAX_BINS + bin;
85-
if (idx >= NETDATA_FS_MAX_ELEMENTS)
86-
return;
87-
88-
fill = bpf_map_lookup_elem(&tbl_nfs, &idx);
89-
if (fill) {
90-
libnetdata_update_u64(fill, 1);
91-
return;
92-
}
93-
94-
data = 1;
95-
bpf_map_update_elem(&tbl_nfs, &idx, &data, BPF_ANY);
96-
97-
libnetdata_update_global(&nfs_ctrl, NETDATA_CONTROLLER_TEMP_TABLE_DEL, 1);
98-
}
99-
100127
SEC("kretprobe/nfs_file_read")
101128
int netdata_ret_nfs_file_read(struct pt_regs *ctx)
102129
{
103-
__u64 *fill, data;
104-
__u64 pid_tgid = bpf_get_current_pid_tgid();
105-
__u32 bin, pid = (__u32)(pid_tgid >> 32);
106-
107-
fill = bpf_map_lookup_elem(&tmp_nfs, &pid);
108-
if (!fill)
109-
return 0;
110-
111-
data = bpf_ktime_get_ns() - *fill;
112-
bpf_map_delete_elem(&tmp_nfs, &pid);
113-
114-
// Skip entries with backward time
115-
if ( (s64)data < 0)
116-
return 0;
117-
118-
// convert to microseconds
119-
data /= 1000;
120-
bin = libnetdata_select_idx(data, NETDATA_FS_MAX_BINS_POS);
121-
netdata_nfs_store_bin(bin, NETDATA_KEY_CALLS_READ);
122-
123-
return 0;
130+
return netdata_nfs_ret(ctx, NETDATA_KEY_CALLS_READ);
124131
}
125132

126133
SEC("kretprobe/nfs_file_write")
127134
int netdata_ret_nfs_file_write(struct pt_regs *ctx)
128135
{
129-
__u64 *fill, data;
130-
__u64 pid_tgid = bpf_get_current_pid_tgid();
131-
__u32 bin, pid = (__u32)(pid_tgid >> 32);
132-
133-
fill = bpf_map_lookup_elem(&tmp_nfs, &pid);
134-
if (!fill)
135-
return 0;
136-
137-
data = bpf_ktime_get_ns() - *fill;
138-
bpf_map_delete_elem(&tmp_nfs, &pid);
139-
140-
// Skip entries with backward time
141-
if ( (s64)data < 0)
142-
return 0;
143-
144-
// convert to microseconds
145-
data /= 1000;
146-
bin = libnetdata_select_idx(data, NETDATA_FS_MAX_BINS_POS);
147-
netdata_nfs_store_bin(bin, NETDATA_KEY_CALLS_WRITE);
148-
149-
return 0;
136+
return netdata_nfs_ret(ctx, NETDATA_KEY_CALLS_WRITE);
150137
}
151138

152139
SEC("kretprobe/nfs_file_open")
153140
int netdata_ret_nfs_file_open(struct pt_regs *ctx)
154141
{
155-
__u64 *fill, data;
156-
__u64 pid_tgid = bpf_get_current_pid_tgid();
157-
__u32 bin, pid = (__u32)(pid_tgid >> 32);
158-
159-
fill = bpf_map_lookup_elem(&tmp_nfs, &pid);
160-
if (!fill)
161-
return 0;
162-
163-
data = bpf_ktime_get_ns() - *fill;
164-
bpf_map_delete_elem(&tmp_nfs, &pid);
165-
166-
// Skip entries with backward time
167-
if ( (s64)data < 0)
168-
return 0;
169-
170-
// convert to microseconds
171-
data /= 1000;
172-
bin = libnetdata_select_idx(data, NETDATA_FS_MAX_BINS_POS);
173-
netdata_nfs_store_bin(bin, NETDATA_KEY_CALLS_OPEN);
174-
175-
return 0;
142+
return netdata_nfs_ret(ctx, NETDATA_KEY_CALLS_OPEN);
176143
}
177144

178145
SEC("kretprobe/nfs4_file_open")
179146
int netdata_ret_nfs4_file_open(struct pt_regs *ctx)
180147
{
181-
__u64 *fill, data;
182-
__u64 pid_tgid = bpf_get_current_pid_tgid();
183-
__u32 bin, pid = (__u32)(pid_tgid >> 32);
184-
185-
fill = bpf_map_lookup_elem(&tmp_nfs, &pid);
186-
if (!fill)
187-
return 0;
188-
189-
data = bpf_ktime_get_ns() - *fill;
190-
bpf_map_delete_elem(&tmp_nfs, &pid);
191-
192-
// Skip entries with backward time
193-
if ( (s64)data < 0)
194-
return 0;
195-
196-
// convert to microseconds
197-
data /= 1000;
198-
bin = libnetdata_select_idx(data, NETDATA_FS_MAX_BINS_POS);
199-
netdata_nfs_store_bin(bin, NETDATA_KEY_CALLS_OPEN);
200-
201-
return 0;
148+
return netdata_nfs_ret(ctx, NETDATA_KEY_CALLS_OPEN);
202149
}
203150

204151
SEC("kretprobe/nfs_getattr")
205-
int netdata_ret_nfs_getattr(struct pt_regs *ctx)
152+
int netdata_ret_nfs_getattr(struct pt_regs *ctx)
206153
{
207-
__u64 *fill, data;
208-
__u64 pid_tgid = bpf_get_current_pid_tgid();
209-
__u32 bin, pid = (__u32)(pid_tgid >> 32);
210-
211-
fill = bpf_map_lookup_elem(&tmp_nfs, &pid);
212-
if (!fill)
213-
return 0;
214-
215-
data = bpf_ktime_get_ns() - *fill;
216-
bpf_map_delete_elem(&tmp_nfs, &pid);
217-
218-
// Skip entries with backward time
219-
if ( (s64)data < 0)
220-
return 0;
221-
222-
// convert to microseconds
223-
data /= 1000;
224-
bin = libnetdata_select_idx(data, NETDATA_FS_MAX_BINS_POS);
225-
netdata_nfs_store_bin(bin, NETDATA_KEY_CALLS_SYNC);
226-
227-
return 0;
154+
return netdata_nfs_ret(ctx, NETDATA_KEY_CALLS_SYNC);
228155
}
229156

230157
char _license[] SEC("license") = "GPL";
231-

0 commit comments

Comments
 (0)