Skip to content

Commit db1c2ed

Browse files
committed
blkalgn: add support
Add blkalgn support to trace block I/Os and report Granularity and Alignment. Update libbpf-tools/Makefile to support math.h and json-c/json.h headers for blkalgn. Update fedora Dockerfile to include json-c development package support. Signed-off-by: Daniel Gomez <[email protected]>
1 parent db5b63f commit db1c2ed

File tree

5 files changed

+912
-5
lines changed

5 files changed

+912
-5
lines changed

docker/build/Dockerfile.fedora

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ RUN dnf -y install \
3535
python3-devel \
3636
libstdc++ \
3737
libstdc++-devel \
38-
systemtap-sdt-devel
38+
systemtap-sdt-devel \
39+
json-c-devel
3940

4041
RUN dnf -y install \
4142
python3 \

libbpf-tools/Makefile

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ $(call allow-override,CC,$(CROSS_COMPILE)cc)
133133
$(call allow-override,LD,$(CROSS_COMPILE)ld)
134134

135135
.PHONY: all
136-
all: $(APPS) $(APP_ALIASES)
136+
all: $(APPS) $(APP_ALIASES) blkalgn
137137

138138
ifeq ($(V),1)
139139
Q =
@@ -161,7 +161,7 @@ endif
161161
.PHONY: clean
162162
clean:
163163
$(call msg,CLEAN)
164-
$(Q)rm -rf $(OUTPUT) $(APPS) $(APP_ALIASES)
164+
$(Q)rm -rf $(OUTPUT) $(APPS) $(APP_ALIASES) blkalgn
165165

166166
$(LIBBLAZESYM_SRC)::
167167
$(Q)cd blazesym && cargo build --release --features=cheader
@@ -186,12 +186,18 @@ $(APPS): %: $(OUTPUT)/%.o $(COMMON_OBJ) $(LIBBPF_OBJ) | $(OUTPUT)
186186
$(call msg,BINARY,$@)
187187
$(Q)$(CC) $(CFLAGS) $^ $(LDFLAGS) -lelf -lz -o $@
188188

189+
blkalgn: %: $(OUTPUT)/%.o $(COMMON_OBJ) $(LIBBPF_OBJ) | $(OUTPUT)
190+
$(call msg,BINARY,$@)
191+
$(Q)$(CC) $(CFLAGS) $^ $(LDFLAGS) -lelf -lz -ljson-c -lm -o $@
192+
189193
ifeq ($(USE_BLAZESYM),1)
190194
$(patsubst %,$(OUTPUT)/%.o,$(BZ_APPS)): $(OUTPUT)/blazesym.h
191195
endif
192196

193197
$(patsubst %,$(OUTPUT)/%.o,$(APPS)): %.o: %.skel.h
194198

199+
$(patsubst %,$(OUTPUT)/%.o,blkalgn): %.o: %.skel.h
200+
195201
$(OUTPUT)/%.o: %.c $(wildcard %.h) $(LIBBPF_OBJ) | $(OUTPUT)
196202
$(call msg,CC,$@)
197203
$(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@
@@ -200,6 +206,10 @@ $(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o | $(OUTPUT) $(BPFTOOL)
200206
$(call msg,GEN-SKEL,$@)
201207
$(Q)$(BPFTOOL) gen skeleton $< > $@
202208

209+
$(OUTPUT)/blkalgn.skel.h: $(OUTPUT)/blkalgn.bpf.o | $(OUTPUT) $(BPFTOOL)
210+
$(call msg,GEN-SKEL,$@)
211+
$(Q)$(BPFTOOL) gen skeleton $< > $@
212+
203213
$(OUTPUT)/softirqs.bpf.o: BPFCFLAGS = $(BPFCFLAGS_softirqs)
204214

205215
$(OUTPUT)/%.bpf.o: %.bpf.c $(LIBBPF_OBJ) $(wildcard %.h) $(ARCH)/vmlinux.h | $(OUTPUT)
@@ -238,11 +248,13 @@ $(SIGSNOOP_ALIAS): sigsnoop
238248
$(call msg,SYMLINK,$@)
239249
$(Q)ln -f -s $(APP_PREFIX)$^ $@
240250

241-
install: $(APPS) $(APP_ALIASES)
251+
install: $(APPS) $(APP_ALIASES) install-blkalgn
242252
$(call msg, INSTALL libbpf-tools)
243253
$(Q)$(INSTALL) -m 0755 -d $(DESTDIR)$(bindir)
244254
$(Q)$(foreach app,$(APPS),$(INSTALL) $(app) $(DESTDIR)$(bindir)/$(APP_PREFIX)$(app);)
245-
$(Q)$(foreach alias,$(APP_ALIASES),cp -a $(alias) $(DESTDIR)$(bindir)/$(APP_PREFIX)$(alias);)
255+
256+
install-blkalgn: blkalgn
257+
$(Q)$(INSTALL) blkalgn $(DESTDIR)$(bindir)/$(APP_PREFIX)blkalgn
246258

247259
.PHONY: force
248260
force:

libbpf-tools/blkalgn.bpf.c

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
/* Copyright (c) 2024 Samsung */
3+
#include "vmlinux.h"
4+
#include <bpf/bpf_helpers.h>
5+
#include <bpf/bpf_tracing.h>
6+
#include <bpf/bpf_core_read.h>
7+
#include "blkalgn.h"
8+
#include "bits.bpf.h"
9+
#include "core_fixes.bpf.h"
10+
11+
const volatile bool filter_dev = false;
12+
const volatile __u32 targ_dev = 0;
13+
const volatile bool filter_ops = false;
14+
const volatile __u32 targ_ops = 0;
15+
const volatile bool filter_len = false;
16+
const volatile __u32 targ_len = 0;
17+
const volatile bool filter_comm = false;
18+
const volatile char targ_comm[TASK_COMM_LEN] = {};
19+
const volatile bool capture_stack = false;
20+
21+
extern __u32 LINUX_KERNEL_VERSION __kconfig;
22+
23+
char LICENSE[] SEC("license") = "Dual BSD/GPL";
24+
25+
struct {
26+
__uint(type, BPF_MAP_TYPE_RINGBUF);
27+
__uint(max_entries, 2097152);
28+
} rb SEC(".maps");
29+
30+
struct {
31+
__uint(type, BPF_MAP_TYPE_HASH);
32+
__uint(max_entries, 10240);
33+
__type(key, struct hkey);
34+
__type(value, struct hval);
35+
} halgn_map SEC(".maps");
36+
37+
struct {
38+
__uint(type, BPF_MAP_TYPE_HASH);
39+
__uint(max_entries, 10240);
40+
__type(key, struct hkey);
41+
__type(value, struct hval);
42+
} hgran_map SEC(".maps");
43+
44+
static __always_inline bool comm_allowed(const char *comm)
45+
{
46+
int i;
47+
48+
for (i = 0; i < TASK_COMM_LEN && targ_comm[i] != '\0'; i++) {
49+
if (comm[i] != targ_comm[i])
50+
return false;
51+
}
52+
return true;
53+
}
54+
55+
static int __always_inline trace_rq_issue(void *ctx, struct request *rq)
56+
{
57+
struct event *e;
58+
u32 dev;
59+
char comm[TASK_COMM_LEN];
60+
61+
struct gendisk *disk = get_disk(rq);
62+
63+
dev = disk ? MKDEV(BPF_CORE_READ(disk, major),
64+
BPF_CORE_READ(disk, first_minor)) :
65+
0;
66+
67+
if (filter_dev && targ_dev != dev)
68+
return 0;
69+
70+
if (filter_ops && targ_ops != (rq->cmd_flags & 0xff))
71+
return 0;
72+
73+
if (filter_len && targ_len != (rq->__data_len))
74+
return 0;
75+
76+
if (filter_comm) {
77+
bpf_get_current_comm(&comm, sizeof(comm));
78+
if (!comm_allowed(comm))
79+
return 0;
80+
}
81+
82+
e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0);
83+
if (!e)
84+
return 0;
85+
86+
bpf_get_current_comm(&e->comm, sizeof(e->comm));
87+
e->pid = bpf_get_current_pid_tgid();
88+
bpf_probe_read_kernel(&e->disk, sizeof(e->disk),
89+
rq->q->disk->disk_name);
90+
91+
if (capture_stack) {
92+
e->kstack_sz =
93+
bpf_get_stack(ctx, e->kstack, sizeof(e->kstack), 0);
94+
e->ustack_sz = bpf_get_stack(ctx, e->ustack, sizeof(e->ustack),
95+
BPF_F_USER_STACK);
96+
}
97+
98+
e->flags = rq->cmd_flags;
99+
e->lbs = rq->q->limits.logical_block_size;
100+
e->len = rq->__data_len;
101+
e->sector = rq->__sector;
102+
103+
bpf_ringbuf_submit(e, 0);
104+
105+
return 0;
106+
}
107+
108+
SEC("tp_btf/block_rq_issue")
109+
int BPF_PROG(block_rq_issue)
110+
{
111+
/*
112+
* Commit a54895fa (v5.11-rc1) changed tracepoint argument list
113+
* from TP_PROTO(struct request_queue *q, struct request *rq)
114+
* to TP_PROTO(struct request *rq)
115+
*/
116+
if (LINUX_KERNEL_VERSION >= KERNEL_VERSION(5, 11, 0))
117+
return trace_rq_issue(ctx, (void *)ctx[0]);
118+
else
119+
return trace_rq_issue(ctx, (void *)ctx[1]);
120+
}

0 commit comments

Comments
 (0)