@@ -1762,6 +1762,49 @@ int ram_copy_page(RAMBlock *block, unsigned long page_nr,
return 1;
}
+/**
+ * ram_process_page_fault
+ *
+ * Used in the background snapshot to queue the copy of the memory
+ * page for writing.
+ *
+ * Returns:
+ * 0 > - on error
+ * 0 - success
+ *
+ * @address: guest address
+ *
+ */
+int ram_process_page_fault(void *address)
+{
+ int ret;
+ void *page_copy = NULL;
+ unsigned long page_nr;
+ ram_addr_t offset;
+
+ RAMBlock *block = ram_bgs_block_find(address, &offset);
+
+ if (!block) {
+ return -1;
+ }
+
+ page_nr = offset >> TARGET_PAGE_BITS;
+
+ ret = ram_copy_page(block, page_nr, &page_copy);
+
+ if (ret < 0) {
+ return ret;
+ } else if (ret > 0) {
+ if (ram_save_queue_pages(block, NULL, offset,
+ TARGET_PAGE_SIZE, page_copy)) {
+ ram_page_buffer_free(page_copy);
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
/**
* ram_find_and_save_block: finds a dirty page and sends it to f
*
@@ -76,4 +76,5 @@ int ram_block_list_set_readonly(void);
int ram_block_list_set_writable(void);
int ram_copy_page(RAMBlock *block, unsigned long page_nr, void **page_copy);
+int ram_process_page_fault(void *address);
#endif
The handler does all the necessary operations to save the page being accessed to the snapshot file(stream). Signed-off-by: Denis Plotnikov <dplotnikov@virtuozzo.com> --- migration/ram.c | 43 +++++++++++++++++++++++++++++++++++++++++++ migration/ram.h | 1 + 2 files changed, 44 insertions(+)