From: "Denis V. Lunev" <[email protected]> Restoring config space remaps the BARs, updates the bridge windows when the device is a bridge, and toggles the bus master region. Each of those commits a transaction of its own, so one device costs several flatview rebuilds where one would do, and the cost of a rebuild grows with the number of regions in the machine.
Nothing between them touches an address space, so the three can share a transaction. The saving scales with the number of PCI devices. CC: Michael S. Tsirkin <[email protected]> Signed-off-by: Denis V. Lunev <[email protected]> Reviewed-by: Michael S. Tsirkin <[email protected]> Signed-off-by: Michael S. Tsirkin <[email protected]> Message-ID: <[email protected]> --- hw/pci/pci.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/hw/pci/pci.c b/hw/pci/pci.c index 14c78e3c62..0efb4eb4bb 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -840,6 +840,8 @@ static int get_pci_config_device(QEMUFile *f, void *pv, size_t size, } memcpy(s->config, config, size); + memory_region_transaction_begin(); + pci_update_mappings(s); if (IS_PCI_BRIDGE(s)) { pci_bridge_update_mappings(PCI_BRIDGE(s)); @@ -848,6 +850,8 @@ static int get_pci_config_device(QEMUFile *f, void *pv, size_t size, pci_set_master(s, pci_get_word(s->config + PCI_COMMAND) & PCI_COMMAND_MASTER); + memory_region_transaction_commit(); + g_free(config); return 0; } -- MST
