Now, the binary objects may be retrieved by id/name. It would require for future qmp commands that may require specific eBPF blob. Signed-off-by: Andrew Melnychenko <andrew@xxxxxxxxxx> --- ebpf/ebpf.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ ebpf/ebpf.h | 25 +++++++++++++++++++++++++ ebpf/ebpf_rss.c | 4 ++++ ebpf/meson.build | 1 + 4 files changed, 78 insertions(+) create mode 100644 ebpf/ebpf.c create mode 100644 ebpf/ebpf.h diff --git a/ebpf/ebpf.c b/ebpf/ebpf.c new file mode 100644 index 0000000000..86320d72f5 --- /dev/null +++ b/ebpf/ebpf.c @@ -0,0 +1,48 @@ +/* + * QEMU eBPF binary declaration routine. + * + * Developed by Daynix Computing LTD (http://www.daynix.com) + * + * Authors: + * Andrew Melnychenko <andrew@xxxxxxxxxx> + * + * This work is licensed under the terms of the GNU GPL, version 2 or + * later. See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "qemu/queue.h" +#include "ebpf/ebpf.h" + +struct ElfBinaryDataEntry { + const char *id; + const void * (*fn)(size_t *); + + QSLIST_ENTRY(ElfBinaryDataEntry) node; +}; + +static QSLIST_HEAD(, ElfBinaryDataEntry) ebpf_elf_obj_list = + QSLIST_HEAD_INITIALIZER(); + +void ebpf_register_binary_data(const char *id, const void * (*fn)(size_t *)) +{ + struct ElfBinaryDataEntry *data = NULL; + + data = g_malloc0(sizeof(*data)); + data->fn = fn; + data->id = id; + + QSLIST_INSERT_HEAD(&ebpf_elf_obj_list, data, node); +} + +const void *ebpf_find_binary_by_id(const char *id, size_t *sz) +{ + struct ElfBinaryDataEntry *it = NULL; + QSLIST_FOREACH(it, &ebpf_elf_obj_list, node) { + if (strcmp(id, it->id) == 0) { + return it->fn(sz); + } + } + + return NULL; +} diff --git a/ebpf/ebpf.h b/ebpf/ebpf.h new file mode 100644 index 0000000000..fd705cb73e --- /dev/null +++ b/ebpf/ebpf.h @@ -0,0 +1,25 @@ +/* + * QEMU eBPF binary declaration routine. + * + * Developed by Daynix Computing LTD (http://www.daynix.com) + * + * Authors: + * Andrew Melnychenko <andrew@xxxxxxxxxx> + * + * This work is licensed under the terms of the GNU GPL, version 2 or + * later. See the COPYING file in the top-level directory. + */ + +#ifndef EBPF_H +#define EBPF_H + +void ebpf_register_binary_data(const char *id, const void * (*fn)(size_t *)); +const void *ebpf_find_binary_by_id(const char *id, size_t *sz); + +#define ebpf_binary_init(id, fn) \ +static void __attribute__((constructor)) ebpf_binary_init_ ## fn(void) \ +{ \ + ebpf_register_binary_data(id, fn); \ +} + +#endif /* EBPF_H */ diff --git a/ebpf/ebpf_rss.c b/ebpf/ebpf_rss.c index 08015fecb1..b4038725f2 100644 --- a/ebpf/ebpf_rss.c +++ b/ebpf/ebpf_rss.c @@ -21,6 +21,8 @@ #include "ebpf/ebpf_rss.h" #include "ebpf/rss.bpf.skeleton.h" +#include "ebpf/ebpf.h" + #include "trace.h" void ebpf_rss_init(struct EBPFRSSContext *ctx) @@ -237,3 +239,5 @@ void ebpf_rss_unload(struct EBPFRSSContext *ctx) ctx->obj = NULL; ctx->program_fd = -1; } + +ebpf_binary_init("rss", rss_bpf__elf_bytes) diff --git a/ebpf/meson.build b/ebpf/meson.build index 2dd0fd8948..67c3f53aa9 100644 --- a/ebpf/meson.build +++ b/ebpf/meson.build @@ -1 +1,2 @@ +softmmu_ss.add(files('ebpf.c')) softmmu_ss.add(when: libbpf, if_true: files('ebpf_rss.c'), if_false: files('ebpf_rss-stub.c')) -- 2.39.1 _______________________________________________ Virtualization mailing list Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/virtualization