Patchwork [14/30] memory: create FlatView for new address spaces

login
register
mail settings
Submitter Paolo Bonzini
Date May 21, 2013, 10:57 a.m.
Message ID <1369133851-1894-15-git-send-email-pbonzini@redhat.com>
Download mbox | patch
Permalink /patch/245276/
State New
Headers show

Comments

Paolo Bonzini - May 21, 2013, 10:57 a.m.
Even a new address space might have a non-empty FlatView.  In order
to initialize it properly, address_space_init should (a) call
memory_region_transaction_commit after the address space is inserted
into the list; (b) force memory_region_transaction_commit to do something.

This bug was latent so far because all address spaces started empty, including
the PCI address space where the bus master region is initially disabled.
However, the target address space of an IOMMU is usually rooted at
get_system_memory(), which might not be empty at the time the IOMMU is created.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 memory.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
Peter Maydell - May 21, 2013, 12:03 p.m.
On 21 May 2013 11:57, Paolo Bonzini <pbonzini@redhat.com> wrote:
> Even a new address space might have a non-empty FlatView.  In order
> to initialize it properly, address_space_init should (a) call
> memory_region_transaction_commit after the address space is inserted
> into the list; (b) force memory_region_transaction_commit to do something.
>
> This bug was latent so far because all address spaces started empty, including
> the PCI address space where the bus master region is initially disabled.
> However, the target address space of an IOMMU is usually rooted at
> get_system_memory(), which might not be empty at the time the IOMMU is created.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

The patch title should probably be "populate FlatView for new address
spaces", not "create". Given that,

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

-- PMM

Patch

diff --git a/memory.c b/memory.c
index 9478f98..99f046d 100644
--- a/memory.c
+++ b/memory.c
@@ -1576,8 +1576,9 @@  void address_space_init(AddressSpace *as, MemoryRegion *root)
     as->ioeventfds = NULL;
     QTAILQ_INSERT_TAIL(&address_spaces, as, address_spaces_link);
     as->name = NULL;
-    memory_region_transaction_commit();
     address_space_init_dispatch(as);
+    memory_region_update_pending |= root->enabled;
+    memory_region_transaction_commit();
 }
 
 void address_space_destroy(AddressSpace *as)