|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH v19 for-4.14 01/13] x86/mem_sharing: block interrupt injection for forks
> -----Original Message-----
> From: Xen-devel <xen-devel-bounces@xxxxxxxxxxxxxxxxxxxx> On Behalf Of Tamas K
> Lengyel
> Sent: 01 June 2020 14:22
> To: xen-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: Kevin Tian <kevin.tian@xxxxxxxxx>; Stefano Stabellini
> <sstabellini@xxxxxxxxxx>; Tamas K Lengyel
> <tamas.lengyel@xxxxxxxxx>; Jun Nakajima <jun.nakajima@xxxxxxxxx>; Wei Liu
> <wl@xxxxxxx>; Andrew Cooper
> <andrew.cooper3@xxxxxxxxxx>; Ian Jackson <ian.jackson@xxxxxxxxxxxxx>; George
> Dunlap
> <george.dunlap@xxxxxxxxxx>; Tamas K Lengyel <tamas@xxxxxxxxxxxxx>; Jan
> Beulich <jbeulich@xxxxxxxx>;
> Julien Grall <julien@xxxxxxx>; Roger Pau Monné <roger.pau@xxxxxxxxxx>
> Subject: [PATCH v19 for-4.14 01/13] x86/mem_sharing: block interrupt
> injection for forks
>
> When running VM forks without device models (QEMU), it may
> be undesirable for Xen to inject interrupts. When creating such forks from
> Windows VMs we have observed the kernel trying to process interrupts
> immediately after the fork is executed. However without QEMU running such
> interrupt handling may not be possible because it may attempt to interact with
> devices that are not emulated by a backend. In the best case scenario such
> interrupt handling would only present a detour in the VM forks' execution
> flow, but in the worst case as we actually observed can completely stall it.
> By disabling interrupt injection a fuzzer can exercise the target code without
> interference. For other use-cases this option probably doesn't make sense,
> that's why this is not enabled by default.
>
> Forks & memory sharing are only available on Intel CPUs so this only applies
> to vmx. Note that this is part of the experimental VM forking feature that's
> completely disabled by default and can only be enabled by using
> XEN_CONFIG_EXPERT during compile time.
>
> Signed-off-by: Tamas K Lengyel <tamas.lengyel@xxxxxxxxx>
> Reviewed-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
Release-acked-by: Paul Durrant <paul@xxxxxxx>
> ---
> xen/arch/x86/hvm/vmx/intr.c | 6 ++++++
> xen/arch/x86/mm/mem_sharing.c | 6 +++++-
> xen/include/asm-x86/hvm/domain.h | 2 +-
> xen/include/public/memory.h | 3 +++
> 4 files changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/xen/arch/x86/hvm/vmx/intr.c b/xen/arch/x86/hvm/vmx/intr.c
> index 000e14af49..80bfbb4787 100644
> --- a/xen/arch/x86/hvm/vmx/intr.c
> +++ b/xen/arch/x86/hvm/vmx/intr.c
> @@ -256,6 +256,12 @@ void vmx_intr_assist(void)
> if ( unlikely(v->arch.vm_event) && v->arch.vm_event->sync_event )
> return;
>
> +#ifdef CONFIG_MEM_SHARING
> + /* Block event injection for VM fork if requested */
> + if ( unlikely(v->domain->arch.hvm.mem_sharing.block_interrupts) )
> + return;
> +#endif
> +
> /* Crank the handle on interrupt state. */
> pt_vector = pt_update_irq(v);
>
> diff --git a/xen/arch/x86/mm/mem_sharing.c b/xen/arch/x86/mm/mem_sharing.c
> index 19922ab5d1..c428fd16ce 100644
> --- a/xen/arch/x86/mm/mem_sharing.c
> +++ b/xen/arch/x86/mm/mem_sharing.c
> @@ -2106,7 +2106,8 @@ int
> mem_sharing_memop(XEN_GUEST_HANDLE_PARAM(xen_mem_sharing_op_t) arg)
> rc = -EINVAL;
> if ( mso.u.fork.pad )
> goto out;
> - if ( mso.u.fork.flags & ~XENMEM_FORK_WITH_IOMMU_ALLOWED )
> + if ( mso.u.fork.flags &
> + ~(XENMEM_FORK_WITH_IOMMU_ALLOWED |
> XENMEM_FORK_BLOCK_INTERRUPTS) )
> goto out;
>
> rc = rcu_lock_live_remote_domain_by_id(mso.u.fork.parent_domain,
> @@ -2134,6 +2135,9 @@ int
> mem_sharing_memop(XEN_GUEST_HANDLE_PARAM(xen_mem_sharing_op_t) arg)
> rc = hypercall_create_continuation(__HYPERVISOR_memory_op,
> "lh", XENMEM_sharing_op,
> arg);
> + else if ( !rc && (mso.u.fork.flags & XENMEM_FORK_BLOCK_INTERRUPTS) )
> + d->arch.hvm.mem_sharing.block_interrupts = true;
> +
> rcu_unlock_domain(pd);
> break;
> }
> diff --git a/xen/include/asm-x86/hvm/domain.h
> b/xen/include/asm-x86/hvm/domain.h
> index 95fe18cddc..9d247baf4d 100644
> --- a/xen/include/asm-x86/hvm/domain.h
> +++ b/xen/include/asm-x86/hvm/domain.h
> @@ -67,7 +67,7 @@ struct hvm_ioreq_server {
> #ifdef CONFIG_MEM_SHARING
> struct mem_sharing_domain
> {
> - bool enabled;
> + bool enabled, block_interrupts;
>
> /*
> * When releasing shared gfn's in a preemptible manner, recall where
> diff --git a/xen/include/public/memory.h b/xen/include/public/memory.h
> index dbd35305df..850bd72c52 100644
> --- a/xen/include/public/memory.h
> +++ b/xen/include/public/memory.h
> @@ -536,7 +536,10 @@ struct xen_mem_sharing_op {
> } debug;
> struct mem_sharing_op_fork { /* OP_FORK */
> domid_t parent_domain; /* IN: parent's domain id */
> +/* Only makes sense for short-lived forks */
> #define XENMEM_FORK_WITH_IOMMU_ALLOWED (1u << 0)
> +/* Only makes sense for short-lived forks */
> +#define XENMEM_FORK_BLOCK_INTERRUPTS (1u << 1)
> uint16_t flags; /* IN: optional settings */
> uint32_t pad; /* Must be set to 0 */
> } fork;
> --
> 2.25.1
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |