[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 4/5] ebpf_rss_helper: Added helper for eBPF RSS.
From: |
Andrew Melnychenko |
Subject: |
[PATCH 4/5] ebpf_rss_helper: Added helper for eBPF RSS. |
Date: |
Sun, 19 Feb 2023 18:20:59 +0200 |
Helper program. Loads eBPF RSS program and maps and passes them through unix
socket.
Libvirt may launch this helper and pass eBPF fds to qemu virtio-net.
Also, libbpf dependency for now is exclusively for Linux.
Libbpf is used for eBPF RSS steering, which is supported only by Linux TAP.
There is no reason yet to build eBPF loader and helper for non-Linux systems,
even if libbpf is present.
Signed-off-by: Andrew Melnychenko <andrew@daynix.com>
---
ebpf/qemu-ebpf-rss-helper.c | 132 ++++++++++++++++++++++++++++++++++++
meson.build | 37 ++++++----
2 files changed, 156 insertions(+), 13 deletions(-)
create mode 100644 ebpf/qemu-ebpf-rss-helper.c
diff --git a/ebpf/qemu-ebpf-rss-helper.c b/ebpf/qemu-ebpf-rss-helper.c
new file mode 100644
index 0000000000..348d26bcdd
--- /dev/null
+++ b/ebpf/qemu-ebpf-rss-helper.c
@@ -0,0 +1,132 @@
+/*
+ * eBPF RSS Helper
+ *
+ * Developed by Daynix Computing LTD (http://www.daynix.com)
+ *
+ * Authors:
+ * Andrew Melnychenko <andrew@daynix.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ *
+ * Description: This is helper program for libvirtd.
+ * It loads eBPF RSS program and passes fds through unix socket.
+ * Built by meson, target - 'qemu-ebpf-rss-helper'.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <getopt.h>
+#include <memory.h>
+#include <errno.h>
+#include <sys/socket.h>
+
+#include "ebpf_rss.h"
+
+#include "qemu-ebpf-rss-helper-stamp.h"
+
+void QEMU_EBPF_RSS_HELPER_STAMP(void) {}
+
+static int send_fds(int socket, int *fds, int n)
+{
+ struct msghdr msg = {};
+ struct cmsghdr *cmsg = NULL;
+ char buf[CMSG_SPACE(n * sizeof(int))];
+ char dummy_buffer = 0;
+ struct iovec io = { .iov_base = &dummy_buffer,
+ .iov_len = sizeof(dummy_buffer) };
+
+ memset(buf, 0, sizeof(buf));
+
+ msg.msg_iov = &io;
+ msg.msg_iovlen = 1;
+ msg.msg_control = buf;
+ msg.msg_controllen = sizeof(buf);
+
+ cmsg = CMSG_FIRSTHDR(&msg);
+ cmsg->cmsg_level = SOL_SOCKET;
+ cmsg->cmsg_type = SCM_RIGHTS;
+ cmsg->cmsg_len = CMSG_LEN(n * sizeof(int));
+
+ memcpy(CMSG_DATA(cmsg), fds, n * sizeof(int));
+
+ return sendmsg(socket, &msg, 0);
+}
+
+static void print_help_and_exit(const char *prog, int exitcode)
+{
+ fprintf(stderr, "%s - load eBPF RSS program for qemu and pass eBPF fds"
+ " through unix socket.\n", prog);
+ fprintf(stderr, "\t--fd <num>, -f <num> - unix socket file descriptor"
+ " used to pass eBPF fds.\n");
+ fprintf(stderr, "\t--help, -h - this help.\n");
+ exit(exitcode);
+}
+
+int main(int argc, char **argv)
+{
+ char *fd_string = NULL;
+ int unix_fd = 0;
+ struct EBPFRSSContext ctx = {};
+ int fds[EBPF_RSS_MAX_FDS] = {};
+ int ret = -1;
+
+ for (;;) {
+ int c;
+ static struct option long_options[] = {
+ {"help", no_argument, 0, 'h'},
+ {"fd", required_argument, 0, 'f'},
+ {0, 0, 0, 0}
+ };
+ c = getopt_long(argc, argv, "hf:",
+ long_options, NULL);
+
+ if (c == -1) {
+ break;
+ }
+
+ switch (c) {
+ case 'f':
+ fd_string = optarg;
+ break;
+ case 'h':
+ default:
+ print_help_and_exit(argv[0],
+ c == 'h' ? EXIT_SUCCESS : EXIT_FAILURE);
+ }
+ }
+
+ if (!fd_string) {
+ fprintf(stderr, "Unix file descriptor not present.\n");
+ print_help_and_exit(argv[0], EXIT_FAILURE);
+ }
+
+ unix_fd = atoi(fd_string);
+
+ if (!unix_fd) {
+ fprintf(stderr, "Unix file descriptor is invalid.\n");
+ return EXIT_FAILURE;
+ }
+
+ ebpf_rss_init(&ctx);
+ if (!ebpf_rss_load(&ctx)) {
+ fprintf(stderr, "Can't load ebpf.\n");
+ return EXIT_FAILURE;
+ }
+ fds[0] = ctx.program_fd;
+ fds[1] = ctx.map_configuration;
+ fds[2] = ctx.map_toeplitz_key;
+ fds[3] = ctx.map_indirections_table;
+
+ ret = send_fds(unix_fd, fds, EBPF_RSS_MAX_FDS);
+ if (ret < 0) {
+ fprintf(stderr, "Issue while sending fds: %s.\n", strerror(errno));
+ }
+
+ ebpf_rss_unload(&ctx);
+
+ return ret < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
+}
+
diff --git a/meson.build b/meson.build
index b409912aed..6e6e2f3e40 100644
--- a/meson.build
+++ b/meson.build
@@ -1632,19 +1632,22 @@ elif get_option('vduse_blk_export').disabled()
endif
# libbpf
-libbpf = dependency('libbpf', required: get_option('bpf'), method:
'pkg-config')
-if libbpf.found() and not cc.links('''
- #include <bpf/libbpf.h>
- int main(void)
- {
- bpf_object__destroy_skeleton(NULL);
- return 0;
- }''', dependencies: libbpf)
- libbpf = not_found
- if get_option('bpf').enabled()
- error('libbpf skeleton test failed')
- else
- warning('libbpf skeleton test failed, disabling')
+libbpf = not_found
+if targetos == 'linux'
+ libbpf = dependency('libbpf', required: get_option('bpf'), method:
'pkg-config')
+ if libbpf.found() and not cc.links('''
+ #include <bpf/libbpf.h>
+ int main(void)
+ {
+ bpf_object__destroy_skeleton(NULL);
+ return 0;
+ }''', dependencies: libbpf)
+ libbpf = not_found
+ if get_option('bpf').enabled()
+ error('libbpf skeleton test failed')
+ else
+ warning('libbpf skeleton test failed, disabling')
+ endif
endif
endif
@@ -3646,6 +3649,14 @@ if have_tools
dependencies: [authz, crypto, io, qom, qemuutil,
libcap_ng, mpathpersist],
install: true)
+
+ if libbpf.found()
+ executable('qemu-ebpf-rss-helper', files(
+ 'ebpf/qemu-ebpf-rss-helper.c', 'ebpf/ebpf_rss.c'),
+ dependencies: [qemuutil, libbpf, glib],
+ install: true,
+ install_dir: get_option('libexecdir'))
+ endif
endif
if have_ivshmem
--
2.39.1
- [PATCH 2/5] virtio-net: Added property to load eBPF RSS with fds., (continued)
- [PATCH 2/5] virtio-net: Added property to load eBPF RSS with fds., Andrew Melnychenko, 2023/02/19
- [PATCH 3/5] qmp: Added the helper stamp check., Andrew Melnychenko, 2023/02/19
- Re: [PATCH 3/5] qmp: Added the helper stamp check., Daniel P . Berrangé, 2023/02/20
- Re: [PATCH 3/5] qmp: Added the helper stamp check., Yuri Benditovich, 2023/02/28
- Re: [PATCH 3/5] qmp: Added the helper stamp check., Daniel P . Berrangé, 2023/02/28
- Re: [PATCH 3/5] qmp: Added the helper stamp check., Toke Høiland-Jørgensen, 2023/02/28
- Re: [PATCH 3/5] qmp: Added the helper stamp check., Daniel P . Berrangé, 2023/02/28
- Re: [PATCH 3/5] qmp: Added the helper stamp check., Daniel P . Berrangé, 2023/02/28
[PATCH 4/5] ebpf_rss_helper: Added helper for eBPF RSS.,
Andrew Melnychenko <=
[PATCH 5/5] qmp: Added find-ebpf-rss-helper command., Andrew Melnychenko, 2023/02/19