From nobody Sat Feb 7 15:29:30 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=virtuozzo.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1531928865684378.4401547800313; Wed, 18 Jul 2018 08:47:45 -0700 (PDT) Received: from localhost ([::1]:37283 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ffog4-0008Az-NW for importer@patchew.org; Wed, 18 Jul 2018 11:47:44 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52982) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ffoal-0003Hs-Km for qemu-devel@nongnu.org; Wed, 18 Jul 2018 11:42:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ffoag-0000HV-HU for qemu-devel@nongnu.org; Wed, 18 Jul 2018 11:42:15 -0400 Received: from relay.sw.ru ([185.231.240.75]:36406) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ffoag-0000Fu-4c for qemu-devel@nongnu.org; Wed, 18 Jul 2018 11:42:10 -0400 Received: from vz-out.virtuozzo.com ([185.231.240.5] helo=dptest2.qa.sw.ru) by relay.sw.ru with esmtp (Exim 4.90_1) (envelope-from ) id 1ffoae-0006bu-Ma; Wed, 18 Jul 2018 18:42:08 +0300 From: Denis Plotnikov To: dgilbert@redhat.com, quintela@redhat.com, pbonzini@redhat.com Date: Wed, 18 Jul 2018 18:41:56 +0300 Message-Id: <20180718154200.26777-14-dplotnikov@virtuozzo.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180718154200.26777-1-dplotnikov@virtuozzo.com> References: <20180718154200.26777-1-dplotnikov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 185.231.240.75 Subject: [Qemu-devel] [PATCH v1 13/17] background snapshot: add write-protected page access handler function X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The handler does all the necessary operations to save the page being accessed to the snapshot file(stream). Signed-off-by: Denis Plotnikov --- migration/ram.c | 43 +++++++++++++++++++++++++++++++++++++++++++ migration/ram.h | 1 + 2 files changed, 44 insertions(+) diff --git a/migration/ram.c b/migration/ram.c index b1623e96e7..04a4bf708d 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -1762,6 +1762,49 @@ int ram_copy_page(RAMBlock *block, unsigned long pag= e_nr, return 1; } =20 +/** + * 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 =3D NULL; + unsigned long page_nr; + ram_addr_t offset; + + RAMBlock *block =3D ram_bgs_block_find(address, &offset); + + if (!block) { + return -1; + } + + page_nr =3D offset >> TARGET_PAGE_BITS; + + ret =3D 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 * diff --git a/migration/ram.h b/migration/ram.h index 76ab0a3377..2b565ce620 100644 --- a/migration/ram.h +++ b/migration/ram.h @@ -76,4 +76,5 @@ int ram_block_list_set_readonly(void); int ram_block_list_set_writable(void); =20 int ram_copy_page(RAMBlock *block, unsigned long page_nr, void **page_copy= ); +int ram_process_page_fault(void *address); #endif --=20 2.17.0