All of lore.kernel.org
 help / color / mirror / Atom feed
From: Markus Armbruster <armbru@redhat.com>
To: Andrew Melnychenko <andrew@daynix.com>
Cc: jasowang@redhat.com,  mst@redhat.com,  eblake@redhat.com,
	qemu-devel@nongnu.org,  berrange@redhat.com,
	yuri.benditovich@daynix.com,  yan@daynix.com
Subject: Re: [PATCH v4 4/6] ebpf: Added declaration/initialization routines.
Date: Fri, 14 Jul 2023 09:23:36 +0200	[thread overview]
Message-ID: <87jzv3gdmv.fsf@pond.sub.org> (raw)
In-Reply-To: <20230714022358.2438995-5-andrew@daynix.com> (Andrew Melnychenko's message of "Fri, 14 Jul 2023 05:23:56 +0300")

Andrew Melnychenko <andrew@daynix.com> writes:

> Now, the binary objects may be retrieved by id.
> It would require for future qmp commands that may require specific
> eBPF blob.
>
> Signed-off-by: Andrew Melnychenko <andrew@daynix.com>
> ---
>  ebpf/ebpf.c      | 70 ++++++++++++++++++++++++++++++++++++++++++++++++
>  ebpf/ebpf.h      | 31 +++++++++++++++++++++
>  ebpf/ebpf_rss.c  |  6 +++++
>  ebpf/meson.build |  2 +-
>  4 files changed, 108 insertions(+), 1 deletion(-)
>  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..ea97c0403e
> --- /dev/null
> +++ b/ebpf/ebpf.c
> @@ -0,0 +1,70 @@
> +/*
> + * QEMU eBPF binary declaration routine.
> + *
> + * 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 or
> + * later.  See the COPYING file in the top-level directory.
> + */
> +
> +#include "qemu/osdep.h"
> +#include "qemu/queue.h"
> +#include "qapi/error.h"
> +#include "qapi/qapi-commands-ebpf.h"

Does not compile:

    ../ebpf/ebpf.c:16:10: fatal error: qapi/qapi-commands-ebpf.h: No such file or directory

The header doesn't exist until you add qapi/ebpf.json in the next
commit.

> +#include "ebpf/ebpf.h"
> +
> +struct ElfBinaryDataEntry {
> +    int id;
> +    const void *data;
> +    size_t datalen;
> +
> +    QSLIST_ENTRY(ElfBinaryDataEntry) node;
> +};
> +
> +static QSLIST_HEAD(, ElfBinaryDataEntry) ebpf_elf_obj_list =
> +                                            QSLIST_HEAD_INITIALIZER();
> +
> +void ebpf_register_binary_data(int id, const void *data, size_t datalen)
> +{
> +    struct ElfBinaryDataEntry *dataentry = NULL;
> +
> +    dataentry = g_new0(struct ElfBinaryDataEntry, 1);
> +    dataentry->data = data;
> +    dataentry->datalen = datalen;
> +    dataentry->id = id;
> +
> +    QSLIST_INSERT_HEAD(&ebpf_elf_obj_list, dataentry, node);
> +}
> +
> +const void *ebpf_find_binary_by_id(int id, size_t *sz, Error **errp)
> +{
> +    struct ElfBinaryDataEntry *it = NULL;
> +    QSLIST_FOREACH(it, &ebpf_elf_obj_list, node) {
> +        if (id == it->id) {
> +            *sz = it->datalen;
> +            return it->data;
> +        }
> +    }
> +
> +    error_setg(errp, "can't find eBPF object with id: %d", id);
> +
> +    return NULL;
> +}
> +
> +EbpfObject *qmp_request_ebpf(EbpfProgramID id, Error **errp)
> +{
> +    EbpfObject *ret = NULL;
> +    size_t size = 0;
> +    const void *data = ebpf_find_binary_by_id(id, &size, errp);
> +    if (!data) {
> +        return NULL;
> +    }
> +
> +    ret = g_new0(EbpfObject, 1);
> +    ret->object = g_base64_encode(data, size);
> +
> +    return ret;
> +}
> diff --git a/ebpf/ebpf.h b/ebpf/ebpf.h
> new file mode 100644
> index 0000000000..b6266b28b8
> --- /dev/null
> +++ b/ebpf/ebpf.h
> @@ -0,0 +1,31 @@
> +/*
> + * QEMU eBPF binary declaration routine.
> + *
> + * 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 or
> + * later.  See the COPYING file in the top-level directory.
> + */
> +
> +#ifndef EBPF_H
> +#define EBPF_H
> +
> +struct Error;
> +
> +void ebpf_register_binary_data(int id, const void *data,
> +                               size_t datalen);
> +const void *ebpf_find_binary_by_id(int id, size_t *sz,
> +                                   struct Error **errp);
> +
> +#define ebpf_binary_init(id, fn)                                           \
> +static void __attribute__((constructor)) ebpf_binary_init_ ## fn(void)     \
> +{                                                                          \
> +    size_t datalen = 0;                                                    \
> +    const void *data = fn(&datalen);                                       \
> +    ebpf_register_binary_data(id, data, datalen);                          \
> +}
> +
> +#endif /* EBPF_H */
> diff --git a/ebpf/ebpf_rss.c b/ebpf/ebpf_rss.c
> index 24bc6cc409..8679dc452d 100644
> --- a/ebpf/ebpf_rss.c
> +++ b/ebpf/ebpf_rss.c
> @@ -13,6 +13,8 @@
>  
>  #include "qemu/osdep.h"
>  #include "qemu/error-report.h"
> +#include "qapi/qapi-types-misc.h"
> +#include "qapi/qapi-commands-ebpf.h"

Likewise.

>  
>  #include <bpf/libbpf.h>
>  #include <bpf/bpf.h>
> @@ -21,6 +23,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)
> @@ -261,3 +265,5 @@ void ebpf_rss_unload(struct EBPFRSSContext *ctx)
>      ctx->map_toeplitz_key = -1;
>      ctx->map_indirections_table = -1;
>  }
> +
> +ebpf_binary_init(EBPF_PROGRAMID_RSS, rss_bpf__elf_bytes)
> diff --git a/ebpf/meson.build b/ebpf/meson.build
> index 2f627d6c7d..c9bbaa7c90 100644
> --- a/ebpf/meson.build
> +++ b/ebpf/meson.build
> @@ -1 +1 @@
> -system_ss.add(when: libbpf, if_true: files('ebpf_rss.c'), if_false: files('ebpf_rss-stub.c'))
> +common_ss.add(when: libbpf, if_true: files('ebpf.c', 'ebpf_rss.c'), if_false: files('ebpf_rss-stub.c'))
> \ No newline at end of file



  reply	other threads:[~2023-07-14  7:24 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-14  2:23 [PATCH v4 0/6] eBPF RSS through QMP support Andrew Melnychenko
2023-07-14  2:23 ` [PATCH v4 1/6] ebpf: Added eBPF map update through mmap Andrew Melnychenko
2023-07-14  2:23 ` [PATCH v4 2/6] ebpf: Added eBPF initialization by fds Andrew Melnychenko
2023-07-14  2:23 ` [PATCH v4 3/6] virtio-net: Added property to load eBPF RSS with fds Andrew Melnychenko
2023-07-14  2:23 ` [PATCH v4 4/6] ebpf: Added declaration/initialization routines Andrew Melnychenko
2023-07-14  7:23   ` Markus Armbruster [this message]
2023-07-14  7:26   ` Markus Armbruster
2023-07-14  2:23 ` [PATCH v4 5/6] qmp: Added new command to retrieve eBPF blob Andrew Melnychenko
2023-07-14  7:41   ` Markus Armbruster
2023-07-14  2:23 ` [PATCH v4 6/6] ebpf: Updated eBPF program and skeleton Andrew Melnychenko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87jzv3gdmv.fsf@pond.sub.org \
    --to=armbru@redhat.com \
    --cc=andrew@daynix.com \
    --cc=berrange@redhat.com \
    --cc=eblake@redhat.com \
    --cc=jasowang@redhat.com \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=yan@daynix.com \
    --cc=yuri.benditovich@daynix.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.