[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH RFC 03/13] migration: Yield bitmap_mutex properly when sending/sl
From: |
Peter Xu |
Subject: |
[PATCH RFC 03/13] migration: Yield bitmap_mutex properly when sending/sleeping |
Date: |
Mon, 29 Aug 2022 12:56:49 -0400 |
Don't take the bitmap mutex when sending pages, or when being throttled by
migration_rate_limit() (which is a bit tricky to call it here in ram code,
but seems still helpful).
It prepares for the possibility of concurrently sending pages in >1 threads
using the function ram_save_host_page() because all threads may need the
bitmap_mutex to operate on bitmaps, so that either sendmsg() or any kind of
qemu_sem_wait() blocking for one thread will not block the other from
progressing.
Signed-off-by: Peter Xu <peterx@redhat.com>
---
migration/ram.c | 42 +++++++++++++++++++++++++++++++-----------
1 file changed, 31 insertions(+), 11 deletions(-)
diff --git a/migration/ram.c b/migration/ram.c
index 8c5d5332e8..9e96a46323 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -2470,6 +2470,7 @@ static int ram_save_host_page(RAMState *rs,
PageSearchStatus *pss)
unsigned long hostpage_boundary =
QEMU_ALIGN_UP(pss->page + 1, pagesize_bits);
unsigned long start_page = pss->page;
+ bool page_dirty;
int res;
if (ramblock_is_ignored(pss->block)) {
@@ -2487,22 +2488,41 @@ static int ram_save_host_page(RAMState *rs,
PageSearchStatus *pss)
break;
}
+ page_dirty = migration_bitmap_clear_dirty(rs, pss->block, pss->page);
+ /*
+ * Properly yield the lock only in postcopy preempt mode because
+ * both migration thread and rp-return thread can operate on the
+ * bitmaps.
+ */
+ if (postcopy_preempt_active()) {
+ qemu_mutex_unlock(&rs->bitmap_mutex);
+ }
+
/* Check the pages is dirty and if it is send it */
- if (migration_bitmap_clear_dirty(rs, pss->block, pss->page)) {
+ if (page_dirty) {
tmppages = ram_save_target_page(rs, pss);
- if (tmppages < 0) {
- return tmppages;
+ if (tmppages >= 0) {
+ pages += tmppages;
+ /*
+ * Allow rate limiting to happen in the middle of huge pages if
+ * something is sent in the current iteration.
+ */
+ if (pagesize_bits > 1 && tmppages > 0) {
+ migration_rate_limit();
+ }
}
+ } else {
+ tmppages = 0;
+ }
- pages += tmppages;
- /*
- * Allow rate limiting to happen in the middle of huge pages if
- * something is sent in the current iteration.
- */
- if (pagesize_bits > 1 && tmppages > 0) {
- migration_rate_limit();
- }
+ if (postcopy_preempt_active()) {
+ qemu_mutex_lock(&rs->bitmap_mutex);
}
+
+ if (tmppages < 0) {
+ return tmppages;
+ }
+
pss->page = migration_bitmap_find_dirty(rs, pss->block, pss->page);
} while ((pss->page < hostpage_boundary) &&
offset_in_ramblock(pss->block,
--
2.32.0
- [PATCH RFC 00/13] migration: Postcopy Preempt-Full, Peter Xu, 2022/08/29
- [PATCH RFC 02/13] migration: Add postcopy_preempt_active(), Peter Xu, 2022/08/29
- [PATCH RFC 01/13] migration: Use non-atomic ops for clear log bitmap, Peter Xu, 2022/08/29
- [PATCH RFC 06/13] migration: Trivial cleanup save_page_header() on same block check, Peter Xu, 2022/08/29
- [PATCH RFC 07/13] migration: Remove RAMState.f references in compression code, Peter Xu, 2022/08/29
- [PATCH RFC 04/13] migration: Cleanup xbzrle zero page cache update logic, Peter Xu, 2022/08/29
- [PATCH RFC 11/13] migration: Make PageSearchStatus part of RAMState, Peter Xu, 2022/08/29
- [PATCH RFC 03/13] migration: Yield bitmap_mutex properly when sending/sleeping,
Peter Xu <=
- [PATCH RFC 08/13] migration: Teach PSS about host page, Peter Xu, 2022/08/29
- [PATCH RFC 10/13] migration: Add pss_init(), Peter Xu, 2022/08/29
- [PATCH RFC 13/13] migration: Send requested page directly in rp-return thread, Peter Xu, 2022/08/29
- [PATCH RFC 05/13] migration: Disallow postcopy preempt to be used with compress, Peter Xu, 2022/08/29
- [PATCH RFC 12/13] migration: Move last_sent_block into PageSearchStatus, Peter Xu, 2022/08/29
- [PATCH RFC 09/13] migration: Introduce pss_channel, Peter Xu, 2022/08/29
- Re: [PATCH RFC 00/13] migration: Postcopy Preempt-Full, Peter Xu, 2022/08/29