Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1661891

[PATCH] KVM: async_pf: avoid async pf injection when in guest mode

Path csiph.com!news.freedyn.net!open-news-network.org!aioe.org!bofh.it!news.nic.it!robomod
From Wanpeng Li <kernellwp@gmail.com>
Newsgroups linux.kernel
Subject [PATCH] KVM: async_pf: avoid async pf injection when in guest mode
Date Fri, 09 Jun 2017 05:20:02 +0200
Message-ID <tQiCS-4Bd-11@gated-at.bofh.it> (permalink)
X-Original-To linux-kernel@vger.kernel.org, kvm@vger.kernel.org
Dkim-Signature v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=EFx3wok1teiiqsqrE3zIe0nBuP5IdNXT8yWo617EYTE=; b=DK2cC3HXhi3XmqIY8OZQQnv+a8/hF77ITh4SmGjJtEyZfmtOpr2hFAcaWJ6O8SpXbk vwatrzKTGFJaNZbLQlp9EX9cw6fRxJUglH0IXAhCDWw6KE312bnkl6YYTnkth2SS2b9u GqTCBGmShR5cDSUjxe/x/jLFtHtyetXSPtuWS/Z2MKnOF5WEoFrmTQqNGD78Gd9+ORX6 Vd356MsO3/6po1Gph+ZxUtwtHpRhpnbMe9/HDZSzQEQaMsmVFs+KQ+aL2aX7rHBKcNY+ vbXJ8nNpDja/JVn5gfE8bRnJpc29IkP9ADQAqMrTv4dwKgFeW+cn07rY/9aH4pQWzJfD auKA==
X-Google-Dkim-Signature v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=EFx3wok1teiiqsqrE3zIe0nBuP5IdNXT8yWo617EYTE=; b=Q4uldBQPDZd1T1cqfSfmdhkKOW6H0CiDfqU5c6al9EmQg3ZwMatMMcRb8VjdvmXJoa k3gGoo9T8EuxN4JVzZ/ctPzVqkh5KuVHmGC21qvI6izY9cfIXIzfa24b/D9PkW9c6v+w fNv3d82IaV+ad6jpb4mph3vygsHvohYCc5GdDBTBjYT1rum21K2bqeBtM/2gBgE4zJb3 LmATrqbUI8guwyXJyoi3wq/ef8lk65yqASlA3lTWmbkbEA4dXV+CA6mxK6J3i8lbal9Y cHMvYMrucoF0Q9kg5zWUI5ico4j9wNFh8yLyMX/XnpaJQ23cK4icuQswylNoL1KQzcEH wwkQ==
X-Gm-Message-State AODbwcDGXiUX3lNm5uGdC4KyUe0Vf5GT2ecK9fXXqOs5/hx2/fLAn6ht CUetflQrdOzENIWQ
X-Received by 10.99.178.75 with SMTP id t11mr8860326pgo.34.1496978023968; Thu, 08 Jun 2017 20:13:43 -0700 (PDT)
X-Google-Original-From Wanpeng Li <wanpeng.li@hotmail.com>
X-Mailer git-send-email 2.7.4
MIME-Version 1.0
Content-Type text/plain; charset=UTF-8
Content-Transfer-Encoding 8bit
Sender robomod@news.nic.it
List-ID <linux-kernel.vger.kernel.org>
X-Mailing-List linux-kernel@vger.kernel.org
Approved robomod@news.nic.it
Lines 85
Organization linux.* mail to news gateway
X-Original-Cc Paolo Bonzini <pbonzini@redhat.com>, Radim Krčmář <rkrcmar@redhat.com>, Wanpeng Li <wanpeng.li@hotmail.com>
X-Original-Date Thu, 8 Jun 2017 20:13:40 -0700
X-Original-Message-ID <1496978020-3848-1-git-send-email-wanpeng.li@hotmail.com>
X-Original-Sender linux-kernel-owner@vger.kernel.org
Xref csiph.com linux.kernel:1661891

Show key headers only | View raw


From: Wanpeng Li <wanpeng.li@hotmail.com>

 INFO: task gnome-terminal-:1734 blocked for more than 120 seconds.
       Not tainted 4.12.0-rc4+ #8
 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
 gnome-terminal- D    0  1734   1015 0x00000000
 Call Trace:
  __schedule+0x3cd/0xb30
  schedule+0x40/0x90
  kvm_async_pf_task_wait+0x1cc/0x270
  ? __vfs_read+0x37/0x150
  ? prepare_to_swait+0x22/0x70
  do_async_page_fault+0x77/0xb0
  ? do_async_page_fault+0x77/0xb0
  async_page_fault+0x28/0x30

This is triggered by running both win7 and win2016 on L1 KVM simultaneously, 
and then gives stress to memory on L1, I can observed this hang on L1 when 
at least ~70% swap area is occupied on L0.

This is due to async pf was injected to L2 which should be injected to L1, 
L2 guest starts receiving pagefault w/ bogus %cr2(apf token from the host 
actually), and L1 guest starts accumulating tasks stuck in D state in 
kvm_async_pf_task_wait() since missing PAGE_READY async_pfs.

This patch fixes the hang by doing async pf when executing L1 guest.

Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
---
 arch/x86/kvm/mmu.c | 5 ++++-
 arch/x86/kvm/mmu.h | 1 +
 arch/x86/kvm/x86.c | 3 +--
 3 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index 5d3376f..65e3004 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -3698,12 +3698,15 @@ static int kvm_arch_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, gfn_t gfn)
 	return kvm_setup_async_pf(vcpu, gva, kvm_vcpu_gfn_to_hva(vcpu, gfn), &arch);
 }
 
-static bool can_do_async_pf(struct kvm_vcpu *vcpu)
+bool can_do_async_pf(struct kvm_vcpu *vcpu)
 {
 	if (unlikely(!lapic_in_kernel(vcpu) ||
 		     kvm_event_needs_reinjection(vcpu)))
 		return false;
 
+	if (is_guest_mode(vcpu))
+		return false;
+
 	return kvm_x86_ops->interrupt_allowed(vcpu);
 }
 
diff --git a/arch/x86/kvm/mmu.h b/arch/x86/kvm/mmu.h
index 2797580..a94b28e 100644
--- a/arch/x86/kvm/mmu.h
+++ b/arch/x86/kvm/mmu.h
@@ -76,6 +76,7 @@ int handle_mmio_page_fault(struct kvm_vcpu *vcpu, u64 addr, bool direct);
 void kvm_init_shadow_mmu(struct kvm_vcpu *vcpu);
 void kvm_init_shadow_ept_mmu(struct kvm_vcpu *vcpu, bool execonly,
 			     bool accessed_dirty);
+bool can_do_async_pf(struct kvm_vcpu *vcpu);
 
 static inline unsigned int kvm_mmu_available_pages(struct kvm *kvm)
 {
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index a2cd099..10cf805 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -8607,8 +8607,7 @@ bool kvm_arch_can_inject_async_page_present(struct kvm_vcpu *vcpu)
 	if (!(vcpu->arch.apf.msr_val & KVM_ASYNC_PF_ENABLED))
 		return true;
 	else
-		return !kvm_event_needs_reinjection(vcpu) &&
-			kvm_x86_ops->interrupt_allowed(vcpu);
+		return can_do_async_pf(vcpu);
 }
 
 void kvm_arch_start_assignment(struct kvm *kvm)
-- 
2.7.4

Back to linux.kernel | Previous | Next | Find similar | Unroll thread


Thread

[PATCH] KVM: async_pf: avoid async pf injection when in guest mode Wanpeng Li <kernellwp@gmail.com> - 2017-06-09 05:20 +0200

csiph-web