mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 00:33:55 -06:00
-----BEGIN PGP SIGNATURE-----
iQEzBAABCAAdFiEEIV1G9IJGaJ7HfzVi7wSWWzmNYhEFAmXwPUAACgkQ7wSWWzmN YhFnIwgAgctDniJwlRxXB01eVlzXz7IulHnpSby07XEJxENSpGB8ufaeE4eK5gJy NVK6C2+1EU2vRxm4oIdcvtN4C4/jtRbYYjiSTx7eE4FmSkqshSnR5XCV72LDqG3i WbzInjMvYfysmcMXLfrWgxOnVew9WqEzlpEWlc7FfNKnkzBVf+JDztfqCUx0XM7H qefw4ImjqQw993QxJpipXC7aEGUyouB0RIBB71FkCa9ihlh9x7W68evbOI/jTn5q HWuStgS02sKHjRFliMbdbMY77FNUz4Yroo/GKSvGt64atxkQSJqPNAV+/9n18LNy QAH5eK6cXFPOIAaYpADU5kHDVVAFiw== =iBdx -----END PGP SIGNATURE----- Merge tag 'net-pull-request' of https://github.com/jasowang/qemu into staging # -----BEGIN PGP SIGNATURE----- # # iQEzBAABCAAdFiEEIV1G9IJGaJ7HfzVi7wSWWzmNYhEFAmXwPUAACgkQ7wSWWzmN # YhFnIwgAgctDniJwlRxXB01eVlzXz7IulHnpSby07XEJxENSpGB8ufaeE4eK5gJy # NVK6C2+1EU2vRxm4oIdcvtN4C4/jtRbYYjiSTx7eE4FmSkqshSnR5XCV72LDqG3i # WbzInjMvYfysmcMXLfrWgxOnVew9WqEzlpEWlc7FfNKnkzBVf+JDztfqCUx0XM7H # qefw4ImjqQw993QxJpipXC7aEGUyouB0RIBB71FkCa9ihlh9x7W68evbOI/jTn5q # HWuStgS02sKHjRFliMbdbMY77FNUz4Yroo/GKSvGt64atxkQSJqPNAV+/9n18LNy # QAH5eK6cXFPOIAaYpADU5kHDVVAFiw== # =iBdx # -----END PGP SIGNATURE----- # gpg: Signature made Tue 12 Mar 2024 11:32:16 GMT # gpg: using RSA key 215D46F48246689EC77F3562EF04965B398D6211 # gpg: Good signature from "Jason Wang (Jason Wang on RedHat) <jasowang@redhat.com>" [marginal] # gpg: WARNING: This key is not certified with sufficiently trusted signatures! # gpg: It is not certain that the signature belongs to the owner. # Primary key fingerprint: 215D 46F4 8246 689E C77F 3562 EF04 965B 398D 6211 * tag 'net-pull-request' of https://github.com/jasowang/qemu: ebpf: Updated eBPF program and skeleton. qmp: Added new command to retrieve eBPF blob. virtio-net: Added property to load eBPF RSS with fds. ebpf: Added eBPF initialization by fds. ebpf: Added eBPF map update through mmap. Avoid unaligned fetch in ladr_match() e1000e: fix link state on resume igb: fix link state on resume Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
35ac6831d9
20 changed files with 1058 additions and 809 deletions
|
@ -123,14 +123,6 @@ e1000e_intmgr_timer_resume(E1000IntrDelayTimer *timer)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
e1000e_intmgr_timer_pause(E1000IntrDelayTimer *timer)
|
||||
{
|
||||
if (timer->running) {
|
||||
timer_del(timer->timer);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void
|
||||
e1000e_intrmgr_stop_timer(E1000IntrDelayTimer *timer)
|
||||
{
|
||||
|
@ -398,24 +390,6 @@ e1000e_intrmgr_resume(E1000ECore *core)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
e1000e_intrmgr_pause(E1000ECore *core)
|
||||
{
|
||||
int i;
|
||||
|
||||
e1000e_intmgr_timer_pause(&core->radv);
|
||||
e1000e_intmgr_timer_pause(&core->rdtr);
|
||||
e1000e_intmgr_timer_pause(&core->raid);
|
||||
e1000e_intmgr_timer_pause(&core->tidv);
|
||||
e1000e_intmgr_timer_pause(&core->tadv);
|
||||
|
||||
e1000e_intmgr_timer_pause(&core->itr);
|
||||
|
||||
for (i = 0; i < E1000E_MSIX_VEC_NUM; i++) {
|
||||
e1000e_intmgr_timer_pause(&core->eitr[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
e1000e_intrmgr_reset(E1000ECore *core)
|
||||
{
|
||||
|
@ -3334,12 +3308,6 @@ e1000e_core_read(E1000ECore *core, hwaddr addr, unsigned size)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline void
|
||||
e1000e_autoneg_pause(E1000ECore *core)
|
||||
{
|
||||
timer_del(core->autoneg_timer);
|
||||
}
|
||||
|
||||
static void
|
||||
e1000e_autoneg_resume(E1000ECore *core)
|
||||
{
|
||||
|
@ -3351,22 +3319,6 @@ e1000e_autoneg_resume(E1000ECore *core)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
e1000e_vm_state_change(void *opaque, bool running, RunState state)
|
||||
{
|
||||
E1000ECore *core = opaque;
|
||||
|
||||
if (running) {
|
||||
trace_e1000e_vm_state_running();
|
||||
e1000e_intrmgr_resume(core);
|
||||
e1000e_autoneg_resume(core);
|
||||
} else {
|
||||
trace_e1000e_vm_state_stopped();
|
||||
e1000e_autoneg_pause(core);
|
||||
e1000e_intrmgr_pause(core);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
e1000e_core_pci_realize(E1000ECore *core,
|
||||
const uint16_t *eeprom_templ,
|
||||
|
@ -3379,9 +3331,6 @@ e1000e_core_pci_realize(E1000ECore *core,
|
|||
e1000e_autoneg_timer, core);
|
||||
e1000e_intrmgr_pci_realize(core);
|
||||
|
||||
core->vmstate =
|
||||
qemu_add_vm_change_state_handler(e1000e_vm_state_change, core);
|
||||
|
||||
for (i = 0; i < E1000E_NUM_QUEUES; i++) {
|
||||
net_tx_pkt_init(&core->tx[i].tx_pkt, E1000E_MAX_TX_FRAGS);
|
||||
}
|
||||
|
@ -3405,8 +3354,6 @@ e1000e_core_pci_uninit(E1000ECore *core)
|
|||
|
||||
e1000e_intrmgr_pci_unint(core);
|
||||
|
||||
qemu_del_vm_change_state_handler(core->vmstate);
|
||||
|
||||
for (i = 0; i < E1000E_NUM_QUEUES; i++) {
|
||||
net_tx_pkt_uninit(core->tx[i].tx_pkt);
|
||||
}
|
||||
|
@ -3576,5 +3523,12 @@ e1000e_core_post_load(E1000ECore *core)
|
|||
*/
|
||||
nc->link_down = (core->mac[STATUS] & E1000_STATUS_LU) == 0;
|
||||
|
||||
/*
|
||||
* we need to restart intrmgr timers, as an older version of
|
||||
* QEMU can have stopped them before migration
|
||||
*/
|
||||
e1000e_intrmgr_resume(core);
|
||||
e1000e_autoneg_resume(core);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -98,8 +98,6 @@ struct E1000Core {
|
|||
|
||||
E1000IntrDelayTimer eitr[E1000E_MSIX_VEC_NUM];
|
||||
|
||||
VMChangeStateEntry *vmstate;
|
||||
|
||||
uint32_t itr_guest_value;
|
||||
uint32_t eitr_guest_value[E1000E_MSIX_VEC_NUM];
|
||||
|
||||
|
|
|
@ -160,14 +160,6 @@ igb_intmgr_timer_resume(IGBIntrDelayTimer *timer)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
igb_intmgr_timer_pause(IGBIntrDelayTimer *timer)
|
||||
{
|
||||
if (timer->running) {
|
||||
timer_del(timer->timer);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
igb_intrmgr_on_msix_throttling_timer(void *opaque)
|
||||
{
|
||||
|
@ -212,16 +204,6 @@ igb_intrmgr_resume(IGBCore *core)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
igb_intrmgr_pause(IGBCore *core)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < IGB_INTR_NUM; i++) {
|
||||
igb_intmgr_timer_pause(&core->eitr[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
igb_intrmgr_reset(IGBCore *core)
|
||||
{
|
||||
|
@ -4290,12 +4272,6 @@ igb_core_read(IGBCore *core, hwaddr addr, unsigned size)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline void
|
||||
igb_autoneg_pause(IGBCore *core)
|
||||
{
|
||||
timer_del(core->autoneg_timer);
|
||||
}
|
||||
|
||||
static void
|
||||
igb_autoneg_resume(IGBCore *core)
|
||||
{
|
||||
|
@ -4307,22 +4283,6 @@ igb_autoneg_resume(IGBCore *core)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
igb_vm_state_change(void *opaque, bool running, RunState state)
|
||||
{
|
||||
IGBCore *core = opaque;
|
||||
|
||||
if (running) {
|
||||
trace_e1000e_vm_state_running();
|
||||
igb_intrmgr_resume(core);
|
||||
igb_autoneg_resume(core);
|
||||
} else {
|
||||
trace_e1000e_vm_state_stopped();
|
||||
igb_autoneg_pause(core);
|
||||
igb_intrmgr_pause(core);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
igb_core_pci_realize(IGBCore *core,
|
||||
const uint16_t *eeprom_templ,
|
||||
|
@ -4335,8 +4295,6 @@ igb_core_pci_realize(IGBCore *core,
|
|||
igb_autoneg_timer, core);
|
||||
igb_intrmgr_pci_realize(core);
|
||||
|
||||
core->vmstate = qemu_add_vm_change_state_handler(igb_vm_state_change, core);
|
||||
|
||||
for (i = 0; i < IGB_NUM_QUEUES; i++) {
|
||||
net_tx_pkt_init(&core->tx[i].tx_pkt, E1000E_MAX_TX_FRAGS);
|
||||
}
|
||||
|
@ -4360,8 +4318,6 @@ igb_core_pci_uninit(IGBCore *core)
|
|||
|
||||
igb_intrmgr_pci_unint(core);
|
||||
|
||||
qemu_del_vm_change_state_handler(core->vmstate);
|
||||
|
||||
for (i = 0; i < IGB_NUM_QUEUES; i++) {
|
||||
net_tx_pkt_uninit(core->tx[i].tx_pkt);
|
||||
}
|
||||
|
@ -4586,5 +4542,12 @@ igb_core_post_load(IGBCore *core)
|
|||
*/
|
||||
nc->link_down = (core->mac[STATUS] & E1000_STATUS_LU) == 0;
|
||||
|
||||
/*
|
||||
* we need to restart intrmgr timers, as an older version of
|
||||
* QEMU can have stopped them before migration
|
||||
*/
|
||||
igb_intrmgr_resume(core);
|
||||
igb_autoneg_resume(core);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -90,8 +90,6 @@ struct IGBCore {
|
|||
|
||||
IGBIntrDelayTimer eitr[IGB_INTR_NUM];
|
||||
|
||||
VMChangeStateEntry *vmstate;
|
||||
|
||||
uint32_t eitr_guest_value[IGB_INTR_NUM];
|
||||
|
||||
uint8_t permanent_mac[ETH_ALEN];
|
||||
|
|
|
@ -632,7 +632,7 @@ static inline int ladr_match(PCNetState *s, const uint8_t *buf, int size)
|
|||
{
|
||||
struct qemu_ether_header *hdr = (void *)buf;
|
||||
if ((*(hdr->ether_dhost)&0x01) &&
|
||||
((uint64_t *)&s->csr[8])[0] != 0LL) {
|
||||
(s->csr[8] | s->csr[9] | s->csr[10] | s->csr[11]) != 0) {
|
||||
uint8_t ladr[8] = {
|
||||
s->csr[8] & 0xff, s->csr[8] >> 8,
|
||||
s->csr[9] & 0xff, s->csr[9] >> 8,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
return ebpf_rss_load(&n->ebpf_rss);
|
||||
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)
|
||||
|
@ -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,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue