@@ -27,6 +27,7 @@
#include "qemu/notify.h"
#include "qom/object.h"
#include "qemu/rcu.h"
+#include "qemu/main-loop.h"
#define RAM_ADDR_INVALID (~(ram_addr_t)0)
@@ -1069,8 +1070,22 @@ struct FlatView {
MemoryRegion *root;
};
+bool memory_region_transaction_in_progress(void);
+
static inline FlatView *address_space_to_flatview(AddressSpace *as)
{
+ /*
+ * Before using any flatview, sanity check we're not during a memory
+ * region transaction or the map can be invalid. Note that this can
+ * also be called during commit phase of memory transaction, but that
+ * should also only happen when the depth decreases to 0 first.
+ * Meanwhile it's safe to access current_map with RCU read lock held
+ * even if during a memory transaction. It means the user can bear
+ * with an obsolete map.
+ */
+ assert((!memory_region_transaction_in_progress() &&
+ qemu_mutex_iothread_locked()) ||
+ rcu_read_is_locked());
return qatomic_rcu_read(&as->current_map);
}
@@ -1116,6 +1116,11 @@ void memory_region_transaction_commit(void)
}
}
+bool memory_region_transaction_in_progress(void)
+{
+ return memory_region_transaction_depth != 0;
+}
+
static void memory_region_destructor_none(MemoryRegion *mr)
{
}
Before using any flatview, sanity check we're not during a memory region transaction or the map can be invalid. Signed-off-by: Chuang Xu <xuchuangxclwt@bytedance.com> --- include/exec/memory.h | 15 +++++++++++++++ softmmu/memory.c | 5 +++++ 2 files changed, 20 insertions(+)