Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
virtio-net: Added property to load eBPF RSS with fds.
eBPF RSS program and maps may now be passed during initialization.
Initially was implemented for libvirt to launch qemu without permissions,
and initialized eBPF program through the helper.

Signed-off-by: Andrew Melnychenko <andrew@daynix.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
  • Loading branch information
AndrewAtDaynix authored and jasowang committed Sep 8, 2023
1 parent f2e208b commit e628ffa
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 6 deletions.
55 changes: 49 additions & 6 deletions hw/net/virtio-net.c
Expand Up @@ -42,6 +42,7 @@
#include "sysemu/sysemu.h"
#include "trace.h"
#include "monitor/qdev.h"
#include "monitor/monitor.h"
#include "hw/pci/pci_device.h"
#include "net_rx_pkt.h"
#include "hw/virtio/vhost.h"
Expand Down Expand Up @@ -1327,14 +1328,55 @@ static void virtio_net_detach_epbf_rss(VirtIONet *n)
virtio_net_attach_ebpf_to_backend(n->nic, -1);
}

static bool virtio_net_load_ebpf(VirtIONet *n)
static bool virtio_net_load_ebpf_fds(VirtIONet *n, Error **errp)
{
if (!virtio_net_attach_ebpf_to_backend(n->nic, -1)) {
/* backend does't support steering ebpf */
return false;
int fds[EBPF_RSS_MAX_FDS] = { [0 ... EBPF_RSS_MAX_FDS - 1] = -1};
int nfds = 0;
int ret = true;
int i = 0;
g_auto(GStrv) fds_strs = g_strsplit(n->ebpf_rss_fds, ":", 0);

ERRP_GUARD();

if (g_strv_length(fds_strs) != EBPF_RSS_MAX_FDS) {
error_setg(errp,
"Expected %d file descriptors but got %d",
EBPF_RSS_MAX_FDS, g_strv_length(fds_strs));
return false;
}

for (i = 0; i < nfds; i++) {
fds[i] = monitor_fd_param(monitor_cur(), fds_strs[i], errp);
if (*errp) {
ret = false;
goto exit;
}
}

ret = ebpf_rss_load_fds(&n->ebpf_rss, fds[0], fds[1], fds[2], fds[3]);

exit:
if (!ret || *errp) {
for (i = 0; i < nfds && fds[i] != -1; i++) {
close(fds[i]);
}
}

return ebpf_rss_load(&n->ebpf_rss);
return ret;
}

static bool virtio_net_load_ebpf(VirtIONet *n, Error **errp)
{
bool ret = false;

if (virtio_net_attach_ebpf_to_backend(n->nic, -1)) {
if (!(n->ebpf_rss_fds
&& virtio_net_load_ebpf_fds(n, errp))) {
ret = ebpf_rss_load(&n->ebpf_rss);
}
}

return ret;
}

static void virtio_net_unload_ebpf(VirtIONet *n)
Expand Down Expand Up @@ -3764,7 +3806,7 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp)
net_rx_pkt_init(&n->rx_pkt);

if (virtio_has_feature(n->host_features, VIRTIO_NET_F_RSS)) {
virtio_net_load_ebpf(n);
virtio_net_load_ebpf(n, errp);
}
}

Expand Down Expand Up @@ -3926,6 +3968,7 @@ static Property virtio_net_properties[] = {
VIRTIO_NET_F_RSS, false),
DEFINE_PROP_BIT64("hash", VirtIONet, host_features,
VIRTIO_NET_F_HASH_REPORT, false),
DEFINE_PROP_STRING("ebpf_rss_fds", VirtIONet, ebpf_rss_fds),
DEFINE_PROP_BIT64("guest_rsc_ext", VirtIONet, host_features,
VIRTIO_NET_F_RSC_EXT, false),
DEFINE_PROP_UINT32("rsc_interval", VirtIONet, rsc_timeout,
Expand Down
1 change: 1 addition & 0 deletions include/hw/virtio/virtio-net.h
Expand Up @@ -219,6 +219,7 @@ struct VirtIONet {
VirtioNetRssData rss_data;
struct NetRxPkt *rx_pkt;
struct EBPFRSSContext ebpf_rss;
char *ebpf_rss_fds;
};

size_t virtio_net_handle_ctrl_iov(VirtIODevice *vdev,
Expand Down

0 comments on commit e628ffa

Please sign in to comment.