From: "Dr. David Alan Gilbert (git)" <dgilbert@redhat.com>
To: qemu-devel@nongnu.org
Cc: aarcange@redhat.com, yamahata@private.email.ne.jp,
lilei@linux.vnet.ibm.com, quintela@redhat.com,
cristian.klein@cs.umu.se, amit.shah@redhat.com,
yanghy@cn.fujitsu.com
Subject: [Qemu-devel] [PATCH v4 21/47] Add wrappers and handlers for sending/receiving the postcopy-ram migration messages.
Date: Fri, 3 Oct 2014 18:47:27 +0100 [thread overview]
Message-ID: <1412358473-31398-22-git-send-email-dgilbert@redhat.com> (raw)
In-Reply-To: <1412358473-31398-1-git-send-email-dgilbert@redhat.com>
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
Add state variable showing current incoming postcopy state.
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
---
include/migration/migration.h | 8 +
include/sysemu/sysemu.h | 20 +++
savevm.c | 335 ++++++++++++++++++++++++++++++++++++++++++
3 files changed, 363 insertions(+)
diff --git a/include/migration/migration.h b/include/migration/migration.h
index 0d9f62d..2c078c4 100644
--- a/include/migration/migration.h
+++ b/include/migration/migration.h
@@ -61,6 +61,14 @@ typedef struct MigrationState MigrationState;
struct MigrationIncomingState {
QEMUFile *file;
+ volatile enum {
+ POSTCOPY_RAM_INCOMING_NONE = 0, /* Initial state - no postcopy */
+ POSTCOPY_RAM_INCOMING_ADVISE,
+ POSTCOPY_RAM_INCOMING_LISTENING,
+ POSTCOPY_RAM_INCOMING_RUNNING,
+ POSTCOPY_RAM_INCOMING_END
+ } postcopy_ram_state;
+
QEMUFile *return_path;
QemuMutex rp_mutex; /* We send replies from multiple threads */
};
diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
index ad96f2a..102dd93 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -88,6 +88,16 @@ enum qemu_vm_cmd {
QEMU_VM_CMD_OPENRP, /* Tell the dest to open the Return path */
QEMU_VM_CMD_REQACK, /* Request an ACK on the RP */
+ QEMU_VM_CMD_POSTCOPY_RAM_ADVISE = 20, /* Prior to any page transfers, just
+ warn we might want to do PC */
+ QEMU_VM_CMD_POSTCOPY_RAM_DISCARD, /* A list of pages to discard that
+ were previously sent during
+ precopy but are dirty. */
+ QEMU_VM_CMD_POSTCOPY_RAM_LISTEN, /* Start listening for incoming
+ pages as it's running. */
+ QEMU_VM_CMD_POSTCOPY_RAM_RUN, /* Start execution */
+ QEMU_VM_CMD_POSTCOPY_RAM_END, /* Postcopy is finished. */
+
QEMU_VM_CMD_AFTERLASTVALID
};
@@ -102,6 +112,16 @@ void qemu_savevm_command_send(QEMUFile *f, enum qemu_vm_cmd command,
uint16_t len, uint8_t *data);
void qemu_savevm_send_reqack(QEMUFile *f, uint32_t value);
void qemu_savevm_send_openrp(QEMUFile *f);
+void qemu_savevm_send_postcopy_ram_advise(QEMUFile *f);
+void qemu_savevm_send_postcopy_ram_discard(QEMUFile *f, const char *name,
+ uint16_t len, uint8_t offset,
+ uint64_t *addrlist,
+ uint32_t *masklist);
+
+void qemu_savevm_send_postcopy_ram_listen(QEMUFile *f);
+void qemu_savevm_send_postcopy_ram_run(QEMUFile *f);
+void qemu_savevm_send_postcopy_ram_end(QEMUFile *f, uint8_t status);
+
int qemu_loadvm_state(QEMUFile *f);
/* SLIRP */
diff --git a/savevm.c b/savevm.c
index 7236232..b942e8c 100644
--- a/savevm.c
+++ b/savevm.c
@@ -39,6 +39,7 @@
#include "exec/memory.h"
#include "qmp-commands.h"
#include "trace.h"
+#include "qemu/bitops.h"
#include "qemu/iov.h"
#include "block/snapshot.h"
#include "block/qapi.h"
@@ -624,6 +625,92 @@ void qemu_savevm_send_openrp(QEMUFile *f)
{
qemu_savevm_command_send(f, QEMU_VM_CMD_OPENRP, 0, NULL);
}
+
+/* Send prior to any RAM transfer */
+void qemu_savevm_send_postcopy_ram_advise(QEMUFile *f)
+{
+ DPRINTF("send postcopy-ram-advise");
+ uint64_t tmp[2];
+ tmp[0] = cpu_to_be64(sysconf(_SC_PAGESIZE));
+ tmp[1] = cpu_to_be64(1ul << qemu_target_page_bits());
+
+ qemu_savevm_command_send(f, QEMU_VM_CMD_POSTCOPY_RAM_ADVISE, 16,
+ (uint8_t *)tmp);
+}
+
+/* Prior to running, to cause pages that have been dirtied after precopy
+ * started to be discarded on the destination.
+ * CMD_POSTCOPY_RAM_DISCARD consist of:
+ * 3 byte header (filled in by qemu_savevm_send_postcopy_ram_discard)
+ * byte version (0)
+ * byte offset into the 1st data word containing 1st page of RAMBlock
+ * byte Length of name field
+ * n x byte RAM block name (NOT 0 terminated)
+ * n x
+ * be64 Page addresses for start of an invalidation range
+ * be32 mask of 32 pages, '1' to discard'
+ *
+ * Hopefully this is pretty sparse so we don't get too many entries,
+ * and using the mask should deal with most pagesize differences
+ * just ending up as a single full mask
+ *
+ * The mask is always 32bits irrespective of the long size
+ *
+ * name: RAMBlock name that these entries are part of
+ * len: Number of page entries
+ * addrlist: 'len' addresses
+ * masklist: 'len' masks (corresponding to the addresses)
+ */
+void qemu_savevm_send_postcopy_ram_discard(QEMUFile *f, const char *name,
+ uint16_t len, uint8_t offset,
+ uint64_t *addrlist,
+ uint32_t *masklist)
+{
+ uint8_t *buf;
+ uint16_t tmplen;
+ uint16_t t;
+
+ DPRINTF("send postcopy-ram-discard");
+ buf = g_malloc0(len*12 + strlen(name) + 3);
+ buf[0] = 0; /* Version */
+ buf[1] = offset;
+ assert(strlen(name) < 256);
+ buf[2] = strlen(name);
+ memcpy(buf+3, name, strlen(name));
+ tmplen = 3+strlen(name);
+
+ for (t = 0; t < len; t++) {
+ cpu_to_be64w((uint64_t *)(buf + tmplen), addrlist[t]);
+ tmplen += 8;
+ cpu_to_be32w((uint32_t *)(buf + tmplen), masklist[t]);
+ tmplen += 4;
+ }
+ qemu_savevm_command_send(f, QEMU_VM_CMD_POSTCOPY_RAM_DISCARD,
+ tmplen, buf);
+ g_free(buf);
+}
+
+/* Get the destination into a state where it can receive page data. */
+void qemu_savevm_send_postcopy_ram_listen(QEMUFile *f)
+{
+ DPRINTF("send postcopy-ram-listen");
+ qemu_savevm_command_send(f, QEMU_VM_CMD_POSTCOPY_RAM_LISTEN, 0, NULL);
+}
+
+/* Kick the destination into running */
+void qemu_savevm_send_postcopy_ram_run(QEMUFile *f)
+{
+ DPRINTF("send postcopy-ram-run");
+ qemu_savevm_command_send(f, QEMU_VM_CMD_POSTCOPY_RAM_RUN, 0, NULL);
+}
+
+/* End of postcopy - with a status byte; 0 is good, anything else is a fail */
+void qemu_savevm_send_postcopy_ram_end(QEMUFile *f, uint8_t status)
+{
+ DPRINTF("send postcopy-ram-end");
+ qemu_savevm_command_send(f, QEMU_VM_CMD_POSTCOPY_RAM_END, 1, &status);
+}
+
bool qemu_savevm_state_blocked(Error **errp)
{
SaveStateEntry *se;
@@ -935,6 +1022,220 @@ static LoadStateEntry_Head loadvm_handlers =
static int qemu_loadvm_state_main(QEMUFile *f,
LoadStateEntry_Head *loadvm_handlers);
+/* ------ incoming postcopy-ram messages ------ */
+/* 'advise' arrives before any RAM transfers just to tell us that a postcopy
+ * *might* happen - it might be skipped if precopy transferred everything
+ * quickly.
+ */
+static int loadvm_postcopy_ram_handle_advise(MigrationIncomingState *mis,
+ uint64_t remote_hps,
+ uint64_t remote_tps)
+{
+ DPRINTF("%s", __func__);
+ if (mis->postcopy_ram_state != POSTCOPY_RAM_INCOMING_NONE) {
+ error_report("CMD_POSTCOPY_RAM_ADVISE in wrong postcopy state (%d)",
+ mis->postcopy_ram_state);
+ return -1;
+ }
+
+ if (remote_hps != sysconf(_SC_PAGESIZE)) {
+ /*
+ * Some combinations of mismatch are probably possible but it gets
+ * a bit more complicated. In particular we need to place whole
+ * host pages on the dest at once, and we need to ensure that we
+ * handle dirtying to make sure we never end up sending part of
+ * a hostpage on it's own.
+ */
+ error_report("Postcopy needs matching host page sizes (s=%d d=%d)",
+ (int)remote_hps, (int)sysconf(_SC_PAGESIZE));
+ return -1;
+ }
+
+ if (remote_tps != (1ul << qemu_target_page_bits())) {
+ /*
+ * Again, some differences could be dealt with, but for now keep it
+ * simple.
+ */
+ error_report("Postcopy needs matching target page sizes (s=%d d=%d)",
+ (int)remote_tps, 1 << qemu_target_page_bits());
+ return -1;
+ }
+
+ mis->postcopy_ram_state = POSTCOPY_RAM_INCOMING_ADVISE;
+
+ /*
+ * Postcopy will be sending lots of small messages along the return path
+ * that it needs quick answers to.
+ */
+ socket_set_nodelay(qemu_get_fd(mis->return_path));
+
+ return 0;
+}
+
+/* After postcopy we will be told to throw some pages away since they're
+ * dirty and will have to be demand fetched. Must happen before CPU is
+ * started.
+ * There can be 0..many of these messages, each encoding multiple pages.
+ * Bits set in the message represent a page in the source VMs bitmap, but
+ * since the guest/target page sizes can be different on s/d then we have
+ * to convert.
+ */
+static int loadvm_postcopy_ram_handle_discard(MigrationIncomingState *mis,
+ uint16_t len)
+{
+ int tmp;
+ unsigned int first_bit_offset;
+ char ramid[256];
+
+ DPRINTF("%s", __func__);
+
+ if (mis->postcopy_ram_state != POSTCOPY_RAM_INCOMING_ADVISE) {
+ error_report("CMD_POSTCOPY_RAM_DISCARD in wrong postcopy state (%d)",
+ mis->postcopy_ram_state);
+ return -1;
+ }
+ /* We're expecting a
+ * 3 byte header,
+ * a RAM ID string
+ * then at least 1 12 byte chunks
+ */
+ if (len < 16) {
+ error_report("CMD_POSTCOPY_RAM_DISCARD invalid length (%d)", len);
+ return -1;
+ }
+
+ tmp = qemu_get_byte(mis->file);
+ if (tmp != 0) {
+ error_report("CMD_POSTCOPY_RAM_DISCARD invalid version (%d)", tmp);
+ return -1;
+ }
+ first_bit_offset = qemu_get_byte(mis->file);
+
+ if (qemu_get_counted_string(mis->file, (uint8_t *)ramid)) {
+ error_report("CMD_POSTCOPY_RAM_DISCARD Failed to read RAMBlock ID");
+ return -1;
+ }
+
+ len -= 3+strlen(ramid);
+ if (len % 12) {
+ error_report("CMD_POSTCOPY_RAM_DISCARD invalid length (%d)", len);
+ return -1;
+ }
+ while (len) {
+ uint64_t startaddr;
+ uint32_t mask;
+ /*
+ * We now have pairs of address, mask
+ * The mask is 32 bits of bitmask starting at 'startaddr'-offset
+ * RAMBlock; e.g. if the RAMBlock started at 8k where TPS=4k
+ * then first_bit_offset=2 and the 1st 2 bits of the mask
+ * aren't relevant to this RAMBlock, and bit 2 corresponds
+ * to the 1st page of this RAMBlock
+ */
+ startaddr = qemu_get_be64(mis->file);
+ mask = qemu_get_be32(mis->file);
+
+ len -= 12;
+
+ while (mask) {
+ /* mask= .....?10...0 */
+ /* ^fs */
+ int firstset = ctz32(mask);
+
+ /* tmp32=.....?11...1 */
+ /* ^fs */
+ uint32_t tmp32 = mask | ((((uint32_t)1)<<firstset)-1);
+
+ /* mask= .?01..10...0 */
+ /* ^fz ^fs */
+ int firstzero = cto32(tmp32);
+
+ if ((startaddr == 0) && (firstset < first_bit_offset)) {
+ error_report("CMD_POSTCOPY_RAM_DISCARD bad data; bit set"
+ " prior to block; block=%s offset=%d"
+ " firstset=%d\n", ramid, first_bit_offset,
+ firstzero);
+ return -1;
+ }
+
+ /*
+ * we know there must be at least 1 bit set due to the loop entry
+ * If there is no 0 firstzero will be 32
+ */
+ /* TODO - ram_discard_range gets added in a later patch
+ int ret = ram_discard_range(mis, ramid,
+ startaddr + firstset - first_bit_offset,
+ startaddr + (firstzero - 1) - first_bit_offset);
+ ret = -1;
+ if (ret) {
+ return ret;
+ }
+ */
+
+ /* mask= .?0000000000 */
+ /* ^fz ^fs */
+ if (firstzero != 32) {
+ mask &= (((uint32_t)-1) << firstzero);
+ } else {
+ mask = 0;
+ }
+ }
+ }
+ DPRINTF("%s finished", __func__);
+
+ return 0;
+}
+
+/* After this message we must be able to immediately receive page data */
+static int loadvm_postcopy_ram_handle_listen(MigrationIncomingState *mis)
+{
+ DPRINTF("%s", __func__);
+ if (mis->postcopy_ram_state != POSTCOPY_RAM_INCOMING_ADVISE) {
+ error_report("CMD_POSTCOPY_RAM_LISTEN in wrong postcopy state (%d)",
+ mis->postcopy_ram_state);
+ return -1;
+ }
+
+ mis->postcopy_ram_state = POSTCOPY_RAM_INCOMING_LISTENING;
+
+ /* TODO start up the postcopy listening thread */
+ return 0;
+}
+
+/* After all discards we can start running and asking for pages */
+static int loadvm_postcopy_ram_handle_run(MigrationIncomingState *mis)
+{
+ DPRINTF("%s", __func__);
+ if (mis->postcopy_ram_state != POSTCOPY_RAM_INCOMING_LISTENING) {
+ error_report("CMD_POSTCOPY_RAM_RUN in wrong postcopy state (%d)",
+ mis->postcopy_ram_state);
+ return -1;
+ }
+
+ mis->postcopy_ram_state = POSTCOPY_RAM_INCOMING_RUNNING;
+ if (autostart) {
+ /* Hold onto your hats, starting the CPU */
+ vm_start();
+ } else {
+ /* leave it paused and let management decide when to start the CPU */
+ runstate_set(RUN_STATE_PAUSED);
+ }
+
+ return 0;
+}
+
+/* The end - with a byte from the source which can tell us to fail. */
+static int loadvm_postcopy_ram_handle_end(MigrationIncomingState *mis)
+{
+ DPRINTF("%s", __func__);
+ if (mis->postcopy_ram_state == POSTCOPY_RAM_INCOMING_NONE) {
+ error_report("CMD_POSTCOPY_RAM_END in wrong postcopy state (%d)",
+ mis->postcopy_ram_state);
+ return -1;
+ }
+ return -1; /* TODO - expecting 1 byte good/fail */
+}
+
static int loadvm_process_command_simple_lencheck(const char *name,
unsigned int actual,
unsigned int expected)
@@ -961,6 +1262,7 @@ static int loadvm_process_command(QEMUFile *f,
uint16_t com;
uint16_t len;
uint32_t tmp32;
+ uint64_t tmp64a, tmp64b;
com = qemu_get_be16(f);
len = qemu_get_be16(f);
@@ -997,6 +1299,39 @@ static int loadvm_process_command(QEMUFile *f,
migrate_send_rp_ack(mis, tmp32);
break;
+ case QEMU_VM_CMD_POSTCOPY_RAM_ADVISE:
+ if (loadvm_process_command_simple_lencheck("CMD_POSTCOPY_RAM_ADVISE",
+ len, 16)) {
+ return -1;
+ }
+ tmp64a = qemu_get_be64(f); /* hps */
+ tmp64b = qemu_get_be64(f); /* tps */
+ return loadvm_postcopy_ram_handle_advise(mis, tmp64a, tmp64b);
+
+ case QEMU_VM_CMD_POSTCOPY_RAM_DISCARD:
+ return loadvm_postcopy_ram_handle_discard(mis, len);
+
+ case QEMU_VM_CMD_POSTCOPY_RAM_LISTEN:
+ if (loadvm_process_command_simple_lencheck("CMD_POSTCOPY_RAM_LISTEN",
+ len, 0)) {
+ return -1;
+ }
+ return loadvm_postcopy_ram_handle_listen(mis);
+
+ case QEMU_VM_CMD_POSTCOPY_RAM_RUN:
+ if (loadvm_process_command_simple_lencheck("CMD_POSTCOPY_RAM_RUN",
+ len, 0)) {
+ return -1;
+ }
+ return loadvm_postcopy_ram_handle_run(mis);
+
+ case QEMU_VM_CMD_POSTCOPY_RAM_END:
+ if (loadvm_process_command_simple_lencheck("CMD_POSTCOPY_RAM_END",
+ len, 1)) {
+ return -1;
+ }
+ return loadvm_postcopy_ram_handle_end(mis);
+
default:
error_report("VM_COMMAND 0x%x unknown (len 0x%x)", com, len);
return -1;
--
1.9.3
next prev parent reply other threads:[~2014-10-03 17:49 UTC|newest]
Thread overview: 204+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-03 17:47 [Qemu-devel] [PATCH v4 00/47] Postcopy implementation Dr. David Alan Gilbert (git)
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 01/47] QEMUSizedBuffer based QEMUFile Dr. David Alan Gilbert (git)
2014-10-08 2:10 ` zhanghailiang
2014-11-03 0:53 ` David Gibson
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 02/47] Tests: QEMUSizedBuffer/QEMUBuffer Dr. David Alan Gilbert (git)
2014-11-03 1:02 ` David Gibson
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 03/47] Start documenting how postcopy works Dr. David Alan Gilbert (git)
2014-11-03 1:31 ` David Gibson
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 04/47] qemu_ram_foreach_block: pass up error value, and down the ramblock name Dr. David Alan Gilbert (git)
2014-11-03 2:34 ` David Gibson
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 05/47] improve DPRINTF macros, add to savevm Dr. David Alan Gilbert (git)
2014-11-03 2:35 ` David Gibson
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 06/47] Add qemu_get_counted_string to read a string prefixed by a count byte Dr. David Alan Gilbert (git)
2014-11-03 2:39 ` David Gibson
2014-11-25 16:13 ` Dr. David Alan Gilbert
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 07/47] Create MigrationIncomingState Dr. David Alan Gilbert (git)
2014-11-03 2:45 ` David Gibson
2014-11-04 19:06 ` Dr. David Alan Gilbert
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 08/47] socket shutdown Dr. David Alan Gilbert (git)
2014-10-04 18:09 ` Paolo Bonzini
2014-10-07 10:00 ` Dr. David Alan Gilbert
2014-10-07 11:10 ` Paolo Bonzini
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 09/47] Provide runtime Target page information Dr. David Alan Gilbert (git)
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 10/47] Return path: Open a return path on QEMUFile for sockets Dr. David Alan Gilbert (git)
2014-11-03 3:05 ` David Gibson
2014-11-03 19:04 ` Dr. David Alan Gilbert
2014-11-18 4:34 ` David Gibson
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 11/47] Return path: socket_writev_buffer: Block even on non-blocking fd's Dr. David Alan Gilbert (git)
2014-11-03 3:10 ` David Gibson
2014-11-03 18:59 ` Dr. David Alan Gilbert
2014-11-18 3:54 ` David Gibson
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 12/47] Handle bi-directional communication for fd migration Dr. David Alan Gilbert (git)
2014-11-03 3:12 ` David Gibson
2014-11-03 13:53 ` Cristian Klein
2014-11-18 3:53 ` David Gibson
2014-11-19 17:27 ` Dr. David Alan Gilbert
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 13/47] Migration commands Dr. David Alan Gilbert (git)
2014-11-03 3:14 ` David Gibson
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 14/47] Return path: Control commands Dr. David Alan Gilbert (git)
2014-10-04 18:08 ` Paolo Bonzini
2014-10-23 16:23 ` Dr. David Alan Gilbert
2014-10-23 20:15 ` Paolo Bonzini
2014-11-03 3:20 ` David Gibson
2014-11-04 18:58 ` Dr. David Alan Gilbert
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 15/47] Return path: Send responses from destination to source Dr. David Alan Gilbert (git)
2014-11-03 3:22 ` David Gibson
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 16/47] Return path: Source handling of return path Dr. David Alan Gilbert (git)
2014-10-04 18:14 ` Paolo Bonzini
2014-10-23 18:00 ` Dr. David Alan Gilbert
2014-10-24 10:04 ` Paolo Bonzini
2014-10-16 8:26 ` zhanghailiang
2014-10-16 8:35 ` Dr. David Alan Gilbert
2014-10-16 9:09 ` zhanghailiang
2014-11-03 3:47 ` David Gibson
2014-11-25 15:44 ` Dr. David Alan Gilbert
2014-11-03 3:46 ` David Gibson
2014-11-03 13:22 ` Dr. David Alan Gilbert
2014-11-18 3:52 ` David Gibson
2014-11-19 17:06 ` Dr. David Alan Gilbert
2014-11-19 21:12 ` David Gibson
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 17/47] qemu_loadvm errors and debug Dr. David Alan Gilbert (git)
2014-11-03 3:49 ` David Gibson
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 18/47] ram_debug_dump_bitmap: Dump a migration bitmap as text Dr. David Alan Gilbert (git)
2014-11-03 3:58 ` David Gibson
2014-11-19 17:35 ` Dr. David Alan Gilbert
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 19/47] Rework loadvm path for subloops Dr. David Alan Gilbert (git)
2014-10-04 16:46 ` Paolo Bonzini
2014-10-07 8:58 ` Dr. David Alan Gilbert
2014-10-07 10:12 ` Paolo Bonzini
2014-10-07 10:21 ` Dr. David Alan Gilbert
2014-11-03 5:08 ` David Gibson
2014-11-19 17:50 ` Dr. David Alan Gilbert
2014-11-21 6:53 ` David Gibson
2014-12-11 14:47 ` Dr. David Alan Gilbert
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 20/47] Add migration-capability boolean for postcopy-ram Dr. David Alan Gilbert (git)
2014-10-06 18:59 ` Eric Blake
2014-10-06 19:07 ` Dr. David Alan Gilbert
2014-10-03 17:47 ` Dr. David Alan Gilbert (git) [this message]
2014-11-03 5:51 ` [Qemu-devel] [PATCH v4 21/47] Add wrappers and handlers for sending/receiving the postcopy-ram migration messages David Gibson
2014-12-17 14:50 ` Dr. David Alan Gilbert
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 22/47] QEMU_VM_CMD_PACKAGED: Send a packaged chunk of migration stream Dr. David Alan Gilbert (git)
2014-11-04 1:28 ` David Gibson
2014-11-04 10:19 ` Dr. David Alan Gilbert
2014-11-18 4:36 ` David Gibson
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 23/47] migrate_init: Call from savevm Dr. David Alan Gilbert (git)
2014-10-08 2:28 ` zhanghailiang
2014-11-04 1:29 ` David Gibson
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 24/47] Allow savevm handlers to state whether they could go into postcopy Dr. David Alan Gilbert (git)
2014-11-04 1:33 ` David Gibson
2014-11-19 17:53 ` Dr. David Alan Gilbert
2014-11-21 6:58 ` David Gibson
2014-11-25 19:58 ` Dr. David Alan Gilbert
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 25/47] postcopy: OS support test Dr. David Alan Gilbert (git)
2014-11-04 1:40 ` David Gibson
2014-11-25 17:34 ` Dr. David Alan Gilbert
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 26/47] migrate_start_postcopy: Command to trigger transition to postcopy Dr. David Alan Gilbert (git)
2014-11-04 1:47 ` David Gibson
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 27/47] MIG_STATE_POSTCOPY_ACTIVE: Add new migration state Dr. David Alan Gilbert (git)
2014-11-04 1:49 ` David Gibson
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 28/47] qemu_savevm_state_complete: Postcopy changes Dr. David Alan Gilbert (git)
2014-11-04 2:18 ` David Gibson
2014-12-17 16:14 ` Dr. David Alan Gilbert
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 29/47] Postcopy page-map-incoming (PMI) structure Dr. David Alan Gilbert (git)
2014-11-04 3:09 ` David Gibson
2014-11-19 18:46 ` Dr. David Alan Gilbert
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 30/47] Postcopy: Maintain sentmap and calculate discard Dr. David Alan Gilbert (git)
2014-11-05 6:38 ` David Gibson
2014-12-17 16:48 ` Dr. David Alan Gilbert
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 31/47] postcopy: Incoming initialisation Dr. David Alan Gilbert (git)
2014-11-05 6:47 ` David Gibson
2014-12-17 17:21 ` Dr. David Alan Gilbert
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 32/47] postcopy: ram_enable_notify to switch on userfault Dr. David Alan Gilbert (git)
2014-10-04 16:42 ` Paolo Bonzini
2014-10-06 19:00 ` Dr. David Alan Gilbert
2014-11-05 6:49 ` David Gibson
2014-11-19 18:59 ` Dr. David Alan Gilbert
2014-11-19 21:17 ` David Gibson
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 33/47] Postcopy: Postcopy startup in migration thread Dr. David Alan Gilbert (git)
2014-10-04 16:27 ` Paolo Bonzini
2014-11-20 11:45 ` Dr. David Alan Gilbert
2014-11-21 12:01 ` Paolo Bonzini
2014-11-21 12:07 ` Dr. David Alan Gilbert
2014-11-20 17:12 ` Dr. David Alan Gilbert
2014-11-20 17:19 ` Paolo Bonzini
2014-11-24 18:26 ` Dr. David Alan Gilbert
2014-11-10 6:05 ` David Gibson
2015-01-05 16:06 ` Dr. David Alan Gilbert
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 34/47] Postcopy: Create a fault handler thread before marking the ram as userfault Dr. David Alan Gilbert (git)
2014-11-10 6:10 ` David Gibson
2014-11-19 18:56 ` Dr. David Alan Gilbert
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 35/47] Page request: Add MIG_RPCOMM_REQPAGES reverse command Dr. David Alan Gilbert (git)
2014-11-10 6:19 ` David Gibson
2014-11-19 20:01 ` Dr. David Alan Gilbert
2014-11-19 21:48 ` David Gibson
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 36/47] Page request: Process incoming page request Dr. David Alan Gilbert (git)
2014-10-08 2:31 ` zhanghailiang
2014-10-08 7:49 ` Dr. David Alan Gilbert
2014-10-08 8:07 ` Paolo Bonzini
2014-10-08 8:10 ` zhanghailiang
2014-10-08 8:18 ` Dr. David Alan Gilbert
2014-11-10 6:31 ` David Gibson
2014-11-17 19:07 ` Dr. David Alan Gilbert
2014-11-18 4:38 ` David Gibson
2014-11-19 19:37 ` Dr. David Alan Gilbert
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 37/47] Page request: Consume pages off the post-copy queue Dr. David Alan Gilbert (git)
2014-10-04 18:04 ` Paolo Bonzini
2014-10-07 11:35 ` Dr. David Alan Gilbert
2014-11-11 1:13 ` David Gibson
2015-01-14 20:13 ` Dr. David Alan Gilbert
2015-01-27 4:38 ` David Gibson
2015-01-27 9:40 ` Dr. David Alan Gilbert
2015-01-28 5:33 ` David Gibson
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 38/47] Add assertion to check migration_dirty_pages Dr. David Alan Gilbert (git)
2014-10-04 18:32 ` Paolo Bonzini
2014-10-06 18:51 ` Dr. David Alan Gilbert
2014-10-06 20:30 ` Paolo Bonzini
2014-11-11 1:14 ` David Gibson
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 39/47] postcopy_ram.c: place_page and helpers Dr. David Alan Gilbert (git)
2014-11-11 1:39 ` David Gibson
2015-01-15 18:14 ` Dr. David Alan Gilbert
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 40/47] Postcopy: Use helpers to map pages during migration Dr. David Alan Gilbert (git)
2014-11-13 2:53 ` David Gibson
2014-11-25 18:14 ` Dr. David Alan Gilbert
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 41/47] qemu_ram_block_from_host Dr. David Alan Gilbert (git)
2014-11-13 2:59 ` David Gibson
2014-11-25 18:55 ` Dr. David Alan Gilbert
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 42/47] Don't sync dirty bitmaps in postcopy Dr. David Alan Gilbert (git)
2014-11-13 3:01 ` David Gibson
2014-11-25 16:25 ` Dr. David Alan Gilbert
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 43/47] Host page!=target page: Cleanup bitmaps Dr. David Alan Gilbert (git)
2014-11-13 3:10 ` David Gibson
2014-12-17 18:21 ` Dr. David Alan Gilbert
2015-01-27 4:50 ` David Gibson
2015-01-27 10:04 ` Dr. David Alan Gilbert
2015-01-28 5:36 ` David Gibson
2015-01-27 10:20 ` Peter Maydell
2015-01-27 11:50 ` Dr. David Alan Gilbert
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 44/47] Postcopy; Handle userfault requests Dr. David Alan Gilbert (git)
2014-11-13 3:23 ` David Gibson
2015-01-05 17:13 ` Dr. David Alan Gilbert
2015-01-27 4:33 ` David Gibson
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 45/47] Start up a postcopy/listener thread ready for incoming page data Dr. David Alan Gilbert (git)
2014-11-13 3:29 ` David Gibson
2014-11-19 19:40 ` Dr. David Alan Gilbert
2014-11-21 8:36 ` David Gibson
2014-11-21 10:17 ` Dr. David Alan Gilbert
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 46/47] postcopy: Wire up loadvm_postcopy_ram_handle_{run, end} commands Dr. David Alan Gilbert (git)
2014-10-04 17:51 ` Paolo Bonzini
2014-10-23 12:18 ` Dr. David Alan Gilbert
2014-10-03 17:47 ` [Qemu-devel] [PATCH v4 47/47] End of migration for postcopy Dr. David Alan Gilbert (git)
2014-10-04 17:49 ` Paolo Bonzini
2014-10-23 14:24 ` Dr. David Alan Gilbert
2014-10-04 18:31 ` Paolo Bonzini
2014-10-07 10:29 ` Dr. David Alan Gilbert
2014-10-07 11:12 ` Paolo Bonzini
2014-10-03 19:21 ` [Qemu-devel] [PATCH v4 00/47] Postcopy implementation Dr. David Alan Gilbert
2014-10-07 2:27 ` Cristian Klein
2014-10-07 8:12 ` Dr. David Alan Gilbert
2014-10-08 8:36 ` Cristian Klein
2014-11-21 3:48 ` zhanghailiang
2014-11-21 10:14 ` Dr. David Alan Gilbert
2014-11-24 8:10 ` zhanghailiang
2014-11-21 18:56 ` Andrea Arcangeli
2014-11-24 8:25 ` zhanghailiang
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=1412358473-31398-22-git-send-email-dgilbert@redhat.com \
--to=dgilbert@redhat.com \
--cc=aarcange@redhat.com \
--cc=amit.shah@redhat.com \
--cc=cristian.klein@cs.umu.se \
--cc=lilei@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=yamahata@private.email.ne.jp \
--cc=yanghy@cn.fujitsu.com \
/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).