Przeglądaj źródła

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>
Akihiko Odaki 1 rok temu
rodzic
commit
107a64b9a3
3 zmienionych plików z 16 dodań i 0 usunięć
  1. 7 0
      hw/pci/pci.c
  2. 7 0
      hw/pci/pcie_sriov.c
  3. 2 0
      include/hw/pci/pcie_sriov.h

+ 7 - 0
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);
     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 = {
 const VMStateDescription vmstate_pci_device = {
     .name = "PCIDevice",
     .name = "PCIDevice",
     .version_id = 2,
     .version_id = 2,
     .minimum_version_id = 1,
     .minimum_version_id = 1,
+    .post_load = pci_post_load,
     .fields = (const VMStateField[]) {
     .fields = (const VMStateField[]) {
         VMSTATE_INT32_POSITIVE_LE(version_id, PCIDevice),
         VMSTATE_INT32_POSITIVE_LE(version_id, PCIDevice),
         VMSTATE_BUFFER_UNSAFE_INFO_TEST(config, PCIDevice,
         VMSTATE_BUFFER_UNSAFE_INFO_TEST(config, PCIDevice,

+ 7 - 0
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 */
 /* Reset SR/IOV */
 void pcie_sriov_pf_reset(PCIDevice *dev)
 void pcie_sriov_pf_reset(PCIDevice *dev)

+ 2 - 0
include/hw/pci/pcie_sriov.h

@@ -57,6 +57,8 @@ void pcie_sriov_pf_add_sup_pgsize(PCIDevice *dev, uint16_t opt_sup_pgsize);
 void pcie_sriov_config_write(PCIDevice *dev, uint32_t address,
 void pcie_sriov_config_write(PCIDevice *dev, uint32_t address,
                              uint32_t val, int len);
                              uint32_t val, int len);
 
 
+void pcie_sriov_pf_post_load(PCIDevice *dev);
+
 /* Reset SR/IOV */
 /* Reset SR/IOV */
 void pcie_sriov_pf_reset(PCIDevice *dev);
 void pcie_sriov_pf_reset(PCIDevice *dev);