Re: [PATCH 4/5] qmp: Added new command to retrieve eBPF blob.

2023-05-07 Thread Andrew Melnichenko
Hi all,

On Wed, May 3, 2023 at 2:09 PM Daniel P. Berrangé  wrote:
>
> On Mon, May 01, 2023 at 10:21:00AM +0300, Andrew Melnychenko wrote:
> > Added command "request-ebpf". This command returns
> > eBPF program encoded base64. The program taken from the
> > skeleton and essentially is an ELF object that can be
> > loaded in the future with libbpf.
> >
> > Signed-off-by: Andrew Melnychenko 
> > ---
> >  monitor/qmp-cmds.c | 16 
> >  qapi/misc.json | 28 
> >  2 files changed, 44 insertions(+)
> >
> > diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c
> > index b0f948d3376..f7641bb55b9 100644
> > --- a/monitor/qmp-cmds.c
> > +++ b/monitor/qmp-cmds.c
> > @@ -32,6 +32,7 @@
> >  #include "hw/mem/memory-device.h"
> >  #include "hw/intc/intc.h"
> >  #include "hw/rdma/rdma.h"
> > +#include "ebpf/ebpf.h"
> >
> >  NameInfo *qmp_query_name(Error **errp)
> >  {
> > @@ -209,3 +210,18 @@ static void __attribute__((__constructor__)) 
> > monitor_init_qmp_commands(void)
> >   qmp_marshal_qmp_capabilities,
> >   QCO_ALLOW_PRECONFIG, 0);
> >  }
> > +
> > +EbpfObject *qmp_request_ebpf(const char *id, Error **errp)
> > +{
> > +EbpfObject *ret = NULL;
> > +size_t size = 0;
> > +const void *data = ebpf_find_binary_by_id(id, , errp);
> > +if (!data) {
> > +return NULL;
> > +}
> > +
> > +ret = g_new0(EbpfObject, 1);
> > +ret->object = g_base64_encode(data, size);
> > +
> > +return ret;
> > +}
> > diff --git a/qapi/misc.json b/qapi/misc.json
> > index 6ddd16ea283..81613fd1b13 100644
> > --- a/qapi/misc.json
> > +++ b/qapi/misc.json
> > @@ -618,3 +618,31 @@
> >  { 'event': 'VFU_CLIENT_HANGUP',
> >'data': { 'vfu-id': 'str', 'vfu-qom-path': 'str',
> >  'dev-id': 'str', 'dev-qom-path': 'str' } }
> > +
> > +##
> > +# @EbpfObject:
> > +#
> > +# Structure that holds eBPF ELF object encoded in base64.
> > +#
> > +# Since: 8.1
> > +#
> > +##
> > +{ 'struct': 'EbpfObject',
> > +  'data': {'object': 'str'} }
> > +
> > +##
> > +# @request-ebpf:
> > +#
> > +# Function returns eBPF object that can be loaded with libbpf.
> > +# Management applications (g.e. libvirt) may load it and pass file
> > +# descriptors to QEMU. Which allows running QEMU without BPF capabilities.
> > +#
> > +# Returns: RSS eBPF object encoded in base64.
> > +#
> > +# Since: 8.1
> > +#
> > +##
> > +{ 'command': 'request-ebpf',
> > +  'data': { 'id': 'str' },
>
> Since the number of EBPF program IDs is finite and known at build
> time, I think we'd be better using an enum instead of str. That
> will let apps introspect the QAPI schema to query whether the
> particular EBPF program ID is known to this version fo QEMU.
>

I've researched that issue a bit. I'll add the qapi enum.

> > +  'returns': 'EbpfObject' }
> > +
> > --
> > 2.39.1
> >
>
> With regards,
> Daniel
> --
> |: https://berrange.com  -o-https://www.flickr.com/photos/dberrange :|
> |: https://libvirt.org -o-https://fstop138.berrange.com :|
> |: https://entangle-photo.org-o-https://www.instagram.com/dberrange :|
>



Re: [PATCH 4/5] qmp: Added new command to retrieve eBPF blob.

2023-05-03 Thread Daniel P . Berrangé
On Mon, May 01, 2023 at 10:21:00AM +0300, Andrew Melnychenko wrote:
> Added command "request-ebpf". This command returns
> eBPF program encoded base64. The program taken from the
> skeleton and essentially is an ELF object that can be
> loaded in the future with libbpf.
> 
> Signed-off-by: Andrew Melnychenko 
> ---
>  monitor/qmp-cmds.c | 16 
>  qapi/misc.json | 28 
>  2 files changed, 44 insertions(+)
> 
> diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c
> index b0f948d3376..f7641bb55b9 100644
> --- a/monitor/qmp-cmds.c
> +++ b/monitor/qmp-cmds.c
> @@ -32,6 +32,7 @@
>  #include "hw/mem/memory-device.h"
>  #include "hw/intc/intc.h"
>  #include "hw/rdma/rdma.h"
> +#include "ebpf/ebpf.h"
>  
>  NameInfo *qmp_query_name(Error **errp)
>  {
> @@ -209,3 +210,18 @@ static void __attribute__((__constructor__)) 
> monitor_init_qmp_commands(void)
>   qmp_marshal_qmp_capabilities,
>   QCO_ALLOW_PRECONFIG, 0);
>  }
> +
> +EbpfObject *qmp_request_ebpf(const char *id, Error **errp)
> +{
> +EbpfObject *ret = NULL;
> +size_t size = 0;
> +const void *data = ebpf_find_binary_by_id(id, , errp);
> +if (!data) {
> +return NULL;
> +}
> +
> +ret = g_new0(EbpfObject, 1);
> +ret->object = g_base64_encode(data, size);
> +
> +return ret;
> +}
> diff --git a/qapi/misc.json b/qapi/misc.json
> index 6ddd16ea283..81613fd1b13 100644
> --- a/qapi/misc.json
> +++ b/qapi/misc.json
> @@ -618,3 +618,31 @@
>  { 'event': 'VFU_CLIENT_HANGUP',
>'data': { 'vfu-id': 'str', 'vfu-qom-path': 'str',
>  'dev-id': 'str', 'dev-qom-path': 'str' } }
> +
> +##
> +# @EbpfObject:
> +#
> +# Structure that holds eBPF ELF object encoded in base64.
> +#
> +# Since: 8.1
> +#
> +##
> +{ 'struct': 'EbpfObject',
> +  'data': {'object': 'str'} }
> +
> +##
> +# @request-ebpf:
> +#
> +# Function returns eBPF object that can be loaded with libbpf.
> +# Management applications (g.e. libvirt) may load it and pass file
> +# descriptors to QEMU. Which allows running QEMU without BPF capabilities.
> +#
> +# Returns: RSS eBPF object encoded in base64.
> +#
> +# Since: 8.1
> +#
> +##
> +{ 'command': 'request-ebpf',
> +  'data': { 'id': 'str' },

Since the number of EBPF program IDs is finite and known at build
time, I think we'd be better using an enum instead of str. That
will let apps introspect the QAPI schema to query whether the
particular EBPF program ID is known to this version fo QEMU.

> +  'returns': 'EbpfObject' }
> +
> -- 
> 2.39.1
> 

With regards,
Daniel
-- 
|: https://berrange.com  -o-https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o-https://fstop138.berrange.com :|
|: https://entangle-photo.org-o-https://www.instagram.com/dberrange :|




[PATCH 4/5] qmp: Added new command to retrieve eBPF blob.

2023-05-01 Thread Andrew Melnychenko
Added command "request-ebpf". This command returns
eBPF program encoded base64. The program taken from the
skeleton and essentially is an ELF object that can be
loaded in the future with libbpf.

Signed-off-by: Andrew Melnychenko 
---
 monitor/qmp-cmds.c | 16 
 qapi/misc.json | 28 
 2 files changed, 44 insertions(+)

diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c
index b0f948d3376..f7641bb55b9 100644
--- a/monitor/qmp-cmds.c
+++ b/monitor/qmp-cmds.c
@@ -32,6 +32,7 @@
 #include "hw/mem/memory-device.h"
 #include "hw/intc/intc.h"
 #include "hw/rdma/rdma.h"
+#include "ebpf/ebpf.h"
 
 NameInfo *qmp_query_name(Error **errp)
 {
@@ -209,3 +210,18 @@ static void __attribute__((__constructor__)) 
monitor_init_qmp_commands(void)
  qmp_marshal_qmp_capabilities,
  QCO_ALLOW_PRECONFIG, 0);
 }
+
+EbpfObject *qmp_request_ebpf(const char *id, Error **errp)
+{
+EbpfObject *ret = NULL;
+size_t size = 0;
+const void *data = ebpf_find_binary_by_id(id, , errp);
+if (!data) {
+return NULL;
+}
+
+ret = g_new0(EbpfObject, 1);
+ret->object = g_base64_encode(data, size);
+
+return ret;
+}
diff --git a/qapi/misc.json b/qapi/misc.json
index 6ddd16ea283..81613fd1b13 100644
--- a/qapi/misc.json
+++ b/qapi/misc.json
@@ -618,3 +618,31 @@
 { 'event': 'VFU_CLIENT_HANGUP',
   'data': { 'vfu-id': 'str', 'vfu-qom-path': 'str',
 'dev-id': 'str', 'dev-qom-path': 'str' } }
+
+##
+# @EbpfObject:
+#
+# Structure that holds eBPF ELF object encoded in base64.
+#
+# Since: 8.1
+#
+##
+{ 'struct': 'EbpfObject',
+  'data': {'object': 'str'} }
+
+##
+# @request-ebpf:
+#
+# Function returns eBPF object that can be loaded with libbpf.
+# Management applications (g.e. libvirt) may load it and pass file
+# descriptors to QEMU. Which allows running QEMU without BPF capabilities.
+#
+# Returns: RSS eBPF object encoded in base64.
+#
+# Since: 8.1
+#
+##
+{ 'command': 'request-ebpf',
+  'data': { 'id': 'str' },
+  'returns': 'EbpfObject' }
+
-- 
2.39.1




Re: [RFC PATCH 4/5] qmp: Added new command to retrieve eBPF blob.

2023-03-30 Thread Andrew Melnichenko
Hi all,

On Thu, Mar 30, 2023 at 11:39 AM Daniel P. Berrangé  wrote:
>
> On Thu, Mar 30, 2023 at 03:15:21AM +0300, Andrew Melnychenko wrote:
> > Added command "request-ebpf". This command returns
> > eBPF program encoded base64. The program taken from the
> > skeleton and essentially is an ELF object that can be
> > loaded in the future with libbpf.
> >
> > Signed-off-by: Andrew Melnychenko 
> > ---
> >  monitor/qmp-cmds.c | 17 +
> >  qapi/misc.json | 25 +
> >  2 files changed, 42 insertions(+)
> >
> > diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c
> > index b0f948d337..8f2fc3e7ec 100644
> > --- a/monitor/qmp-cmds.c
> > +++ b/monitor/qmp-cmds.c
> > @@ -32,6 +32,7 @@
> >  #include "hw/mem/memory-device.h"
> >  #include "hw/intc/intc.h"
> >  #include "hw/rdma/rdma.h"
> > +#include "ebpf/ebpf.h"
> >
> >  NameInfo *qmp_query_name(Error **errp)
> >  {
> > @@ -209,3 +210,19 @@ static void __attribute__((__constructor__)) 
> > monitor_init_qmp_commands(void)
> >   qmp_marshal_qmp_capabilities,
> >   QCO_ALLOW_PRECONFIG, 0);
> >  }
> > +
> > +EbpfObject *qmp_request_ebpf(const char *id, Error **errp)
> > +{
> > +EbpfObject *ret = NULL;
> > +size_t size = 0;
> > +const guchar *data = ebpf_find_binary_by_id(id, );
>
> "const void *data"  I believe
>
> > +
> > +if (data) {
> > +ret = g_new0(EbpfObject, 1);
> > +ret->object = g_base64_encode(data, size);
> > +} else {
> > +error_setg(errp, "can't find eBPF object with id: %s", id);
>
> I think I'm inclined to say that we should add an 'Error **errp'
> parameter to ebpf_find_binary_by_id(), and make it responsible
> for this error message, such that we get

Ok, I'll add it.

>
>const void *data  ebpf_find_binary_by_id(id, , errp);
>if (!data) {
>return NULL;
>}
>
>ret = g_new0(EbpfObject, 1);
>ret->object = g_base64_encode(data, size);
>return ret;
>
> > +}
> > +
> > +return ret;
> > +}
> > diff --git a/qapi/misc.json b/qapi/misc.json
> > index 6ddd16ea28..4689802460 100644
> > --- a/qapi/misc.json
> > +++ b/qapi/misc.json
> > @@ -618,3 +618,28 @@
> >  { 'event': 'VFU_CLIENT_HANGUP',
> >'data': { 'vfu-id': 'str', 'vfu-qom-path': 'str',
> >  'dev-id': 'str', 'dev-qom-path': 'str' } }
> > +
> > +##
> > +# @EbpfObject:
> > +#
> > +# Structure that holds eBPF ELF object encoded in base64.
>
> Needs a 'Since' tag

Ah yes, thank you.

>
> > +##
> > +{ 'struct': 'EbpfObject',
> > +  'data': {'object': 'str'} }
> > +
> > +##
> > +# @request-ebpf:
> > +#
> > +# Function returns eBPF object that can be loaded with libbpf.
> > +# Management applications (g.e. libvirt) may load it and pass file
> > +# descriptors to QEMU. Which allows running QEMU without BPF capabilities.
> > +#
> > +# Returns: RSS eBPF object encoded in base64.
> > +#
> > +# Since: 7.3
>
> We're about to release 8.0 and so the next will be 8.1

Thanks, I'll update it.

>
> > +#
> > +##
> > +{ 'command': 'request-ebpf',
> > +  'data': { 'id': 'str' },
> > +  'returns': 'EbpfObject' }
>
> With regards,
> Daniel
> --
> |: https://berrange.com  -o-https://www.flickr.com/photos/dberrange :|
> |: https://libvirt.org -o-https://fstop138.berrange.com :|
> |: https://entangle-photo.org-o-https://www.instagram.com/dberrange :|
>



Re: [RFC PATCH 4/5] qmp: Added new command to retrieve eBPF blob.

2023-03-30 Thread Daniel P . Berrangé
On Thu, Mar 30, 2023 at 03:15:21AM +0300, Andrew Melnychenko wrote:
> Added command "request-ebpf". This command returns
> eBPF program encoded base64. The program taken from the
> skeleton and essentially is an ELF object that can be
> loaded in the future with libbpf.
> 
> Signed-off-by: Andrew Melnychenko 
> ---
>  monitor/qmp-cmds.c | 17 +
>  qapi/misc.json | 25 +
>  2 files changed, 42 insertions(+)
> 
> diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c
> index b0f948d337..8f2fc3e7ec 100644
> --- a/monitor/qmp-cmds.c
> +++ b/monitor/qmp-cmds.c
> @@ -32,6 +32,7 @@
>  #include "hw/mem/memory-device.h"
>  #include "hw/intc/intc.h"
>  #include "hw/rdma/rdma.h"
> +#include "ebpf/ebpf.h"
>  
>  NameInfo *qmp_query_name(Error **errp)
>  {
> @@ -209,3 +210,19 @@ static void __attribute__((__constructor__)) 
> monitor_init_qmp_commands(void)
>   qmp_marshal_qmp_capabilities,
>   QCO_ALLOW_PRECONFIG, 0);
>  }
> +
> +EbpfObject *qmp_request_ebpf(const char *id, Error **errp)
> +{
> +EbpfObject *ret = NULL;
> +size_t size = 0;
> +const guchar *data = ebpf_find_binary_by_id(id, );

"const void *data"  I believe

> +
> +if (data) {
> +ret = g_new0(EbpfObject, 1);
> +ret->object = g_base64_encode(data, size);
> +} else {
> +error_setg(errp, "can't find eBPF object with id: %s", id);

I think I'm inclined to say that we should add an 'Error **errp'
parameter to ebpf_find_binary_by_id(), and make it responsible
for this error message, such that we get

   const void *data  ebpf_find_binary_by_id(id, , errp);
   if (!data) {
   return NULL;
   }

   ret = g_new0(EbpfObject, 1);
   ret->object = g_base64_encode(data, size);
   return ret;

> +}
> +
> +return ret;
> +}
> diff --git a/qapi/misc.json b/qapi/misc.json
> index 6ddd16ea28..4689802460 100644
> --- a/qapi/misc.json
> +++ b/qapi/misc.json
> @@ -618,3 +618,28 @@
>  { 'event': 'VFU_CLIENT_HANGUP',
>'data': { 'vfu-id': 'str', 'vfu-qom-path': 'str',
>  'dev-id': 'str', 'dev-qom-path': 'str' } }
> +
> +##
> +# @EbpfObject:
> +#
> +# Structure that holds eBPF ELF object encoded in base64.

Needs a 'Since' tag

> +##
> +{ 'struct': 'EbpfObject',
> +  'data': {'object': 'str'} }
> +
> +##
> +# @request-ebpf:
> +#
> +# Function returns eBPF object that can be loaded with libbpf.
> +# Management applications (g.e. libvirt) may load it and pass file
> +# descriptors to QEMU. Which allows running QEMU without BPF capabilities.
> +#
> +# Returns: RSS eBPF object encoded in base64.
> +#
> +# Since: 7.3

We're about to release 8.0 and so the next will be 8.1

> +#
> +##
> +{ 'command': 'request-ebpf',
> +  'data': { 'id': 'str' },
> +  'returns': 'EbpfObject' }

With regards,
Daniel
-- 
|: https://berrange.com  -o-https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o-https://fstop138.berrange.com :|
|: https://entangle-photo.org-o-https://www.instagram.com/dberrange :|




[RFC PATCH 4/5] qmp: Added new command to retrieve eBPF blob.

2023-03-29 Thread Andrew Melnychenko
Added command "request-ebpf". This command returns
eBPF program encoded base64. The program taken from the
skeleton and essentially is an ELF object that can be
loaded in the future with libbpf.

Signed-off-by: Andrew Melnychenko 
---
 monitor/qmp-cmds.c | 17 +
 qapi/misc.json | 25 +
 2 files changed, 42 insertions(+)

diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c
index b0f948d337..8f2fc3e7ec 100644
--- a/monitor/qmp-cmds.c
+++ b/monitor/qmp-cmds.c
@@ -32,6 +32,7 @@
 #include "hw/mem/memory-device.h"
 #include "hw/intc/intc.h"
 #include "hw/rdma/rdma.h"
+#include "ebpf/ebpf.h"
 
 NameInfo *qmp_query_name(Error **errp)
 {
@@ -209,3 +210,19 @@ static void __attribute__((__constructor__)) 
monitor_init_qmp_commands(void)
  qmp_marshal_qmp_capabilities,
  QCO_ALLOW_PRECONFIG, 0);
 }
+
+EbpfObject *qmp_request_ebpf(const char *id, Error **errp)
+{
+EbpfObject *ret = NULL;
+size_t size = 0;
+const guchar *data = ebpf_find_binary_by_id(id, );
+
+if (data) {
+ret = g_new0(EbpfObject, 1);
+ret->object = g_base64_encode(data, size);
+} else {
+error_setg(errp, "can't find eBPF object with id: %s", id);
+}
+
+return ret;
+}
diff --git a/qapi/misc.json b/qapi/misc.json
index 6ddd16ea28..4689802460 100644
--- a/qapi/misc.json
+++ b/qapi/misc.json
@@ -618,3 +618,28 @@
 { 'event': 'VFU_CLIENT_HANGUP',
   'data': { 'vfu-id': 'str', 'vfu-qom-path': 'str',
 'dev-id': 'str', 'dev-qom-path': 'str' } }
+
+##
+# @EbpfObject:
+#
+# Structure that holds eBPF ELF object encoded in base64.
+##
+{ 'struct': 'EbpfObject',
+  'data': {'object': 'str'} }
+
+##
+# @request-ebpf:
+#
+# Function returns eBPF object that can be loaded with libbpf.
+# Management applications (g.e. libvirt) may load it and pass file
+# descriptors to QEMU. Which allows running QEMU without BPF capabilities.
+#
+# Returns: RSS eBPF object encoded in base64.
+#
+# Since: 7.3
+#
+##
+{ 'command': 'request-ebpf',
+  'data': { 'id': 'str' },
+  'returns': 'EbpfObject' }
+
-- 
2.39.1