qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Juan Quintela <quintela@redhat.com>
To: qemu-devel@nongnu.org
Cc: dgilbert@redhat.com, lvivier@redhat.com, peterx@redhat.com
Subject: [Qemu-devel] [PATCH v8 14/20] migration: Really use multiple pages at a time
Date: Wed, 13 Sep 2017 12:59:47 +0200	[thread overview]
Message-ID: <20170913105953.13760-15-quintela@redhat.com> (raw)
In-Reply-To: <20170913105953.13760-1-quintela@redhat.com>

We now send several pages at a time each time that we wakeup a thread.

Signed-off-by: Juan Quintela <quintela@redhat.com>

--

Use iovec's instead of creating the equivalent.
Clear memory used by pages (dave)
Use g_new0(danp)
define MULTIFD_CONTINUE
---
 migration/ram.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 48 insertions(+), 9 deletions(-)

diff --git a/migration/ram.c b/migration/ram.c
index 1381bfaf8a..179b45eea7 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -49,6 +49,7 @@
 #include "migration/colo.h"
 #include "sysemu/sysemu.h"
 #include "qemu/uuid.h"
+#include "qemu/iov.h"
 
 /***********************************************************/
 /* ram save/restore */
@@ -362,6 +363,15 @@ static void compress_threads_save_setup(void)
 
 /* Multiple fd's */
 
+/* used to continue on the same multifd group */
+#define MULTIFD_CONTINUE UINT16_MAX
+
+typedef struct {
+    int num;
+    size_t size;
+    struct iovec *iov;
+} multifd_pages_t;
+
 struct MultiFDSendParams {
     /* not changed */
     uint8_t id;
@@ -372,11 +382,7 @@ struct MultiFDSendParams {
     QemuMutex mutex;
     /* protected by param mutex */
     bool quit;
-    /* This is a temp field.  We are using it now to transmit
-       something the address of the page.  Later in the series, we
-       change it for the real page.
-    */
-    uint8_t *address;
+    multifd_pages_t pages;
     /* protected by multifd mutex */
     /* has the thread finish the last submitted job */
     bool done;
@@ -389,8 +395,24 @@ struct {
     int count;
     QemuMutex mutex;
     QemuSemaphore sem;
+    multifd_pages_t pages;
 } *multifd_send_state;
 
+static void multifd_init_pages(multifd_pages_t *pages)
+{
+    pages->num = 0;
+    pages->size = migrate_multifd_page_count();
+    pages->iov = g_new0(struct iovec, pages->size);
+}
+
+static void multifd_clear_pages(multifd_pages_t *pages)
+{
+    pages->num = 0;
+    pages->size = 0;
+    g_free(pages->iov);
+    pages->iov = NULL;
+}
+
 static void terminate_multifd_send_threads(Error *errp)
 {
     int i;
@@ -429,9 +451,11 @@ int multifd_save_cleanup(Error **errp)
         socket_send_channel_destroy(p->c);
         g_free(p->name);
         p->name = NULL;
+        multifd_clear_pages(&p->pages);
     }
     g_free(multifd_send_state->params);
     multifd_send_state->params = NULL;
+    multifd_clear_pages(&multifd_send_state->pages);
     g_free(multifd_send_state);
     multifd_send_state = NULL;
     return ret;
@@ -471,8 +495,8 @@ static void *multifd_send_thread(void *opaque)
             qemu_mutex_unlock(&p->mutex);
             break;
         }
-        if (p->address) {
-            p->address = 0;
+        if (p->pages.num) {
+            p->pages.num = 0;
             qemu_mutex_unlock(&p->mutex);
             qemu_mutex_lock(&multifd_send_state->mutex);
             p->done = true;
@@ -522,6 +546,7 @@ int multifd_save_setup(void)
     multifd_send_state->count = 0;
     qemu_mutex_init(&multifd_send_state->mutex);
     qemu_sem_init(&multifd_send_state->sem, 0);
+    multifd_init_pages(&multifd_send_state->pages);
     for (i = 0; i < thread_count; i++) {
         MultiFDSendParams *p = &multifd_send_state->params[i];
 
@@ -530,7 +555,7 @@ int multifd_save_setup(void)
         p->quit = false;
         p->id = i;
         p->done = true;
-        p->address = 0;
+        multifd_init_pages(&p->pages);
         p->name = g_strdup_printf("multifdsend_%d", i);
         socket_send_channel_create(multifd_new_channel_async, p);
     }
@@ -541,6 +566,17 @@ static uint16_t multifd_send_page(uint8_t *address, bool last_page)
 {
     int i;
     MultiFDSendParams *p = NULL; /* make happy gcc */
+    multifd_pages_t *pages = &multifd_send_state->pages;
+
+    pages->iov[pages->num].iov_base = address;
+    pages->iov[pages->num].iov_len = TARGET_PAGE_SIZE;
+    pages->num++;
+
+    if (!last_page) {
+        if (pages->num < (pages->size - 1)) {
+            return MULTIFD_CONTINUE;
+        }
+    }
 
     qemu_sem_wait(&multifd_send_state->sem);
     qemu_mutex_lock(&multifd_send_state->mutex);
@@ -554,7 +590,10 @@ static uint16_t multifd_send_page(uint8_t *address, bool last_page)
     }
     qemu_mutex_unlock(&multifd_send_state->mutex);
     qemu_mutex_lock(&p->mutex);
-    p->address = address;
+    p->pages.num = pages->num;
+    iov_copy(p->pages.iov, pages->num, pages->iov, pages->num, 0,
+             iov_size(pages->iov, pages->num));
+    pages->num = 0;
     qemu_mutex_unlock(&p->mutex);
     qemu_sem_post(&p->sem);
 
-- 
2.13.5

  parent reply	other threads:[~2017-09-13 11:00 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-13 10:59 [Qemu-devel] [PATCH v8 00/20] Multifd Juan Quintela
2017-09-13 10:59 ` [Qemu-devel] [PATCH v8 01/20] migration: Create migration_ioc_process_incoming() Juan Quintela
2017-09-13 10:59 ` [Qemu-devel] [PATCH v8 02/20] migration: Teach it about G_SOURCE_REMOVE Juan Quintela
2017-09-13 10:59 ` [Qemu-devel] [PATCH v8 03/20] migration: Add comments to channel functions Juan Quintela
2017-09-13 10:59 ` [Qemu-devel] [PATCH v8 04/20] migration: Create migration_has_all_channels Juan Quintela
2017-09-13 10:59 ` [Qemu-devel] [PATCH v8 05/20] migration: Improve migration thread error handling Juan Quintela
2017-09-18 16:34   ` Dr. David Alan Gilbert
2017-09-13 10:59 ` [Qemu-devel] [PATCH v8 06/20] migration: Make migrate_fd_error() the owner of the Error Juan Quintela
2017-09-13 10:59 ` [Qemu-devel] [PATCH v8 07/20] migration: Add multifd capability Juan Quintela
2017-09-13 10:59 ` [Qemu-devel] [PATCH v8 08/20] migration: Create x-multifd-channels parameter Juan Quintela
2017-09-13 10:59 ` [Qemu-devel] [PATCH v8 09/20] migration: Create x-multifd-page-count parameter Juan Quintela
2017-09-13 10:59 ` [Qemu-devel] [PATCH v8 10/20] migration: Create multifd migration threads Juan Quintela
2017-09-13 10:59 ` [Qemu-devel] [PATCH v8 11/20] migration: Split migration_fd_process_incoming Juan Quintela
2017-09-13 10:59 ` [Qemu-devel] [PATCH v8 12/20] migration: Start of multiple fd work Juan Quintela
2017-09-13 11:35   ` Daniel P. Berrange
2017-09-13 11:44   ` Daniel P. Berrange
2017-09-13 10:59 ` [Qemu-devel] [PATCH v8 13/20] migration: Create ram_multifd_page Juan Quintela
2017-09-13 10:59 ` Juan Quintela [this message]
2017-09-13 10:59 ` [Qemu-devel] [PATCH v8 15/20] migration: Send the fd number which we are going to use for this page Juan Quintela
2017-09-13 10:59 ` [Qemu-devel] [PATCH v8 16/20] migration: Create thread infrastructure for multifd recv side Juan Quintela
2017-09-13 11:42   ` Daniel P. Berrange
2017-09-13 10:59 ` [Qemu-devel] [PATCH v8 17/20] migration: Test new fd infrastructure Juan Quintela
2017-09-13 10:59 ` [Qemu-devel] [PATCH v8 18/20] migration: Rename initial_bytes Juan Quintela
2017-09-13 10:59 ` [Qemu-devel] [PATCH v8 19/20] migration: Transfer pages over new channels Juan Quintela
2017-09-13 10:59 ` [Qemu-devel] [PATCH v8 20/20] migration: Flush receive queue Juan Quintela

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170913105953.13760-15-quintela@redhat.com \
    --to=quintela@redhat.com \
    --cc=dgilbert@redhat.com \
    --cc=lvivier@redhat.com \
    --cc=peterx@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).