summaryrefslogtreecommitdiffstats
path: root/samples
diff options
context:
space:
mode:
authorDaniel T. Lee <danieltimlee@gmail.com>2023-01-15 16:16:08 +0900
committerAlexei Starovoitov <ast@kernel.org>2023-01-15 13:32:45 -0800
commit58e975d014e1e31bd1586be7d2be6d61bd3e3ada (patch)
tree6dddedfb3da5bfcd686fe1463f69e12e93469e68 /samples
parent31b12a4159fae818ac1043539ec9656da57b2e2c (diff)
downloadlinux-stable-58e975d014e1e31bd1586be7d2be6d61bd3e3ada.tar.gz
linux-stable-58e975d014e1e31bd1586be7d2be6d61bd3e3ada.tar.bz2
linux-stable-58e975d014e1e31bd1586be7d2be6d61bd3e3ada.zip
samples/bpf: replace broken overhead microbenchmark with fib_table_lookup
The test_overhead bpf program is designed to compare performance between tracepoint and kprobe. Initially it used task_rename and urandom_read tracepoint. However, commit 14c174633f34 ("random: remove unused tracepoints") removed urandom_read tracepoint, and for this reason the test_overhead got broken. This commit introduces new microbenchmark using fib_table_lookup. This microbenchmark sends UDP packets to localhost in order to invoke fib_table_lookup. In a nutshell: fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); addr.sin_addr.s_addr = inet_addr(DUMMY_IP); addr.sin_port = htons(DUMMY_PORT); for() { sendto(fd, buf, strlen(buf), 0, (struct sockaddr *)&addr, sizeof(addr)); } on 4 cpus in parallel: lookup per sec base (no tracepoints, no kprobes) 381k with kprobe at fib_table_lookup() 325k with tracepoint at fib:fib_table_lookup 330k with raw_tracepoint at fib:fib_table_lookup 365k Fixes: 14c174633f34 ("random: remove unused tracepoints") Signed-off-by: Daniel T. Lee <danieltimlee@gmail.com> Link: https://lore.kernel.org/r/20230115071613.125791-6-danieltimlee@gmail.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Diffstat (limited to 'samples')
-rw-r--r--samples/bpf/test_overhead_kprobe_kern.c2
-rw-r--r--samples/bpf/test_overhead_raw_tp_kern.c2
-rw-r--r--samples/bpf/test_overhead_tp_kern.c26
-rw-r--r--samples/bpf/test_overhead_user.c28
4 files changed, 40 insertions, 18 deletions
diff --git a/samples/bpf/test_overhead_kprobe_kern.c b/samples/bpf/test_overhead_kprobe_kern.c
index 8fdd2c9c56b2..ba82949338c2 100644
--- a/samples/bpf/test_overhead_kprobe_kern.c
+++ b/samples/bpf/test_overhead_kprobe_kern.c
@@ -39,7 +39,7 @@ int prog(struct pt_regs *ctx)
return 0;
}
-SEC("kprobe/urandom_read")
+SEC("kprobe/fib_table_lookup")
int prog2(struct pt_regs *ctx)
{
return 0;
diff --git a/samples/bpf/test_overhead_raw_tp_kern.c b/samples/bpf/test_overhead_raw_tp_kern.c
index 8763181a32f3..3e29de0eca98 100644
--- a/samples/bpf/test_overhead_raw_tp_kern.c
+++ b/samples/bpf/test_overhead_raw_tp_kern.c
@@ -9,7 +9,7 @@ int prog(struct bpf_raw_tracepoint_args *ctx)
return 0;
}
-SEC("raw_tracepoint/urandom_read")
+SEC("raw_tracepoint/fib_table_lookup")
int prog2(struct bpf_raw_tracepoint_args *ctx)
{
return 0;
diff --git a/samples/bpf/test_overhead_tp_kern.c b/samples/bpf/test_overhead_tp_kern.c
index 80edadacb692..f170e9b1ea21 100644
--- a/samples/bpf/test_overhead_tp_kern.c
+++ b/samples/bpf/test_overhead_tp_kern.c
@@ -22,15 +22,27 @@ int prog(struct task_rename *ctx)
return 0;
}
-/* from /sys/kernel/debug/tracing/events/random/urandom_read/format */
-struct urandom_read {
+/* from /sys/kernel/debug/tracing/events/fib/fib_table_lookup/format */
+struct fib_table_lookup {
__u64 pad;
- int got_bits;
- int pool_left;
- int input_left;
+ __u32 tb_id;
+ int err;
+ int oif;
+ int iif;
+ __u8 proto;
+ __u8 tos;
+ __u8 scope;
+ __u8 flags;
+ __u8 src[4];
+ __u8 dst[4];
+ __u8 gw4[4];
+ __u8 gw6[16];
+ __u16 sport;
+ __u16 dport;
+ char name[16];
};
-SEC("tracepoint/random/urandom_read")
-int prog2(struct urandom_read *ctx)
+SEC("tracepoint/fib/fib_table_lookup")
+int prog2(struct fib_table_lookup *ctx)
{
return 0;
}
diff --git a/samples/bpf/test_overhead_user.c b/samples/bpf/test_overhead_user.c
index 88717f8ec6ac..ce28d30f852e 100644
--- a/samples/bpf/test_overhead_user.c
+++ b/samples/bpf/test_overhead_user.c
@@ -11,6 +11,8 @@
#include <unistd.h>
#include <assert.h>
#include <sys/wait.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
#include <stdlib.h>
#include <signal.h>
#include <linux/bpf.h>
@@ -20,6 +22,8 @@
#include <bpf/libbpf.h>
#define MAX_CNT 1000000
+#define DUMMY_IP "127.0.0.1"
+#define DUMMY_PORT 80
static struct bpf_link *links[2];
static struct bpf_object *obj;
@@ -35,8 +39,8 @@ static __u64 time_get_ns(void)
static void test_task_rename(int cpu)
{
- __u64 start_time;
char buf[] = "test\n";
+ __u64 start_time;
int i, fd;
fd = open("/proc/self/comm", O_WRONLY|O_TRUNC);
@@ -57,26 +61,32 @@ static void test_task_rename(int cpu)
close(fd);
}
-static void test_urandom_read(int cpu)
+static void test_fib_table_lookup(int cpu)
{
+ struct sockaddr_in addr;
+ char buf[] = "test\n";
__u64 start_time;
- char buf[4];
int i, fd;
- fd = open("/dev/urandom", O_RDONLY);
+ fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (fd < 0) {
- printf("couldn't open /dev/urandom\n");
+ printf("couldn't open socket\n");
exit(1);
}
+ memset((char *)&addr, 0, sizeof(addr));
+ addr.sin_addr.s_addr = inet_addr(DUMMY_IP);
+ addr.sin_port = htons(DUMMY_PORT);
+ addr.sin_family = AF_INET;
start_time = time_get_ns();
for (i = 0; i < MAX_CNT; i++) {
- if (read(fd, buf, sizeof(buf)) < 0) {
- printf("failed to read from /dev/urandom: %s\n", strerror(errno));
+ if (sendto(fd, buf, strlen(buf), 0,
+ (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+ printf("failed to start ping: %s\n", strerror(errno));
close(fd);
return;
}
}
- printf("urandom_read:%d: %lld events per sec\n",
+ printf("fib_table_lookup:%d: %lld events per sec\n",
cpu, MAX_CNT * 1000000000ll / (time_get_ns() - start_time));
close(fd);
}
@@ -92,7 +102,7 @@ static void loop(int cpu, int flags)
if (flags & 1)
test_task_rename(cpu);
if (flags & 2)
- test_urandom_read(cpu);
+ test_fib_table_lookup(cpu);
}
static void run_perf_test(int tasks, int flags)