@ -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"
@ -1328,14 +1329,53 @@ 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 doesn't support steering ebpf */
return false ;
int fds [ EBPF_RSS_MAX_FDS ] = { [ 0 . . . EBPF_RSS_MAX_FDS - 1 ] = - 1 } ;
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 ;
}
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 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 )
@ -3768,7 +3808,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 ) ;
}
}
@ -3930,6 +3970,8 @@ 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_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 ,
VIRTIO_NET_F_RSC_EXT , false ) ,
DEFINE_PROP_UINT32 ( " rsc_interval " , VirtIONet , rsc_timeout ,