Skip to content

Commit 0fb3ebe

Browse files
committed
blkalgn: add support
Add blkalgn support to trace block I/Os and report Granularity and Alignment. Signed-off-by: Daniel Gomez <[email protected]>
1 parent 0d5dcf4 commit 0fb3ebe

File tree

4 files changed

+649
-3
lines changed

4 files changed

+649
-3
lines changed

libbpf-tools/Makefile

Lines changed: 15 additions & 3 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 =
@@ -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: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
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+
16+
extern __u32 LINUX_KERNEL_VERSION __kconfig;
17+
18+
char LICENSE[] SEC("license") = "Dual BSD/GPL";
19+
20+
struct {
21+
__uint(type, BPF_MAP_TYPE_RINGBUF);
22+
__uint(max_entries, 2097152);
23+
} rb SEC(".maps");
24+
25+
struct {
26+
__uint(type, BPF_MAP_TYPE_HASH);
27+
__uint(max_entries, 10240);
28+
__type(key, struct hkey);
29+
__type(value, struct hval);
30+
} halgn_map SEC(".maps");
31+
32+
struct {
33+
__uint(type, BPF_MAP_TYPE_HASH);
34+
__uint(max_entries, 10240);
35+
__type(key, struct hkey);
36+
__type(value, struct hval);
37+
} hgran_map SEC(".maps");
38+
39+
static int __always_inline trace_rq_issue(struct request *rq)
40+
{
41+
struct event *e;
42+
u32 dev;
43+
44+
struct gendisk *disk = get_disk(rq);
45+
46+
dev = disk ? MKDEV(BPF_CORE_READ(disk, major),
47+
BPF_CORE_READ(disk, first_minor)) :
48+
0;
49+
50+
if (filter_dev && targ_dev != dev)
51+
return 0;
52+
53+
if (filter_ops && targ_ops != (rq->cmd_flags & 0xff))
54+
return 0;
55+
56+
e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0);
57+
if (!e)
58+
return 0;
59+
60+
bpf_get_current_comm(&e->comm, sizeof(e->comm));
61+
bpf_probe_read_kernel(&e->disk, sizeof(e->disk),
62+
rq->q->disk->disk_name);
63+
64+
e->flags = rq->cmd_flags;
65+
e->lbs = rq->q->limits.logical_block_size;
66+
e->len = rq->__data_len;
67+
e->sector = rq->__sector;
68+
69+
bpf_ringbuf_submit(e, 0);
70+
71+
return 0;
72+
}
73+
74+
SEC("tp_btf/block_rq_issue")
75+
int BPF_PROG(block_rq_issue)
76+
{
77+
/*
78+
* Commit a54895fa (v5.11-rc1) changed tracepoint argument list
79+
* from TP_PROTO(struct request_queue *q, struct request *rq)
80+
* to TP_PROTO(struct request *rq)
81+
*/
82+
if (LINUX_KERNEL_VERSION >= KERNEL_VERSION(5, 11, 0))
83+
return trace_rq_issue((void *)ctx[0]);
84+
else
85+
return trace_rq_issue((void *)ctx[1]);
86+
}

0 commit comments

Comments
 (0)