mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge remote-tracking branch 'remotes/jasowang/tags/net-pull-request' into staging
Want to send earlier but most patches just come. - fix vhost-vdpa issues when no peer - fix virtio-pci queue enabling index value - forbid reentrant RX Changes from V1: - drop the patch that has been merged # gpg: Signature made Tue 28 Jul 2020 09:59:41 BST # gpg: using RSA key EF04965B398D6211 # 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 * remotes/jasowang/tags/net-pull-request: net: forbid the reentrant RX virtio-net: check the existence of peer before accessing vDPA config virtio-pci: fix wrong index in virtio_pci_queue_enabled Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
+19
-11
@@ -125,6 +125,7 @@ static void virtio_net_get_config(VirtIODevice *vdev, uint8_t *config)
|
||||
{
|
||||
VirtIONet *n = VIRTIO_NET(vdev);
|
||||
struct virtio_net_config netcfg;
|
||||
NetClientState *nc = qemu_get_queue(n->nic);
|
||||
|
||||
int ret = 0;
|
||||
memset(&netcfg, 0 , sizeof(struct virtio_net_config));
|
||||
@@ -142,13 +143,16 @@ static void virtio_net_get_config(VirtIODevice *vdev, uint8_t *config)
|
||||
VIRTIO_NET_RSS_SUPPORTED_HASHES);
|
||||
memcpy(config, &netcfg, n->config_size);
|
||||
|
||||
NetClientState *nc = qemu_get_queue(n->nic);
|
||||
if (nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_VDPA) {
|
||||
/*
|
||||
* Is this VDPA? No peer means not VDPA: there's no way to
|
||||
* disconnect/reconnect a VDPA peer.
|
||||
*/
|
||||
if (nc->peer && nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_VDPA) {
|
||||
ret = vhost_net_get_config(get_vhost_net(nc->peer), (uint8_t *)&netcfg,
|
||||
n->config_size);
|
||||
if (ret != -1) {
|
||||
memcpy(config, &netcfg, n->config_size);
|
||||
}
|
||||
n->config_size);
|
||||
if (ret != -1) {
|
||||
memcpy(config, &netcfg, n->config_size);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -156,6 +160,7 @@ static void virtio_net_set_config(VirtIODevice *vdev, const uint8_t *config)
|
||||
{
|
||||
VirtIONet *n = VIRTIO_NET(vdev);
|
||||
struct virtio_net_config netcfg = {};
|
||||
NetClientState *nc = qemu_get_queue(n->nic);
|
||||
|
||||
memcpy(&netcfg, config, n->config_size);
|
||||
|
||||
@@ -166,11 +171,14 @@ static void virtio_net_set_config(VirtIODevice *vdev, const uint8_t *config)
|
||||
qemu_format_nic_info_str(qemu_get_queue(n->nic), n->mac);
|
||||
}
|
||||
|
||||
NetClientState *nc = qemu_get_queue(n->nic);
|
||||
if (nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_VDPA) {
|
||||
vhost_net_set_config(get_vhost_net(nc->peer), (uint8_t *)&netcfg,
|
||||
0, n->config_size,
|
||||
VHOST_SET_CONFIG_TYPE_MASTER);
|
||||
/*
|
||||
* Is this VDPA? No peer means not VDPA: there's no way to
|
||||
* disconnect/reconnect a VDPA peer.
|
||||
*/
|
||||
if (nc->peer && nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_VDPA) {
|
||||
vhost_net_set_config(get_vhost_net(nc->peer),
|
||||
(uint8_t *)&netcfg, 0, n->config_size,
|
||||
VHOST_SET_CONFIG_TYPE_MASTER);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1113,7 +1113,7 @@ static bool virtio_pci_queue_enabled(DeviceState *d, int n)
|
||||
VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
|
||||
|
||||
if (virtio_vdev_has_feature(vdev, VIRTIO_F_VERSION_1)) {
|
||||
return proxy->vqs[vdev->queue_sel].enabled;
|
||||
return proxy->vqs[n].enabled;
|
||||
}
|
||||
|
||||
return virtio_queue_enabled_legacy(vdev, n);
|
||||
|
||||
@@ -250,6 +250,9 @@ void qemu_net_queue_purge(NetQueue *queue, NetClientState *from)
|
||||
|
||||
bool qemu_net_queue_flush(NetQueue *queue)
|
||||
{
|
||||
if (queue->delivering)
|
||||
return false;
|
||||
|
||||
while (!QTAILQ_EMPTY(&queue->packets)) {
|
||||
NetPacket *packet;
|
||||
int ret;
|
||||
|
||||
Reference in New Issue
Block a user