mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-29 13:23:54 -06:00
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>
This commit is contained in:
parent
0524ea0510
commit
6b230b7dfc
2 changed files with 50 additions and 6 deletions
|
@ -42,6 +42,7 @@
|
||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
#include "monitor/qdev.h"
|
#include "monitor/qdev.h"
|
||||||
|
#include "monitor/monitor.h"
|
||||||
#include "hw/pci/pci_device.h"
|
#include "hw/pci/pci_device.h"
|
||||||
#include "net_rx_pkt.h"
|
#include "net_rx_pkt.h"
|
||||||
#include "hw/virtio/vhost.h"
|
#include "hw/virtio/vhost.h"
|
||||||
|
@ -1328,14 +1329,53 @@ static void virtio_net_detach_epbf_rss(VirtIONet *n)
|
||||||
virtio_net_attach_ebpf_to_backend(n->nic, -1);
|
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)) {
|
int fds[EBPF_RSS_MAX_FDS] = { [0 ... EBPF_RSS_MAX_FDS - 1] = -1};
|
||||||
/* backend doesn't support steering ebpf */
|
int ret = true;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
ERRP_GUARD();
|
||||||
|
|
||||||
|
if (n->nr_ebpf_rss_fds != EBPF_RSS_MAX_FDS) {
|
||||||
|
error_setg(errp,
|
||||||
|
"Expected %d file descriptors but got %d",
|
||||||
|
EBPF_RSS_MAX_FDS, n->nr_ebpf_rss_fds);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ebpf_rss_load(&n->ebpf_rss);
|
for (i = 0; i < n->nr_ebpf_rss_fds; i++) {
|
||||||
|
fds[i] = monitor_fd_param(monitor_cur(), n->ebpf_rss_fds[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 < n->nr_ebpf_rss_fds && fds[i] != -1; i++) {
|
||||||
|
close(fds[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
static void virtio_net_unload_ebpf(VirtIONet *n)
|
||||||
|
@ -3768,7 +3808,7 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp)
|
||||||
net_rx_pkt_init(&n->rx_pkt);
|
net_rx_pkt_init(&n->rx_pkt);
|
||||||
|
|
||||||
if (virtio_has_feature(n->host_features, VIRTIO_NET_F_RSS)) {
|
if (virtio_has_feature(n->host_features, VIRTIO_NET_F_RSS)) {
|
||||||
virtio_net_load_ebpf(n);
|
virtio_net_load_ebpf(n, errp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3930,6 +3970,8 @@ static Property virtio_net_properties[] = {
|
||||||
VIRTIO_NET_F_RSS, false),
|
VIRTIO_NET_F_RSS, false),
|
||||||
DEFINE_PROP_BIT64("hash", VirtIONet, host_features,
|
DEFINE_PROP_BIT64("hash", VirtIONet, host_features,
|
||||||
VIRTIO_NET_F_HASH_REPORT, false),
|
VIRTIO_NET_F_HASH_REPORT, false),
|
||||||
|
DEFINE_PROP_ARRAY("ebpf-rss-fds", VirtIONet, nr_ebpf_rss_fds,
|
||||||
|
ebpf_rss_fds, qdev_prop_string, char*),
|
||||||
DEFINE_PROP_BIT64("guest_rsc_ext", VirtIONet, host_features,
|
DEFINE_PROP_BIT64("guest_rsc_ext", VirtIONet, host_features,
|
||||||
VIRTIO_NET_F_RSC_EXT, false),
|
VIRTIO_NET_F_RSC_EXT, false),
|
||||||
DEFINE_PROP_UINT32("rsc_interval", VirtIONet, rsc_timeout,
|
DEFINE_PROP_UINT32("rsc_interval", VirtIONet, rsc_timeout,
|
||||||
|
|
|
@ -225,6 +225,8 @@ struct VirtIONet {
|
||||||
VirtioNetRssData rss_data;
|
VirtioNetRssData rss_data;
|
||||||
struct NetRxPkt *rx_pkt;
|
struct NetRxPkt *rx_pkt;
|
||||||
struct EBPFRSSContext ebpf_rss;
|
struct EBPFRSSContext ebpf_rss;
|
||||||
|
uint32_t nr_ebpf_rss_fds;
|
||||||
|
char **ebpf_rss_fds;
|
||||||
};
|
};
|
||||||
|
|
||||||
size_t virtio_net_handle_ctrl_iov(VirtIODevice *vdev,
|
size_t virtio_net_handle_ctrl_iov(VirtIODevice *vdev,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue