From: Tamas K Lengyel <tamas.lengyel@intel.com>
To: xen-devel@lists.xenproject.org
Cc: "Petre Pircalabu" <ppircalabu@bitdefender.com>,
"Tamas K Lengyel" <tamas@tklengyel.com>,
"Tamas K Lengyel" <tamas.lengyel@intel.com>,
"Wei Liu" <wl@xen.org>,
"Konrad Rzeszutek Wilk" <konrad.wilk@oracle.com>,
"George Dunlap" <george.dunlap@eu.citrix.com>,
"Andrew Cooper" <andrew.cooper3@citrix.com>,
"Ian Jackson" <ian.jackson@eu.citrix.com>,
"Anthony PERARD" <anthony.perard@citrix.com>,
"Stefano Stabellini" <sstabellini@kernel.org>,
"Jan Beulich" <jbeulich@suse.com>,
"Alexandru Isaila" <aisaila@bitdefender.com>,
"Julien Grall" <julien@xen.org>,
"Roger Pau Monné" <roger.pau@citrix.com>
Subject: [Xen-devel] [PATCH v2 00/20] VM forking
Date: Wed, 18 Dec 2019 11:40:37 -0800 [thread overview]
Message-ID: <cover.1576697796.git.tamas.lengyel@intel.com> (raw)
The following series implements VM forking for Intel HVM guests to allow for
the fast creation of identical VMs without the assosciated high startup costs
of booting or restoring the VM from a savefile.
JIRA issue: https://xenproject.atlassian.net/browse/XEN-89
The main design goal with this series has been to reduce the time of creating
the VM fork as much as possible. To achieve this the VM forking process is
split into two steps:
1) forking the VM on the hypervisor side;
2) starting QEMU to handle the backed for emulated devices.
Step 1) involves creating a VM using the new "xl fork-vm" command. The
parent VM is expected to remain paused after forks are created from it (which
is different then what process forking normally entails). During this forking
operation the HVM context and VM settings are copied over to the new forked VM.
This operation is fast and it allows the forked VM to be unpaused and to be
monitored and accessed via VMI. Note however that without its device model
running (depending on what is executing in the VM) it is bound to
misbehave/crash when its trying to access devices that would be emulated by
QEMU. We anticipate that for certain use-cases this would be an acceptable
situation, in case for example when fuzzing is performed of code segments that
don't access such devices.
Step 2) involves launching QEMU to support the forked VM, which requires the
QEMU Xen savefile to be generated manually from the parent VM. This can be
accomplished simply by connecting to its QMP socket and issuing the
"xen-save-devices-state" command as documented by QEMU:
https://github.com/qemu/qemu/blob/master/docs/xen-save-devices-state.txt
Once the QEMU Xen savefile is generated the new "xl fork-launch-dm" command is
used to launch QEMU and load the specified savefile for it.
At runtime the forked VM starts running with an empty p2m which gets lazily
populated when the VM generates EPT faults, similar to how altp2m views are
populated. If the memory access is a read-only access, the p2m entry is
populated with a memory shared entry with its parent. For write memory accesses
or in case memory sharing wasn't possible (for example in case a reference is
held by a third party), a new page is allocated and the page contents are
copied over from the parent VM. Forks can be further forked if needed, thus
allowing for further memory savings.
A VM fork reset hypercall is also added that allows the fork to be reset to the
state it was just after a fork. This is an optimization for cases where the
forks are very short-lived and run without a device model, so resetting saves
some time compared to creating a brand new fork.
The series has been tested with both Linux and Windows VMs and functions as
expected. VM forking time has been measured to be 0.018s, device model launch
to be around 1s depending largely on the number of devices being emulated.
Patches 1-2 implement changes to existing internal Xen APIs to make VM forking
possible.
Patches 3-4 are simple code-formatting fixes for the toolstack and Xen for the
memory sharing paths with no functional changes.
Patches 5-16 are code-cleanups and adjustments of to Xen memory sharing
subsystem with no functional changes.
Patch 17 adds the hypervisor-side code implementing VM forking.
Patch 18 is integration of mem_access with forked VMs.
Patch 19 implements the VM fork reset operation hypervisor side bits.
Patch 20 adds the toolstack-side code implementing VM forking and reset.
Tamas K Lengyel (20):
x86: make hvm_{get/set}_param accessible
xen/x86: Make hap_get_allocation accessible
tools/libxc: clean up memory sharing files
x86/mem_sharing: cleanup code and comments in various locations
x86/mem_sharing: make get_two_gfns take locks conditionally
x86/mem_sharing: drop flags from mem_sharing_unshare_page
x86/mem_sharing: don't try to unshare twice during page fault
x86/mem_sharing: define mem_sharing_domain to hold some scattered
variables
x86/mem_sharing: Use INVALID_MFN and p2m_is_shared in
relinquish_shared_pages
x86/mem_sharing: Make add_to_physmap static and shorten name
x86/mem_sharing: Convert MEM_SHARING_DESTROY_GFN to a bool
x86/mem_sharing: Replace MEM_SHARING_DEBUG with gdprintk
x86/mem_sharing: ASSERT that p2m_set_entry succeeds
x86/mem_sharing: Enable mem_sharing on first memop
x86/mem_sharing: Skip xen heap pages in memshr nominate
x86/mem_sharing: check page type count earlier
xen/mem_sharing: VM forking
xen/mem_access: Use __get_gfn_type_access in set_mem_access
x86/mem_sharing: reset a fork
xen/tools: VM forking toolstack side
tools/libxc/include/xenctrl.h | 30 +-
tools/libxc/xc_memshr.c | 34 +-
tools/libxl/libxl.h | 7 +
tools/libxl/libxl_create.c | 237 +++++---
tools/libxl/libxl_dm.c | 2 +-
tools/libxl/libxl_dom.c | 83 ++-
tools/libxl/libxl_internal.h | 1 +
tools/libxl/libxl_types.idl | 1 +
tools/xl/xl.h | 5 +
tools/xl/xl_cmdtable.c | 22 +
tools/xl/xl_saverestore.c | 96 ++++
tools/xl/xl_vmcontrol.c | 8 +
xen/arch/x86/hvm/hvm.c | 206 ++++---
xen/arch/x86/mm/hap/hap.c | 3 +-
xen/arch/x86/mm/mem_access.c | 5 +-
xen/arch/x86/mm/mem_sharing.c | 875 +++++++++++++++++++++---------
xen/arch/x86/mm/p2m.c | 34 +-
xen/common/memory.c | 2 +-
xen/drivers/passthrough/pci.c | 3 +-
xen/include/asm-x86/hap.h | 1 +
xen/include/asm-x86/hvm/domain.h | 6 +-
xen/include/asm-x86/hvm/hvm.h | 4 +
xen/include/asm-x86/mem_sharing.h | 84 ++-
xen/include/asm-x86/p2m.h | 14 +-
xen/include/public/memory.h | 6 +
xen/include/xen/sched.h | 1 +
26 files changed, 1258 insertions(+), 512 deletions(-)
--
2.20.1
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
next reply other threads:[~2019-12-18 19:41 UTC|newest]
Thread overview: 96+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-18 19:40 Tamas K Lengyel [this message]
2019-12-18 19:40 ` [Xen-devel] [PATCH v2 01/20] x86: make hvm_{get/set}_param accessible Tamas K Lengyel
2019-12-19 19:07 ` Andrew Cooper
2019-12-19 19:38 ` Tamas K Lengyel
2019-12-19 19:40 ` Andrew Cooper
2019-12-19 19:49 ` Tamas K Lengyel
2019-12-19 19:57 ` Andrew Cooper
2019-12-19 20:09 ` Tamas K Lengyel
2019-12-20 16:46 ` Jan Beulich
2019-12-20 17:27 ` Tamas K Lengyel
2019-12-20 17:32 ` Andrew Cooper
2019-12-20 17:36 ` Tamas K Lengyel
2019-12-20 17:46 ` Andrew Cooper
2019-12-20 17:50 ` Tamas K Lengyel
2019-12-20 18:00 ` Andrew Cooper
2019-12-20 18:05 ` Tamas K Lengyel
2019-12-23 9:37 ` Jan Beulich
2019-12-23 14:55 ` Tamas K Lengyel
2019-12-27 8:02 ` Jan Beulich
2019-12-27 13:10 ` Tamas K Lengyel
2019-12-27 13:44 ` Jan Beulich
2019-12-27 14:06 ` Tamas K Lengyel
2019-12-18 19:40 ` [Xen-devel] [PATCH v2 02/20] xen/x86: Make hap_get_allocation accessible Tamas K Lengyel
2019-12-19 19:08 ` Andrew Cooper
2019-12-20 16:48 ` Jan Beulich
2019-12-18 19:40 ` [Xen-devel] [PATCH v2 03/20] tools/libxc: clean up memory sharing files Tamas K Lengyel
2019-12-18 19:40 ` [Xen-devel] [PATCH v2 04/20] x86/mem_sharing: cleanup code and comments in various locations Tamas K Lengyel
2019-12-19 11:18 ` Andrew Cooper
2019-12-19 16:20 ` Tamas K Lengyel
2019-12-19 16:21 ` Tamas K Lengyel
2019-12-19 18:51 ` Andrew Cooper
2019-12-19 19:26 ` Tamas K Lengyel
2019-12-18 19:40 ` [Xen-devel] [PATCH v2 05/20] x86/mem_sharing: make get_two_gfns take locks conditionally Tamas K Lengyel
2019-12-19 19:12 ` Andrew Cooper
2019-12-18 19:40 ` [Xen-devel] [PATCH v2 06/20] x86/mem_sharing: drop flags from mem_sharing_unshare_page Tamas K Lengyel
2019-12-18 19:40 ` [Xen-devel] [PATCH v2 07/20] x86/mem_sharing: don't try to unshare twice during page fault Tamas K Lengyel
2019-12-19 19:19 ` Andrew Cooper
2019-12-18 19:40 ` [Xen-devel] [PATCH v2 08/20] x86/mem_sharing: define mem_sharing_domain to hold some scattered variables Tamas K Lengyel
2019-12-18 19:40 ` [Xen-devel] [PATCH v2 09/20] x86/mem_sharing: Use INVALID_MFN and p2m_is_shared in relinquish_shared_pages Tamas K Lengyel
2019-12-18 19:40 ` [Xen-devel] [PATCH v2 10/20] x86/mem_sharing: Make add_to_physmap static and shorten name Tamas K Lengyel
2019-12-18 19:40 ` [Xen-devel] [PATCH v2 11/20] x86/mem_sharing: Convert MEM_SHARING_DESTROY_GFN to a bool Tamas K Lengyel
2019-12-18 21:29 ` Julien Grall
2019-12-18 22:19 ` Tamas K Lengyel
2019-12-18 19:40 ` [Xen-devel] [PATCH v2 12/20] x86/mem_sharing: Replace MEM_SHARING_DEBUG with gdprintk Tamas K Lengyel
2019-12-18 19:40 ` [Xen-devel] [PATCH v2 13/20] x86/mem_sharing: ASSERT that p2m_set_entry succeeds Tamas K Lengyel
2019-12-18 19:40 ` [Xen-devel] [PATCH v2 14/20] x86/mem_sharing: Enable mem_sharing on first memop Tamas K Lengyel
2019-12-18 19:40 ` [Xen-devel] [PATCH v2 15/20] x86/mem_sharing: Skip xen heap pages in memshr nominate Tamas K Lengyel
2019-12-18 19:40 ` [Xen-devel] [PATCH v2 16/20] x86/mem_sharing: check page type count earlier Tamas K Lengyel
2019-12-18 19:40 ` [Xen-devel] [PATCH v2 17/20] xen/mem_sharing: VM forking Tamas K Lengyel
2019-12-18 19:40 ` [Xen-devel] [PATCH v2 18/20] xen/mem_access: Use __get_gfn_type_access in set_mem_access Tamas K Lengyel
2019-12-19 7:59 ` Alexandru Stefan ISAILA
2019-12-19 16:00 ` Tamas K Lengyel
2019-12-18 19:40 ` [Xen-devel] [PATCH v2 19/20] x86/mem_sharing: reset a fork Tamas K Lengyel
2019-12-18 22:00 ` Julien Grall
2019-12-18 22:33 ` Tamas K Lengyel
2019-12-18 23:01 ` Julien Grall
2019-12-19 0:15 ` Tamas K Lengyel
2019-12-19 7:45 ` Julien Grall
2019-12-19 16:11 ` Tamas K Lengyel
2019-12-19 16:57 ` Julien Grall
2019-12-19 17:23 ` Tamas K Lengyel
2019-12-19 17:38 ` Julien Grall
2019-12-19 18:00 ` Tamas K Lengyel
2019-12-19 11:06 ` Jan Beulich
2019-12-19 16:02 ` Tamas K Lengyel
2019-12-18 19:40 ` [Xen-devel] [PATCH v2 20/20] xen/tools: VM forking toolstack side Tamas K Lengyel
2019-12-19 9:48 ` [Xen-devel] [PATCH v2 00/20] VM forking Roger Pau Monné
2019-12-19 15:58 ` Tamas K Lengyel
2019-12-30 17:59 ` Roger Pau Monné
2019-12-30 18:15 ` Tamas K Lengyel
2019-12-30 18:43 ` Julien Grall
2019-12-30 20:46 ` Tamas K Lengyel
2019-12-31 0:20 ` Julien Grall
2019-12-31 0:37 ` Tamas K Lengyel
2019-12-31 10:40 ` Roger Pau Monné
2019-12-31 15:00 ` Tamas K Lengyel
2019-12-31 15:11 ` Roger Pau Monné
2019-12-31 16:08 ` Tamas K Lengyel
2019-12-31 16:36 ` Tamas K Lengyel
2020-01-08 9:42 ` Julien Grall
2020-01-08 15:08 ` Roger Pau Monné
2020-01-08 15:32 ` Tamas K Lengyel
2020-01-08 18:00 ` Roger Pau Monné
2020-01-08 18:14 ` Tamas K Lengyel
2020-01-08 18:23 ` Tamas K Lengyel
2020-01-08 18:44 ` Roger Pau Monné
2020-01-08 19:47 ` Tamas K Lengyel
2020-01-08 18:36 ` Roger Pau Monné
2020-01-08 19:51 ` Tamas K Lengyel
2020-01-09 9:47 ` Roger Pau Monné
2020-01-09 13:31 ` Tamas K Lengyel
2020-01-08 16:34 ` George Dunlap
2020-01-08 17:06 ` Tamas K Lengyel
2020-01-08 17:16 ` George Dunlap
2020-01-08 17:25 ` Tamas K Lengyel
2020-01-08 18:07 ` Roger Pau Monné
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=cover.1576697796.git.tamas.lengyel@intel.com \
--to=tamas.lengyel@intel.com \
--cc=aisaila@bitdefender.com \
--cc=andrew.cooper3@citrix.com \
--cc=anthony.perard@citrix.com \
--cc=george.dunlap@eu.citrix.com \
--cc=ian.jackson@eu.citrix.com \
--cc=jbeulich@suse.com \
--cc=julien@xen.org \
--cc=konrad.wilk@oracle.com \
--cc=ppircalabu@bitdefender.com \
--cc=roger.pau@citrix.com \
--cc=sstabellini@kernel.org \
--cc=tamas@tklengyel.com \
--cc=wl@xen.org \
--cc=xen-devel@lists.xenproject.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.