diff options
author | Akihiko Odaki <akihiko.odaki@daynix.com> | 2024-06-27 15:07:58 +0900 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2024-07-03 18:14:07 -0400 |
commit | 107a64b9a360cf5ca046852bc03334f7a9f22aef (patch) | |
tree | 11a8ae4f1e7c2755938e7adf3746bfb35f154705 /hw | |
parent | cbd9e5120bac3e292eee77b7a2e3692f235a1a26 (diff) | |
download | qemu-107a64b9a360cf5ca046852bc03334f7a9f22aef.zip qemu-107a64b9a360cf5ca046852bc03334f7a9f22aef.tar.gz qemu-107a64b9a360cf5ca046852bc03334f7a9f22aef.tar.bz2 |
pcie_sriov: Register VFs after migration
pcie_sriov doesn't have code to restore its state after migration, but
igb, which uses pcie_sriov, naively claimed its migration capability.
Add code to register VFs after migration and fix igb migration.
Fixes: 3a977deebe6b ("Intrdocue igb device emulation")
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Message-Id: <20240627-reuse-v10-9-7ca0b8ed3d9f@daynix.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'hw')
-rw-r--r-- | hw/pci/pci.c | 7 | ||||
-rw-r--r-- | hw/pci/pcie_sriov.c | 7 |
2 files changed, 14 insertions, 0 deletions
diff --git a/hw/pci/pci.c b/hw/pci/pci.c index e32a69f..fa85f87 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -733,10 +733,17 @@ static bool migrate_is_not_pcie(void *opaque, int version_id) return !pci_is_express((PCIDevice *)opaque); } +static int pci_post_load(void *opaque, int version_id) +{ + pcie_sriov_pf_post_load(opaque); + return 0; +} + const VMStateDescription vmstate_pci_device = { .name = "PCIDevice", .version_id = 2, .minimum_version_id = 1, + .post_load = pci_post_load, .fields = (const VMStateField[]) { VMSTATE_INT32_POSITIVE_LE(version_id, PCIDevice), VMSTATE_BUFFER_UNSAFE_INFO_TEST(config, PCIDevice, diff --git a/hw/pci/pcie_sriov.c b/hw/pci/pcie_sriov.c index fae6ace..56523ab 100644 --- a/hw/pci/pcie_sriov.c +++ b/hw/pci/pcie_sriov.c @@ -252,6 +252,13 @@ void pcie_sriov_config_write(PCIDevice *dev, uint32_t address, } } +void pcie_sriov_pf_post_load(PCIDevice *dev) +{ + if (dev->exp.sriov_cap) { + register_vfs(dev); + } +} + /* Reset SR/IOV */ void pcie_sriov_pf_reset(PCIDevice *dev) |