On 28.02.23 15:25, Longpeng(Mike) via wrote:
From: Longpeng <longpe...@huawei.com>
When updating ioeventfds, we need to iterate all address spaces and
iterate all flat ranges of each address space. There is so much
redundant process that a FlatView would be iterated for so many times
during one commit (memory_region_transaction_commit).
We can mark a FlatView as UPDATED and then skip it in the next iteration
and clear the UPDATED flag at the end of the commit. The overhead can
be significantly reduced.
For example, a VM with 16 vdpa net devices and each one has 65 vectors,
can reduce the time spent on memory_region_transaction_commit by 95%.
Signed-off-by: Longpeng <longpe...@huawei.com>
---
include/exec/memory.h | 2 ++
softmmu/memory.c | 28 +++++++++++++++++++++++++++-
2 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/include/exec/memory.h b/include/exec/memory.h
index 2e602a2fad..974eabf765 100644
--- a/include/exec/memory.h
+++ b/include/exec/memory.h
@@ -1093,6 +1093,8 @@ struct FlatView {
unsigned nr_allocated;
struct AddressSpaceDispatch *dispatch;
MemoryRegion *root;
+#define FLATVIEW_FLAG_IOEVENTFD_UPDATED (1 << 0)
+ unsigned flags;
};
static inline FlatView *address_space_to_flatview(AddressSpace *as)
diff --git a/softmmu/memory.c b/softmmu/memory.c
index 9d64efca26..71ff996712 100644
--- a/softmmu/memory.c
+++ b/softmmu/memory.c
@@ -815,6 +815,15 @@ FlatView *address_space_get_flatview(AddressSpace *as)
return view;
}
+static void address_space_reset_view_flags(AddressSpace *as, unsigned mask)
+{
+ FlatView *view = address_space_get_flatview(as);
+
+ if (view->flags & mask) {
+ view->flags &= ~mask;
+ }
Just do it unconditionally.
Unfortunately, I cannot comment on the bigger picture, but it does look
good to me.
--
Thanks,
David / dhildenb