mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 23:33:54 -06:00
pc, pci, virtio: new features, cleanups, fixes
- interrupt remapping for intel iommus - a bunch of virtio cleanups - fixes all over the place Signed-off-by: Michael S. Tsirkin <mst@redhat.com> -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJXkQsqAAoJECgfDbjSjVRpanoIAJ9JVlc1aEjt9sa0cSBcs+NQ J7JmgU9FqFsj+4FrNTouO3AxTjHurd1UAULP1WMPD+V3JpbnHct8r6SCBLQ5EBMN VOjYo4DwWs1g+DqnQ9WZmbadu06XvYi/yiAKNUzWfZk0MR11D0D/S5hmarNKw0Kq tGHeTWjGeY4WqFLV7m+qB4+cqkAByn6um99UtUvgLL05RgIEIP2IEMKYZ+rXvAa9 iGUvzqlO7mbq/+LbL18kaWywa4TCwbbd2eSGWaqhX4CuB62Rl33mWTXFcfaYhkyp Z3FgwaJ09h0lAjSVEbyAuLFMfO/BnMcsoKqwl4xc4vkn/xBCqFtgH9JcEVm3O8U= =ge2D -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging pc, pci, virtio: new features, cleanups, fixes - interrupt remapping for intel iommus - a bunch of virtio cleanups - fixes all over the place Signed-off-by: Michael S. Tsirkin <mst@redhat.com> # gpg: Signature made Thu 21 Jul 2016 18:49:30 BST # gpg: using RSA key 0x281F0DB8D28D5469 # gpg: Good signature from "Michael S. Tsirkin <mst@kernel.org>" # gpg: aka "Michael S. Tsirkin <mst@redhat.com>" # Primary key fingerprint: 0270 606B 6F3C DF3D 0B17 0970 C350 3912 AFBE 8E67 # Subkey fingerprint: 5D09 FD08 71C8 F85B 94CA 8A0D 281F 0DB8 D28D 5469 * remotes/mst/tags/for_upstream: (57 commits) intel_iommu: avoid unnamed fields virtio: Update migration docs virtio-gpu: Wrap in vmstate virtio-gpu: Use migrate_add_blocker for virgl migration blocking virtio-input: Wrap in vmstate 9pfs: Wrap in vmstate virtio-serial: Wrap in vmstate virtio-net: Wrap in vmstate virtio-balloon: Wrap in vmstate virtio-rng: Wrap in vmstate virtio-blk: Wrap in vmstate virtio-scsi: Wrap in vmstate virtio: Migration helper function and macro virtio-serial: Remove old migration version support virtio-net: Remove old migration version support virtio-scsi: Replace HandleOutput typedef Revert "mirror: Workaround for unexpected iohandler events during completion" virtio-scsi: Call virtio_add_queue_aio virtio-blk: Call virtio_add_queue_aio virtio: Introduce virtio_add_queue_aio ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
206d0c2436
55 changed files with 1478 additions and 349 deletions
|
@ -1492,7 +1492,7 @@ static void virtio_net_set_multiqueue(VirtIONet *n, int multiqueue)
|
|||
virtio_net_set_queues(n);
|
||||
}
|
||||
|
||||
static void virtio_net_save(QEMUFile *f, void *opaque)
|
||||
static void virtio_net_save(QEMUFile *f, void *opaque, size_t size)
|
||||
{
|
||||
VirtIONet *n = opaque;
|
||||
VirtIODevice *vdev = VIRTIO_DEVICE(n);
|
||||
|
@ -1538,15 +1538,12 @@ static void virtio_net_save_device(VirtIODevice *vdev, QEMUFile *f)
|
|||
}
|
||||
}
|
||||
|
||||
static int virtio_net_load(QEMUFile *f, void *opaque, int version_id)
|
||||
static int virtio_net_load(QEMUFile *f, void *opaque, size_t size)
|
||||
{
|
||||
VirtIONet *n = opaque;
|
||||
VirtIODevice *vdev = VIRTIO_DEVICE(n);
|
||||
|
||||
if (version_id < 2 || version_id > VIRTIO_NET_VM_VERSION)
|
||||
return -EINVAL;
|
||||
|
||||
return virtio_load(vdev, f, version_id);
|
||||
return virtio_load(vdev, f, VIRTIO_NET_VM_VERSION);
|
||||
}
|
||||
|
||||
static int virtio_net_load_device(VirtIODevice *vdev, QEMUFile *f,
|
||||
|
@ -1562,68 +1559,49 @@ static int virtio_net_load_device(VirtIODevice *vdev, QEMUFile *f,
|
|||
virtio_vdev_has_feature(vdev,
|
||||
VIRTIO_F_VERSION_1));
|
||||
|
||||
if (version_id >= 3)
|
||||
n->status = qemu_get_be16(f);
|
||||
n->status = qemu_get_be16(f);
|
||||
|
||||
if (version_id >= 4) {
|
||||
if (version_id < 8) {
|
||||
n->promisc = qemu_get_be32(f);
|
||||
n->allmulti = qemu_get_be32(f);
|
||||
} else {
|
||||
n->promisc = qemu_get_byte(f);
|
||||
n->allmulti = qemu_get_byte(f);
|
||||
}
|
||||
}
|
||||
|
||||
if (version_id >= 5) {
|
||||
n->mac_table.in_use = qemu_get_be32(f);
|
||||
/* MAC_TABLE_ENTRIES may be different from the saved image */
|
||||
if (n->mac_table.in_use <= MAC_TABLE_ENTRIES) {
|
||||
qemu_get_buffer(f, n->mac_table.macs,
|
||||
n->mac_table.in_use * ETH_ALEN);
|
||||
} else {
|
||||
int64_t i;
|
||||
|
||||
/* Overflow detected - can happen if source has a larger MAC table.
|
||||
* We simply set overflow flag so there's no need to maintain the
|
||||
* table of addresses, discard them all.
|
||||
* Note: 64 bit math to avoid integer overflow.
|
||||
*/
|
||||
for (i = 0; i < (int64_t)n->mac_table.in_use * ETH_ALEN; ++i) {
|
||||
qemu_get_byte(f);
|
||||
}
|
||||
n->mac_table.multi_overflow = n->mac_table.uni_overflow = 1;
|
||||
n->mac_table.in_use = 0;
|
||||
n->promisc = qemu_get_byte(f);
|
||||
n->allmulti = qemu_get_byte(f);
|
||||
|
||||
n->mac_table.in_use = qemu_get_be32(f);
|
||||
/* MAC_TABLE_ENTRIES may be different from the saved image */
|
||||
if (n->mac_table.in_use <= MAC_TABLE_ENTRIES) {
|
||||
qemu_get_buffer(f, n->mac_table.macs,
|
||||
n->mac_table.in_use * ETH_ALEN);
|
||||
} else {
|
||||
int64_t i;
|
||||
|
||||
/* Overflow detected - can happen if source has a larger MAC table.
|
||||
* We simply set overflow flag so there's no need to maintain the
|
||||
* table of addresses, discard them all.
|
||||
* Note: 64 bit math to avoid integer overflow.
|
||||
*/
|
||||
for (i = 0; i < (int64_t)n->mac_table.in_use * ETH_ALEN; ++i) {
|
||||
qemu_get_byte(f);
|
||||
}
|
||||
n->mac_table.multi_overflow = n->mac_table.uni_overflow = 1;
|
||||
n->mac_table.in_use = 0;
|
||||
}
|
||||
|
||||
if (version_id >= 6)
|
||||
qemu_get_buffer(f, (uint8_t *)n->vlans, MAX_VLAN >> 3);
|
||||
qemu_get_buffer(f, (uint8_t *)n->vlans, MAX_VLAN >> 3);
|
||||
|
||||
if (version_id >= 7) {
|
||||
if (qemu_get_be32(f) && !peer_has_vnet_hdr(n)) {
|
||||
error_report("virtio-net: saved image requires vnet_hdr=on");
|
||||
return -1;
|
||||
}
|
||||
if (qemu_get_be32(f) && !peer_has_vnet_hdr(n)) {
|
||||
error_report("virtio-net: saved image requires vnet_hdr=on");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (version_id >= 9) {
|
||||
n->mac_table.multi_overflow = qemu_get_byte(f);
|
||||
n->mac_table.uni_overflow = qemu_get_byte(f);
|
||||
}
|
||||
n->mac_table.multi_overflow = qemu_get_byte(f);
|
||||
n->mac_table.uni_overflow = qemu_get_byte(f);
|
||||
|
||||
if (version_id >= 10) {
|
||||
n->alluni = qemu_get_byte(f);
|
||||
n->nomulti = qemu_get_byte(f);
|
||||
n->nouni = qemu_get_byte(f);
|
||||
n->nobcast = qemu_get_byte(f);
|
||||
}
|
||||
n->alluni = qemu_get_byte(f);
|
||||
n->nomulti = qemu_get_byte(f);
|
||||
n->nouni = qemu_get_byte(f);
|
||||
n->nobcast = qemu_get_byte(f);
|
||||
|
||||
if (version_id >= 11) {
|
||||
if (qemu_get_byte(f) && !peer_has_ufo(n)) {
|
||||
error_report("virtio-net: saved image requires TUN_F_UFO support");
|
||||
return -1;
|
||||
}
|
||||
if (qemu_get_byte(f) && !peer_has_ufo(n)) {
|
||||
error_report("virtio-net: saved image requires TUN_F_UFO support");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (n->max_queues > 1) {
|
||||
|
@ -1809,8 +1787,6 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp)
|
|||
nc->rxfilter_notify_enabled = 1;
|
||||
|
||||
n->qdev = dev;
|
||||
register_savevm(dev, "virtio-net", -1, VIRTIO_NET_VM_VERSION,
|
||||
virtio_net_save, virtio_net_load, n);
|
||||
}
|
||||
|
||||
static void virtio_net_device_unrealize(DeviceState *dev, Error **errp)
|
||||
|
@ -1822,8 +1798,6 @@ static void virtio_net_device_unrealize(DeviceState *dev, Error **errp)
|
|||
/* This will stop vhost backend if appropriate. */
|
||||
virtio_net_set_status(vdev, 0);
|
||||
|
||||
unregister_savevm(dev, "virtio-net", n);
|
||||
|
||||
g_free(n->netclient_name);
|
||||
n->netclient_name = NULL;
|
||||
g_free(n->netclient_type);
|
||||
|
@ -1858,6 +1832,9 @@ static void virtio_net_instance_init(Object *obj)
|
|||
DEVICE(n), NULL);
|
||||
}
|
||||
|
||||
VMSTATE_VIRTIO_DEVICE(net, VIRTIO_NET_VM_VERSION, virtio_net_load,
|
||||
virtio_net_save);
|
||||
|
||||
static Property virtio_net_properties[] = {
|
||||
DEFINE_PROP_BIT("csum", VirtIONet, host_features, VIRTIO_NET_F_CSUM, true),
|
||||
DEFINE_PROP_BIT("guest_csum", VirtIONet, host_features,
|
||||
|
@ -1912,6 +1889,7 @@ static void virtio_net_class_init(ObjectClass *klass, void *data)
|
|||
VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
|
||||
|
||||
dc->props = virtio_net_properties;
|
||||
dc->vmsd = &vmstate_virtio_net;
|
||||
set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
|
||||
vdc->realize = virtio_net_device_realize;
|
||||
vdc->unrealize = virtio_net_device_unrealize;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue