* [RFC 1/3] configure: add libbpf support
2019-11-26 10:09 [RFC 0/3] Qemu: virtio-net XDP offload Prashant Bhole
@ 2019-11-26 10:09 ` Prashant Bhole
2019-11-26 10:09 ` [RFC 2/3] virtio-net: add support for offloading XDP program Prashant Bhole
` (3 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Prashant Bhole @ 2019-11-26 10:09 UTC (permalink / raw)
To: Michael S . Tsirkin, Jason Wang, qemu-devel
Cc: Song Liu, Jakub Kicinski, Jesper Dangaard Brouer, Daniel Borkmann,
netdev, John Fastabend, Alexei Starovoitov, Martin KaFai Lau,
Prashant Bhole, kvm, Yonghong Song, Andrii Nakryiko,
David S . Miller
This is a preparation to add libbpf support for Qemu. When it is
enabled Qemu can load eBPF programs and manipulated eBPF maps
libbpf APIs.
When configured with --enable-libbpf, availability of libbpf is
checked. If it exists then CONFIG_LIBBPF is defined and the qemu
binary is linked with libbpf.
Signed-off-by: Prashant Bhole <prashantbhole.linux@gmail.com>
---
configure | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/configure b/configure
index 6099be1d84..a7e8a8450d 100755
--- a/configure
+++ b/configure
@@ -504,6 +504,7 @@ debug_mutex="no"
libpmem=""
default_devices="yes"
plugins="no"
+libbpf="no"
supported_cpu="no"
supported_os="no"
@@ -1539,6 +1540,8 @@ for opt do
;;
--disable-plugins) plugins="no"
;;
+ --enable-libbpf) libbpf="yes"
+ ;;
*)
echo "ERROR: unknown option $opt"
echo "Try '$0 --help' for more information"
@@ -1825,6 +1828,7 @@ disabled with --disable-FEATURE, default is enabled if available:
debug-mutex mutex debugging support
libpmem libpmem support
xkbcommon xkbcommon support
+ libbpf eBPF program support
NOTE: The object files are built at the place where configure is launched
EOF
@@ -6084,6 +6088,19 @@ case "$slirp" in
;;
esac
+##########################################
+# Do we have libbpf
+if test "$libbpf" != "no" ; then
+ if $pkg_config libbpf; then
+ libbpf="yes"
+ libbpf_libs=$($pkg_config --libs libbpf)
+ else
+ if test "$libbpf" == "yes" ; then
+ feature_not_found "libbpf" "Install libbpf devel"
+ fi
+ libbpf="no"
+ fi
+fi
##########################################
# End of CC checks
@@ -6599,6 +6616,7 @@ echo "libpmem support $libpmem"
echo "libudev $libudev"
echo "default devices $default_devices"
echo "plugin support $plugins"
+echo "XDP offload support $libbpf"
if test "$supported_cpu" = "no"; then
echo
@@ -7457,6 +7475,11 @@ if test "$plugins" = "yes" ; then
fi
fi
+if test "$libbpf" = "yes" ; then
+ echo "CONFIG_LIBBPF=y" >> $config_host_mak
+ echo "LIBBPF_LIBS=$libbpf_libs" >> $config_host_mak
+fi
+
if test "$tcg_interpreter" = "yes"; then
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/tci $QEMU_INCLUDES"
elif test "$ARCH" = "sparc64" ; then
--
2.20.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [RFC 2/3] virtio-net: add support for offloading XDP program
2019-11-26 10:09 [RFC 0/3] Qemu: virtio-net XDP offload Prashant Bhole
2019-11-26 10:09 ` [RFC 1/3] configure: add libbpf support Prashant Bhole
@ 2019-11-26 10:09 ` Prashant Bhole
2019-11-26 10:09 ` [RFC 3/3] virtio-net: add support for offloading an ebpf map Prashant Bhole
` (2 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Prashant Bhole @ 2019-11-26 10:09 UTC (permalink / raw)
To: Michael S . Tsirkin, Jason Wang, qemu-devel
Cc: Song Liu, Jakub Kicinski, Jesper Dangaard Brouer, Daniel Borkmann,
netdev, John Fastabend, Alexei Starovoitov, Martin KaFai Lau,
Prashant Bhole, kvm, Yonghong Song, Andrii Nakryiko,
David S . Miller
From: Jason Wang <jasowang@redhat.com>
This feature involves offloading of XDP program and ebpf map from
the guest to the host. This patch takes care of offloadin of program.
A handler for VIRTIO_NET_CTRL_EBPF command is added in virtio-net.
The control buffer consist of struct virtio_net_ctrl_ebpf_prog and
followed by an ebpf program instructions. An array of bpf_insn is
prepared and passed to libbpf API bpf_load_program. The program fd is
retuned by the API is then attached to tap fd using TUNSETOFFLOADEDXDP
ioctl command.
Signed-off-by: Jason Wang <jasowang@redhat.com>
Co-developed-by: Prashant Bhole <prashantbhole.linux@gmail.com>
Signed-off-by: Prashant Bhole <prashantbhole.linux@gmail.com>
---
hw/net/virtio-net.c | 69 +++++++++++++++++++++
include/net/tap.h | 2 +
include/standard-headers/linux/virtio_net.h | 27 ++++++++
net/Makefile.objs | 1 +
net/tap-bsd.c | 5 ++
net/tap-linux.c | 48 ++++++++++++++
net/tap-linux.h | 1 +
net/tap-solaris.c | 5 ++
net/tap-stub.c | 5 ++
net/tap.c | 7 +++
net/tap_int.h | 1 +
11 files changed, 171 insertions(+)
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 97a5113f7e..7cc1bd1654 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -43,6 +43,11 @@
#include "monitor/qdev.h"
#include "hw/pci/pci.h"
+#ifdef CONFIG_LIBBPF
+#include <bpf/bpf.h>
+#include <bpf/libbpf.h>
+#endif
+
#define VIRTIO_NET_VM_VERSION 11
#define MAC_TABLE_ENTRIES 64
@@ -628,6 +633,21 @@ static int peer_attach(VirtIONet *n, int index)
return tap_enable(nc->peer);
}
+static int peer_attach_ebpf(VirtIONet *n, int len, void *insns, uint8_t gpl)
+{
+ NetClientState *nc = qemu_get_subqueue(n->nic, 0);
+
+ if (!nc->peer) {
+ return 0;
+ }
+
+ if (nc->peer->info->type != NET_CLIENT_DRIVER_TAP) {
+ return 0;
+ }
+
+ return tap_attach_ebpf(nc->peer, len, insns, gpl);
+}
+
static int peer_detach(VirtIONet *n, int index)
{
NetClientState *nc = qemu_get_subqueue(n->nic, index);
@@ -991,6 +1011,53 @@ static int virtio_net_handle_offloads(VirtIONet *n, uint8_t cmd,
}
}
+static int virtio_net_handle_ebpf_prog(VirtIONet *n, struct iovec *iov,
+ unsigned int iov_cnt)
+{
+#ifdef CONFIG_LIBBPF
+ struct bpf_insn prog[4096];
+ struct virtio_net_ctrl_ebpf_prog ctrl;
+ size_t s;
+ int err = VIRTIO_NET_ERR;
+
+ s = iov_to_buf(iov, iov_cnt, 0, &ctrl, sizeof(ctrl));
+ if (s != sizeof(ctrl)) {
+ error_report("Invalid ebpf prog control buffer");
+ goto err;
+ }
+
+ if (ctrl.cmd == VIRTIO_NET_BPF_CMD_SET_OFFLOAD) {
+ s = iov_to_buf(iov, iov_cnt, sizeof(ctrl), prog, sizeof(prog));
+ if (s != ctrl.len) {
+ error_report("Invalid ebpf prog control buffer");
+ goto err;
+ }
+
+ err = peer_attach_ebpf(n, s, prog, ctrl.gpl_compatible);
+ if (err) {
+ error_report("Failed to attach XDP program");
+ goto err;
+ }
+ } else if (ctrl.cmd == VIRTIO_NET_BPF_CMD_UNSET_OFFLOAD) {
+ err = peer_attach_ebpf(n, 0, NULL, 0);
+ }
+err:
+ return err ? VIRTIO_NET_ERR : VIRTIO_NET_OK;
+#else
+ return VIRTIO_NET_ERR;
+#endif
+}
+
+static int virtio_net_handle_ebpf(VirtIONet *n, uint8_t cmd,
+ struct iovec *iov, unsigned int iov_cnt)
+{
+ if (cmd == VIRTIO_NET_CTRL_EBPF_PROG) {
+ return virtio_net_handle_ebpf_prog(n, iov, iov_cnt);
+ }
+
+ return VIRTIO_NET_ERR;
+}
+
static int virtio_net_handle_mac(VirtIONet *n, uint8_t cmd,
struct iovec *iov, unsigned int iov_cnt)
{
@@ -1208,6 +1275,8 @@ static void virtio_net_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)
status = virtio_net_handle_mq(n, ctrl.cmd, iov, iov_cnt);
} else if (ctrl.class == VIRTIO_NET_CTRL_GUEST_OFFLOADS) {
status = virtio_net_handle_offloads(n, ctrl.cmd, iov, iov_cnt);
+ } else if (ctrl.class == VIRTIO_NET_CTRL_EBPF) {
+ status = virtio_net_handle_ebpf(n, ctrl.cmd, iov, iov_cnt);
}
s = iov_from_buf(elem->in_sg, elem->in_num, 0, &status, sizeof(status));
diff --git a/include/net/tap.h b/include/net/tap.h
index 5d585515f9..19c507a1c2 100644
--- a/include/net/tap.h
+++ b/include/net/tap.h
@@ -33,6 +33,8 @@ int tap_disable(NetClientState *nc);
int tap_get_fd(NetClientState *nc);
+int tap_attach_ebpf(NetClientState *nc, int len, void *insns, uint8_t gpl);
+
struct vhost_net;
struct vhost_net *tap_get_vhost_net(NetClientState *nc);
diff --git a/include/standard-headers/linux/virtio_net.h b/include/standard-headers/linux/virtio_net.h
index 260c3681d7..83292c81bc 100644
--- a/include/standard-headers/linux/virtio_net.h
+++ b/include/standard-headers/linux/virtio_net.h
@@ -261,4 +261,31 @@ struct virtio_net_ctrl_mq {
#define VIRTIO_NET_CTRL_GUEST_OFFLOADS 5
#define VIRTIO_NET_CTRL_GUEST_OFFLOADS_SET 0
+/*
+ * Control XDP offloads offloads
+ *
+ * When guest wants to offload XDP program to tap device, it calls
+ * VIRTIO_NET_CTRL_EBPF_PROG along with VIRTIO_NET_BPF_CMD_SET_OFFLOAD
+ * subcommands. When offloading is successful, the tap device run offloaded
+ * XDP program for each packet before sending it to the guest.
+ *
+ * VIRTIO_NET_BPF_CMD_UNSET_OFFLOAD removes the the offloaded program from
+ * the tap device, if exists.
+ */
+
+struct virtio_net_ctrl_ebpf_prog {
+ /* program length in bytes */
+ __virtio32 len;
+ __virtio16 cmd;
+ __virtio16 gpl_compatible;
+ uint8_t insns[0];
+};
+
+#define VIRTIO_NET_CTRL_EBPF 6
+ #define VIRTIO_NET_CTRL_EBPF_PROG 1
+
+/* Commands for VIRTIO_NET_CTRL_EBPF_PROG */
+#define VIRTIO_NET_BPF_CMD_SET_OFFLOAD 1
+#define VIRTIO_NET_BPF_CMD_UNSET_OFFLOAD 2
+
#endif /* _LINUX_VIRTIO_NET_H */
diff --git a/net/Makefile.objs b/net/Makefile.objs
index c5d076d19c..e7645225be 100644
--- a/net/Makefile.objs
+++ b/net/Makefile.objs
@@ -28,5 +28,6 @@ common-obj-$(CONFIG_POSIX) += tap.o $(tap-obj-y)
common-obj-$(CONFIG_WIN32) += tap-win32.o
vde.o-libs = $(VDE_LIBS)
+tap-linux.o-libs = $(LIBBPF_LIBS)
common-obj-$(CONFIG_CAN_BUS) += can/
diff --git a/net/tap-bsd.c b/net/tap-bsd.c
index a5c3707f80..e4e2a5c799 100644
--- a/net/tap-bsd.c
+++ b/net/tap-bsd.c
@@ -259,3 +259,8 @@ int tap_fd_get_ifname(int fd, char *ifname)
{
return -1;
}
+
+int tap_fd_attach_ebpf(int fd, int len, void *insns, uint8_t gpl)
+{
+ return -EINVAL;
+}
diff --git a/net/tap-linux.c b/net/tap-linux.c
index e0dd442ee3..3ff806bf4f 100644
--- a/net/tap-linux.c
+++ b/net/tap-linux.c
@@ -31,6 +31,8 @@
#include <net/if.h>
#include <sys/ioctl.h>
+#include <bpf/bpf.h>
+#include <bpf/libbpf.h>
#include "qapi/error.h"
#include "qemu/error-report.h"
@@ -314,3 +316,49 @@ int tap_fd_get_ifname(int fd, char *ifname)
pstrcpy(ifname, sizeof(ifr.ifr_name), ifr.ifr_name);
return 0;
}
+
+int tap_fd_attach_ebpf(int fd, int len, void *insns, uint8_t gpl)
+{
+#ifdef CONFIG_LIBBPF
+ struct bpf_insn *prog = (struct bpf_insn *)insns;
+ static char log_buf[65536];
+ char license[16] = {0};
+ int num_insn;
+ int bpf_fd;
+ int ret;
+
+ if (!prog) {
+ bpf_fd = -1;
+ ret = ioctl(fd, TUNSETOFFLOADEDXDP, &bpf_fd);
+ if (ret) {
+ error_report("Failed to remove offloaded XDP: %s", strerror(errno));
+ return -EFAULT;
+ }
+ return ret;
+ }
+
+ num_insn = len / sizeof(prog[0]);
+ if (gpl) {
+ strncpy(license, "GPL", sizeof(license));
+ }
+
+ bpf_fd = bpf_load_program(BPF_PROG_TYPE_XDP, prog, num_insn, license,
+ 0, log_buf, sizeof(log_buf));
+ if (bpf_fd < 0) {
+ error_report("Failed to load XDP program: %s", strerror(errno));
+ error_report("ebpf verifier log: %s", log_buf);
+ return -EFAULT;
+ }
+
+ ret = ioctl(fd, TUNSETOFFLOADEDXDP, &bpf_fd);
+ if (ret) {
+ error_report("Failed to set offloaded XDP: %s", strerror(errno));
+ return -EFAULT;
+ }
+ close(bpf_fd);
+
+ return ret;
+#else
+ return -EINVAL;
+#endif
+}
diff --git a/net/tap-linux.h b/net/tap-linux.h
index 2f36d100fc..791aeaebc4 100644
--- a/net/tap-linux.h
+++ b/net/tap-linux.h
@@ -31,6 +31,7 @@
#define TUNSETQUEUE _IOW('T', 217, int)
#define TUNSETVNETLE _IOW('T', 220, int)
#define TUNSETVNETBE _IOW('T', 222, int)
+#define TUNSETOFFLOADEDXDP _IOW('T', 228, int)
#endif
diff --git a/net/tap-solaris.c b/net/tap-solaris.c
index 4725d2314e..38b9136b5f 100644
--- a/net/tap-solaris.c
+++ b/net/tap-solaris.c
@@ -254,3 +254,8 @@ int tap_fd_get_ifname(int fd, char *ifname)
{
return -1;
}
+
+int tap_fd_attach_ebpf(int fd, int len, void *insns, uint8_t gpl)
+{
+ return -EINVAL;
+}
diff --git a/net/tap-stub.c b/net/tap-stub.c
index a9ab8f8293..5f4161b390 100644
--- a/net/tap-stub.c
+++ b/net/tap-stub.c
@@ -85,3 +85,8 @@ int tap_fd_get_ifname(int fd, char *ifname)
{
return -1;
}
+
+int tap_fd_attach_ebpf(int fd, int len, void *insns, uint8_t gpl)
+{
+ return -EINVAL;
+}
diff --git a/net/tap.c b/net/tap.c
index 6207f61f84..3dba8eacb1 100644
--- a/net/tap.c
+++ b/net/tap.c
@@ -971,6 +971,13 @@ int tap_enable(NetClientState *nc)
}
}
+int tap_attach_ebpf(NetClientState *nc, int len, void *insns, uint8_t gpl)
+{
+ TAPState *s = DO_UPCAST(TAPState, nc, nc);
+
+ return tap_fd_attach_ebpf(s->fd, len, insns, gpl);
+}
+
int tap_disable(NetClientState *nc)
{
TAPState *s = DO_UPCAST(TAPState, nc, nc);
diff --git a/net/tap_int.h b/net/tap_int.h
index e3194b23f4..af641607e2 100644
--- a/net/tap_int.h
+++ b/net/tap_int.h
@@ -44,5 +44,6 @@ int tap_fd_set_vnet_be(int fd, int vnet_is_be);
int tap_fd_enable(int fd);
int tap_fd_disable(int fd);
int tap_fd_get_ifname(int fd, char *ifname);
+int tap_fd_attach_ebpf(int fd, int len, void *insns, uint8_t gpl);
#endif /* NET_TAP_INT_H */
--
2.20.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [RFC 3/3] virtio-net: add support for offloading an ebpf map
2019-11-26 10:09 [RFC 0/3] Qemu: virtio-net XDP offload Prashant Bhole
2019-11-26 10:09 ` [RFC 1/3] configure: add libbpf support Prashant Bhole
2019-11-26 10:09 ` [RFC 2/3] virtio-net: add support for offloading XDP program Prashant Bhole
@ 2019-11-26 10:09 ` Prashant Bhole
2019-11-26 10:33 ` [RFC 0/3] Qemu: virtio-net XDP offload no-reply
2019-11-26 10:36 ` no-reply
4 siblings, 0 replies; 7+ messages in thread
From: Prashant Bhole @ 2019-11-26 10:09 UTC (permalink / raw)
To: Michael S . Tsirkin, Jason Wang, qemu-devel
Cc: Song Liu, Jakub Kicinski, Jesper Dangaard Brouer, Daniel Borkmann,
netdev, John Fastabend, Alexei Starovoitov, Martin KaFai Lau,
Prashant Bhole, kvm, Yonghong Song, Andrii Nakryiko,
David S . Miller
From: Jason Wang <jasowang@redhat.com>
This change is a part of XDP offload feature. It handles offloading
of eBPF map from the guest.
A command handler for VIRTIO_NET_CTRL_EBPF now checks for subcommand
VIRTIO_NET_CTRL_EBPF_MAP and. The control buffer consists of struct
virtio_net_ctrl_ebpf_map followed by map key/value or key/key pair.
Map manipulation is done using libbpf APIs.
Signed-off-by: Jason Wang <jasowang@redhat.com>
Co-developed-by: Prashant Bhole <prashantbhole.linux@gmail.com>
Signed-off-by: Prashant Bhole <prashantbhole.linux@gmail.com>
---
hw/net/Makefile.objs | 2 +
hw/net/virtio-net.c | 88 +++++++++++++++++++++
include/standard-headers/linux/virtio_net.h | 23 ++++++
3 files changed, 113 insertions(+)
diff --git a/hw/net/Makefile.objs b/hw/net/Makefile.objs
index 7907d2c199..5928497a01 100644
--- a/hw/net/Makefile.objs
+++ b/hw/net/Makefile.objs
@@ -52,3 +52,5 @@ common-obj-$(CONFIG_ROCKER) += rocker/rocker.o rocker/rocker_fp.o \
obj-$(call lnot,$(CONFIG_ROCKER)) += rocker/qmp-norocker.o
common-obj-$(CONFIG_CAN_BUS) += can/
+
+virtio-net.o-libs := $(LIBBPF_LIBS)
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 7cc1bd1654..3c49273796 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -1011,6 +1011,92 @@ static int virtio_net_handle_offloads(VirtIONet *n, uint8_t cmd,
}
}
+static int virtio_net_handle_ebpf_map(VirtIONet *n, struct iovec *iov,
+ unsigned int iov_cnt)
+{
+#ifdef CONFIG_LIBBPF
+ struct virtio_net_ctrl_ebpf_map *ctrl = NULL;
+ struct bpf_create_map_attr map_attr = {};
+ uint8_t *key, *val;
+ uint32_t buf_len;
+ int fd, err = 0;
+ size_t s;
+
+ s = iov_to_buf(iov, iov_cnt, 0, &buf_len, sizeof(buf_len));
+ if (s != sizeof(buf_len)) {
+ goto err;
+ }
+
+ ctrl = malloc(sizeof(*ctrl) + buf_len);
+ if (!ctrl) {
+ goto err;
+ }
+
+ s = iov_to_buf(iov, iov_cnt, 0, ctrl, sizeof(*ctrl) + buf_len);
+ if (s != (sizeof(*ctrl) + buf_len)) {
+ error_report("Invalid map control buffer");
+ goto err;
+ }
+
+ key = ctrl->buf;
+ val = ctrl->buf + ctrl->key_size;
+
+ switch (ctrl->cmd) {
+ case VIRTIO_NET_BPF_CMD_CREATE_MAP:
+ map_attr.map_type = ctrl->map_type;
+ map_attr.map_flags = ctrl->map_flags;
+ map_attr.key_size = ctrl->key_size;
+ map_attr.value_size = ctrl->value_size;
+ map_attr.max_entries = ctrl->max_entries;
+ fd = bpf_create_map_xattr(&map_attr);
+ if (fd < 0) {
+ goto err;
+ }
+ ctrl->map_fd = fd;
+ break;
+ case VIRTIO_NET_BPF_CMD_FREE_MAP:
+ close(ctrl->map_fd);
+ break;
+ case VIRTIO_NET_BPF_CMD_LOOKUP_ELEM:
+ err = bpf_map_lookup_elem(ctrl->map_fd, key, val);
+ break;
+ case VIRTIO_NET_BPF_CMD_GET_FIRST:
+ err = bpf_map_get_next_key(ctrl->map_fd, NULL, val);
+ break;
+ case VIRTIO_NET_BPF_CMD_GET_NEXT:
+ err = bpf_map_get_next_key(ctrl->map_fd, key, val);
+ break;
+ case VIRTIO_NET_BPF_CMD_UPDATE_ELEM:
+ err = bpf_map_update_elem(ctrl->map_fd, key, val, ctrl->flags);
+ break;
+ case VIRTIO_NET_BPF_CMD_DELETE_ELEM:
+ err = bpf_map_delete_elem(ctrl->map_fd, key);
+ default:
+ error_report("map operation not implemented %d", ctrl->cmd);
+ goto err;
+ }
+
+ if (err) {
+ goto err;
+ }
+
+ s = iov_from_buf(iov, iov_cnt, 0, ctrl, sizeof(*ctrl) + buf_len);
+ if (s != sizeof(*ctrl) + buf_len) {
+ error_report("failed to write map operation result");
+ goto err;
+ }
+
+ free(ctrl);
+ return VIRTIO_NET_OK;
+
+err:
+ if (ctrl) {
+ free(ctrl);
+ }
+#endif
+ return VIRTIO_NET_ERR;
+}
+
static int virtio_net_handle_ebpf_prog(VirtIONet *n, struct iovec *iov,
unsigned int iov_cnt)
{
@@ -1053,6 +1139,8 @@ static int virtio_net_handle_ebpf(VirtIONet *n, uint8_t cmd,
{
if (cmd == VIRTIO_NET_CTRL_EBPF_PROG) {
return virtio_net_handle_ebpf_prog(n, iov, iov_cnt);
+ } else if (cmd == VIRTIO_NET_CTRL_EBPF_MAP) {
+ return virtio_net_handle_ebpf_map(n, iov, iov_cnt);
}
return VIRTIO_NET_ERR;
diff --git a/include/standard-headers/linux/virtio_net.h b/include/standard-headers/linux/virtio_net.h
index 83292c81bc..cca234e0e8 100644
--- a/include/standard-headers/linux/virtio_net.h
+++ b/include/standard-headers/linux/virtio_net.h
@@ -281,11 +281,34 @@ struct virtio_net_ctrl_ebpf_prog {
uint8_t insns[0];
};
+struct virtio_net_ctrl_ebpf_map {
+ __virtio32 buf_len;
+ __virtio32 cmd;
+ __virtio32 map_type;
+ __virtio32 key_size;
+ __virtio32 value_size;
+ __virtio32 max_entries;
+ __virtio32 map_flags;
+ __virtio32 map_fd;
+ __virtio64 flags;
+ uint8_t buf[0];
+};
+
#define VIRTIO_NET_CTRL_EBPF 6
#define VIRTIO_NET_CTRL_EBPF_PROG 1
+ #define VIRTIO_NET_CTRL_EBPF_MAP 2
/* Commands for VIRTIO_NET_CTRL_EBPF_PROG */
#define VIRTIO_NET_BPF_CMD_SET_OFFLOAD 1
#define VIRTIO_NET_BPF_CMD_UNSET_OFFLOAD 2
+/* Commands for VIRTIO_NET_CTRL_EBPF_MAP */
+#define VIRTIO_NET_BPF_CMD_CREATE_MAP 1
+#define VIRTIO_NET_BPF_CMD_FREE_MAP 2
+#define VIRTIO_NET_BPF_CMD_UPDATE_ELEM 3
+#define VIRTIO_NET_BPF_CMD_LOOKUP_ELEM 4
+#define VIRTIO_NET_BPF_CMD_DELETE_ELEM 5
+#define VIRTIO_NET_BPF_CMD_GET_FIRST 6
+#define VIRTIO_NET_BPF_CMD_GET_NEXT 7
+
#endif /* _LINUX_VIRTIO_NET_H */
--
2.20.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [RFC 0/3] Qemu: virtio-net XDP offload
2019-11-26 10:09 [RFC 0/3] Qemu: virtio-net XDP offload Prashant Bhole
` (2 preceding siblings ...)
2019-11-26 10:09 ` [RFC 3/3] virtio-net: add support for offloading an ebpf map Prashant Bhole
@ 2019-11-26 10:33 ` no-reply
2019-11-27 1:27 ` Prashant Bhole
2019-11-26 10:36 ` no-reply
4 siblings, 1 reply; 7+ messages in thread
From: no-reply @ 2019-11-26 10:33 UTC (permalink / raw)
To: prashantbhole.linux
Cc: songliubraving, jakub.kicinski, hawk, daniel, mst, netdev,
jasowang, john.fastabend, qemu-devel, ast, davem,
prashantbhole.linux, kvm, yhs, andriin, kafai
Patchew URL: https://patchew.org/QEMU/20191126100914.5150-1-prashantbhole.linux@gmail.com/
Hi,
This series failed the docker-quick@centos7 build test. Please find the testing commands and
their output below. If you have Docker installed, you can probably reproduce it
locally.
=== TEST SCRIPT BEGIN ===
#!/bin/bash
make docker-image-centos7 V=1 NETWORK=1
time make docker-test-quick@centos7 SHOW_ENV=1 J=14 NETWORK=1
=== TEST SCRIPT END ===
CC ui/input-keymap.o
CC ui/input-legacy.o
CC ui/kbd-state.o
/tmp/qemu-test/src/net/tap-linux.c:34:21: fatal error: bpf/bpf.h: No such file or directory
#include <bpf/bpf.h>
^
compilation terminated.
---
SIGN pc-bios/optionrom/linuxboot.bin
SIGN pc-bios/optionrom/kvmvapic.bin
BUILD pc-bios/optionrom/linuxboot_dma.img
make: *** [net/tap-linux.o] Error 1
make: *** Waiting for unfinished jobs....
BUILD pc-bios/optionrom/pvh.img
BUILD pc-bios/optionrom/linuxboot_dma.raw
---
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['sudo', '-n', 'docker', 'run', '--label', 'com.qemu.instance.uuid=be849bfed02d4ea7b19f7746fe037bd5', '-u', '1001', '--security-opt', 'seccomp=unconfined', '--rm', '-e', 'TARGET_LIST=', '-e', 'EXTRA_CONFIGURE_OPTS=', '-e', 'V=', '-e', 'J=14', '-e', 'DEBUG=', '-e', 'SHOW_ENV=1', '-e', 'CCACHE_DIR=/var/tmp/ccache', '-v', '/home/patchew/.cache/qemu-docker-ccache:/var/tmp/ccache:z', '-v', '/var/tmp/patchew-tester-tmp-3d2z3wl3/src/docker-src.2019-11-26-05.31.05.21708:/var/tmp/qemu:z,ro', 'qemu:centos7', '/var/tmp/qemu/run', 'test-quick']' returned non-zero exit status 2.
filter=--filter=label=com.qemu.instance.uuid=be849bfed02d4ea7b19f7746fe037bd5
make[1]: *** [docker-run] Error 1
make[1]: Leaving directory `/var/tmp/patchew-tester-tmp-3d2z3wl3/src'
make: *** [docker-run-test-quick@centos7] Error 2
real 1m56.447s
user 0m8.519s
The full log is available at
http://patchew.org/logs/20191126100914.5150-1-prashantbhole.linux@gmail.com/testing.docker-quick@centos7/?type=message.
---
Email generated automatically by Patchew [https://patchew.org/].
Please send your feedback to patchew-devel@redhat.com
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [RFC 0/3] Qemu: virtio-net XDP offload
2019-11-26 10:33 ` [RFC 0/3] Qemu: virtio-net XDP offload no-reply
@ 2019-11-27 1:27 ` Prashant Bhole
0 siblings, 0 replies; 7+ messages in thread
From: Prashant Bhole @ 2019-11-27 1:27 UTC (permalink / raw)
To: qemu-devel
Cc: songliubraving, jakub.kicinski, hawk, daniel, mst, netdev,
jasowang, john.fastabend, ast, davem, kvm, yhs, andriin, kafai
On 11/26/19 7:33 PM, no-reply@patchew.org wrote:
> Patchew URL: https://patchew.org/QEMU/20191126100914.5150-1-prashantbhole.linux@gmail.com/
>
>
>
> Hi,
>
> This series failed the docker-quick@centos7 build test. Please find the testing commands and
> their output below. If you have Docker installed, you can probably reproduce it
> locally.
>
> === TEST SCRIPT BEGIN ===
> #!/bin/bash
> make docker-image-centos7 V=1 NETWORK=1
> time make docker-test-quick@centos7 SHOW_ENV=1 J=14 NETWORK=1
> === TEST SCRIPT END ===
>
> CC ui/input-keymap.o
> CC ui/input-legacy.o
> CC ui/kbd-state.o
> /tmp/qemu-test/src/net/tap-linux.c:34:21: fatal error: bpf/bpf.h: No such file or directory
> #include <bpf/bpf.h>
Sorry, I missed to enclose it in #ifdef CONFIG_LIBBPF.
It should be fixed whenever I'll post next revision.
Prashant
> ^
> compilation terminated.
> ---
> SIGN pc-bios/optionrom/linuxboot.bin
> SIGN pc-bios/optionrom/kvmvapic.bin
> BUILD pc-bios/optionrom/linuxboot_dma.img
> make: *** [net/tap-linux.o] Error 1
> make: *** Waiting for unfinished jobs....
> BUILD pc-bios/optionrom/pvh.img
> BUILD pc-bios/optionrom/linuxboot_dma.raw
> ---
> raise CalledProcessError(retcode, cmd)
> subprocess.CalledProcessError: Command '['sudo', '-n', 'docker', 'run', '--label', 'com.qemu.instance.uuid=be849bfed02d4ea7b19f7746fe037bd5', '-u', '1001', '--security-opt', 'seccomp=unconfined', '--rm', '-e', 'TARGET_LIST=', '-e', 'EXTRA_CONFIGURE_OPTS=', '-e', 'V=', '-e', 'J=14', '-e', 'DEBUG=', '-e', 'SHOW_ENV=1', '-e', 'CCACHE_DIR=/var/tmp/ccache', '-v', '/home/patchew/.cache/qemu-docker-ccache:/var/tmp/ccache:z', '-v', '/var/tmp/patchew-tester-tmp-3d2z3wl3/src/docker-src.2019-11-26-05.31.05.21708:/var/tmp/qemu:z,ro', 'qemu:centos7', '/var/tmp/qemu/run', 'test-quick']' returned non-zero exit status 2.
> filter=--filter=label=com.qemu.instance.uuid=be849bfed02d4ea7b19f7746fe037bd5
> make[1]: *** [docker-run] Error 1
> make[1]: Leaving directory `/var/tmp/patchew-tester-tmp-3d2z3wl3/src'
> make: *** [docker-run-test-quick@centos7] Error 2
>
> real 1m56.447s
> user 0m8.519s
>
>
> The full log is available at
> http://patchew.org/logs/20191126100914.5150-1-prashantbhole.linux@gmail.com/testing.docker-quick@centos7/?type=message.
> ---
> Email generated automatically by Patchew [https://patchew.org/].
> Please send your feedback to patchew-devel@redhat.com
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [RFC 0/3] Qemu: virtio-net XDP offload
2019-11-26 10:09 [RFC 0/3] Qemu: virtio-net XDP offload Prashant Bhole
` (3 preceding siblings ...)
2019-11-26 10:33 ` [RFC 0/3] Qemu: virtio-net XDP offload no-reply
@ 2019-11-26 10:36 ` no-reply
4 siblings, 0 replies; 7+ messages in thread
From: no-reply @ 2019-11-26 10:36 UTC (permalink / raw)
To: prashantbhole.linux
Cc: songliubraving, jakub.kicinski, hawk, daniel, mst, netdev,
jasowang, john.fastabend, qemu-devel, ast, davem,
prashantbhole.linux, kvm, yhs, andriin, kafai
Patchew URL: https://patchew.org/QEMU/20191126100914.5150-1-prashantbhole.linux@gmail.com/
Hi,
This series failed the docker-mingw@fedora build test. Please find the testing commands and
their output below. If you have Docker installed, you can probably reproduce it
locally.
=== TEST SCRIPT BEGIN ===
#! /bin/bash
export ARCH=x86_64
make docker-image-fedora V=1 NETWORK=1
time make docker-test-mingw@fedora J=14 NETWORK=1
=== TEST SCRIPT END ===
CC aarch64-softmmu/hw/arm/musicpal.o
CC aarch64-softmmu/hw/arm/netduino2.o
CC aarch64-softmmu/hw/arm/nseries.o
/tmp/qemu-test/src/hw/net/virtio-net.c:636:12: error: 'peer_attach_ebpf' defined but not used [-Werror=unused-function]
static int peer_attach_ebpf(VirtIONet *n, int len, void *insns, uint8_t gpl)
^~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
make[1]: *** [/tmp/qemu-test/src/rules.mak:69: hw/net/virtio-net.o] Error 1
make[1]: *** Waiting for unfinished jobs....
CC aarch64-softmmu/hw/arm/omap_sx1.o
CC aarch64-softmmu/hw/arm/palm.o
make: *** [Makefile:491: x86_64-softmmu/all] Error 2
make: *** Waiting for unfinished jobs....
CC aarch64-softmmu/hw/arm/gumstix.o
CC aarch64-softmmu/hw/arm/spitz.o
---
CC aarch64-softmmu/gdbstub-xml.o
CC aarch64-softmmu/trace/generated-helpers.o
CC aarch64-softmmu/target/arm/translate-sve.o
/tmp/qemu-test/src/hw/net/virtio-net.c:636:12: error: 'peer_attach_ebpf' defined but not used [-Werror=unused-function]
static int peer_attach_ebpf(VirtIONet *n, int len, void *insns, uint8_t gpl)
^~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
make[1]: *** [/tmp/qemu-test/src/rules.mak:69: hw/net/virtio-net.o] Error 1
make: *** [Makefile:491: aarch64-softmmu/all] Error 2
Traceback (most recent call last):
File "./tests/docker/docker.py", line 662, in <module>
sys.exit(main())
---
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['sudo', '-n', 'docker', 'run', '--label', 'com.qemu.instance.uuid=5b6acc2ac7494ad6b59706c9dd26c3cd', '-u', '1001', '--security-opt', 'seccomp=unconfined', '--rm', '-e', 'TARGET_LIST=', '-e', 'EXTRA_CONFIGURE_OPTS=', '-e', 'V=', '-e', 'J=14', '-e', 'DEBUG=', '-e', 'SHOW_ENV=', '-e', 'CCACHE_DIR=/var/tmp/ccache', '-v', '/home/patchew/.cache/qemu-docker-ccache:/var/tmp/ccache:z', '-v', '/var/tmp/patchew-tester-tmp-4e2hnnd5/src/docker-src.2019-11-26-05.33.37.332:/var/tmp/qemu:z,ro', 'qemu:fedora', '/var/tmp/qemu/run', 'test-mingw']' returned non-zero exit status 2.
filter=--filter=label=com.qemu.instance.uuid=5b6acc2ac7494ad6b59706c9dd26c3cd
make[1]: *** [docker-run] Error 1
make[1]: Leaving directory `/var/tmp/patchew-tester-tmp-4e2hnnd5/src'
make: *** [docker-run-test-mingw@fedora] Error 2
real 2m24.967s
user 0m8.999s
The full log is available at
http://patchew.org/logs/20191126100914.5150-1-prashantbhole.linux@gmail.com/testing.docker-mingw@fedora/?type=message.
---
Email generated automatically by Patchew [https://patchew.org/].
Please send your feedback to patchew-devel@redhat.com
^ permalink raw reply [flat|nested] 7+ messages in thread