Received: by 10.223.164.221 with SMTP id h29csp1839629wrb; Thu, 2 Nov 2017 01:33:52 -0700 (PDT) X-Google-Smtp-Source: ABhQp+S97HaYD9w+iYInqguKVZI/6SG19megJNUWzKuWx1J9y50z6+nZYH4lWzrZ09Nj1GBd/jRG X-Received: by 10.84.202.12 with SMTP id w12mr2443992pld.358.1509611632683; Thu, 02 Nov 2017 01:33:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1509611632; cv=none; d=google.com; s=arc-20160816; b=r6cXb+nHiI72Mw+A9yfp8j9o1H2Ko7x9/BiDVPCNggQmdMg6pQ+8A1f9bagDdpPabE /ZFC2bZMiEHbWmEVOo/tI/fWr72d8+SNmTFyqFi4jtpA9Ey0Eieo37OZOv6zYNm1Io1G +Dj3VoNiIoZ24aZP2sCDRVvIv5bJayHorAb5o7xmhTVkbSzrYXewl8UGq3M+upntZyTA cW7v/OqQYvHSYlqhQsyu+lczO0YEPKhGNQSwNGhbTk4GHjjej5sjdsCjreW2yYTG8QU1 ON5XY3/9rhigFEt3CszKDf+w1ElCjc8jrWbv2u36c+nO55rAfvo4ixWQBi9JtpNaK7cH 7klQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=dL2MC7zclQB7eo0v/x0SD8GYQtJmh1Pte9HXrfnXWGI=; b=OywKR32kKtzaTINEhJuZRZWCNfFGxYlmCf9bP+NL7rK+zD9tLdhpuvYoYG50CI3tgS cVnC0q/CrbBcraMqXoAZsUGMy0eZK4c94gWek62wQL7dBwozk1cZRqmXSCZPUM9hmt3y ZKGouJJmT+4I/pHd8Jje+pkpZnZuAI9PVLOxY5Ug7SZcRUlLhcaScI02M+rcA+SOWYaP gYVj2y6UkB1loR4ihjgOYeyBxgOZUWrwXkJmNV9vitqQ/tIIs8kAekw3Vat96+Iyl2DG Fm3wXtPG2RIKprq3h1Ytt2xYtQHfMXJfn/1sSw4/OrbYo3ROlLK3DriWguF/oa2sBKkG kLMA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=u4hYRnI+; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 32si1741385pls.667.2017.11.02.01.33.38; Thu, 02 Nov 2017 01:33:52 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=u4hYRnI+; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755402AbdKBIcJ (ORCPT + 99 others); Thu, 2 Nov 2017 04:32:09 -0400 Received: from mail-pg0-f66.google.com ([74.125.83.66]:53472 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755341AbdKBIbt (ORCPT ); Thu, 2 Nov 2017 04:31:49 -0400 Received: by mail-pg0-f66.google.com with SMTP id s2so4428960pge.10; Thu, 02 Nov 2017 01:31:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=dL2MC7zclQB7eo0v/x0SD8GYQtJmh1Pte9HXrfnXWGI=; b=u4hYRnI+Z46Q8lDwQSivQwGl3RXaywcXU5YhquMirPRRKVZwMmrK4X28X7cA1eGaZ+ /qhUtdi2EXuPedT56RZzIjg3xCjUYmQ38oKH4xApiXOeEK9Hn8dSQyiNmgaxMwa6QwEj GsZLvbwPJWajWAXG2DuDMlSCv6+bel3/QnMBADqhe8VE0TIlbVnfhTK6tasHpc5osTlX 0liksXO05YvGibpjnX5F6kSQ6G5OK+VIxtTsEyiefJXxs2S6KXnIz12t3UfIyM7lAZGt 66ka1rF4ymmzdoamCVbNQ1nJHda7aJYTwJcED/rpxFeUubKVoyEZAtMsz3MdrFclM11j /E1Q== 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=dL2MC7zclQB7eo0v/x0SD8GYQtJmh1Pte9HXrfnXWGI=; b=Kz8gpw/0/+g72a1bb+b3OsGk61BG5z1AJ6funSsemWtqroWI+B7+OkvyFB2UB/gUCG jXvgtcgP4Zx5JZKdWneJW3HUstVfIyxFyZ94PdKyq/M5jbVCKbmmg7Wi1LyJYYCInmUc 943U983qlfaqKzOUvLKm5adUE0zzLyZ3MMUc5DAtwbh2WTuAARbeqf01Y40Crqofjsne E8GI/iWaRJy6JfDeBUMiBwg1tML79+7lL8zTp4pyxdH9iLnjUYw2iNNIzKEbws9/8d85 aZeIISgaefm4z3wvnrwy5ZRh2CI0Zmcc8tgNERJ0FaeNfOvSBP7FzGQH9yaZ2ZU4xo6X 62+Q== X-Gm-Message-State: AMCzsaXM624Wcc/huT+mL6HUOq3ISZlgBDJcd8lEJVl1dAixwwwGZrK2 CsaLphSmIIgFUmlIKEiGg62Tsw== X-Received: by 10.84.252.141 with SMTP id y13mr2392222pll.295.1509611508675; Thu, 02 Nov 2017 01:31:48 -0700 (PDT) Received: from localhost ([203.205.141.123]) by smtp.gmail.com with ESMTPSA id o14sm4781532pfa.62.2017.11.02.01.31.47 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 02 Nov 2017 01:31:48 -0700 (PDT) From: Wanpeng Li X-Google-Original-From: Wanpeng Li To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: Paolo Bonzini , =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= , Wanpeng Li , Jim Mattson Subject: [PATCH v3 3/3] KVM: nVMX: Fix mmu context after VMLAUNCH/VMRESUME failure Date: Thu, 2 Nov 2017 01:31:39 -0700 Message-Id: <1509611499-9401-3-git-send-email-wanpeng.li@hotmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1509611499-9401-1-git-send-email-wanpeng.li@hotmail.com> References: <1509611499-9401-1-git-send-email-wanpeng.li@hotmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Wanpeng Li Commit 4f350c6dbcb (kvm: nVMX: Handle deferred early VMLAUNCH/VMRESUME failure properly) can result in L1(run kvm-unit-tests/run_tests.sh vmx_controls in L1) null pointer deference and also L0 calltrace when EPT=0 on both L0 and L1. In L1: BUG: unable to handle kernel paging request at ffffffffc015bf8f IP: vmx_vcpu_run+0x202/0x510 [kvm_intel] PGD 146e13067 P4D 146e13067 PUD 146e15067 PMD 3d2686067 PTE 3d4af9161 Oops: 0003 [#1] PREEMPT SMP CPU: 2 PID: 1798 Comm: qemu-system-x86 Not tainted 4.14.0-rc4+ #6 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.10.2-0-g5f4c7b1-prebuilt.qemu-project.org 04/01/2014 RIP: 0010:vmx_vcpu_run+0x202/0x510 [kvm_intel] Call Trace: WARNING: kernel stack frame pointer at ffffb86f4988bc18 in qemu-system-x86:1798 has bad value 0000000000000002 In L0: -----------[ cut here ]------------ ] WARNING: CPU: 6 PID: 4460 at /home/kernel/linux/arch/x86/kvm//vmx.c:9845 vmx_inject_page_fault_nested+0x130/0x140 [kvm_intel] ] CPU: 6 PID: 4460 Comm: qemu-system-x86 Tainted: G OE 4.14.0-rc7+ #25 ] RIP: 0010:vmx_inject_page_fault_nested+0x130/0x140 [kvm_intel] Call Trace: paging64_page_fault+0x500/0xde0 [kvm] ? paging32_gva_to_gpa_nested+0x120/0x120 [kvm] ? nonpaging_page_fault+0x3b0/0x3b0 [kvm] ? __asan_storeN+0x12/0x20 ? paging64_gva_to_gpa+0xb0/0x120 [kvm] ? paging64_walk_addr_generic+0x11a0/0x11a0 [kvm] ? lock_acquire+0x2c0/0x2c0 ? vmx_read_guest_seg_ar+0x97/0x100 [kvm_intel] ? vmx_get_segment+0x2a6/0x310 [kvm_intel] ? sched_clock+0x1f/0x30 ? check_chain_key+0x137/0x1e0 ? __lock_acquire+0x83c/0x2420 ? kvm_multiple_exception+0xf2/0x220 [kvm] ? debug_check_no_locks_freed+0x240/0x240 ? debug_smp_processor_id+0x17/0x20 ? __lock_is_held+0x9e/0x100 kvm_mmu_page_fault+0x90/0x180 [kvm] kvm_handle_page_fault+0x15c/0x310 [kvm] ? __lock_is_held+0x9e/0x100 handle_exception+0x3c7/0x4d0 [kvm_intel] vmx_handle_exit+0x103/0x1010 [kvm_intel] ? kvm_arch_vcpu_ioctl_run+0x1628/0x2e20 [kvm] The commit avoids to load host state of vmcs12 as vmcs01's guest state since vmcs12 is not modified (except for the VM-instruction error field) if the checking of vmcs control area fails. However, the mmu context is switched to nested mmu in prepare_vmcs02() and it will not be reloaded since load_vmcs12_host_state() is skipped when nested VMLAUNCH/VMRESUME fails. This patch fixes it by reloading mmu context when nested VMLAUNCH/VMRESUME fails. Cc: Paolo Bonzini Cc: Radim Krčmář Cc: Jim Mattson Signed-off-by: Wanpeng Li --- arch/x86/kvm/vmx.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index e6c8ffa..39bfa33 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -11406,6 +11406,7 @@ static void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason, { struct vcpu_vmx *vmx = to_vmx(vcpu); struct vmcs12 *vmcs12 = get_vmcs12(vcpu); + u32 entry_failure_code; /* trying to cancel vmlaunch/vmresume is a bug */ WARN_ON_ONCE(vmx->nested.nested_run_pending); @@ -11534,6 +11535,19 @@ static void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason, * accordingly. */ nested_vmx_failValid(vcpu, VMXERR_ENTRY_INVALID_CONTROL_FIELD); + + nested_ept_uninit_mmu_context(vcpu); + + /* + * Only PDPTE load can fail as the value of cr3 was checked on entry and + * couldn't have changed. + */ + if (nested_vmx_load_cr3(vcpu, vmcs12->host_cr3, false, &entry_failure_code)) + nested_vmx_abort(vcpu, VMX_ABORT_LOAD_HOST_PDPTE_FAIL); + + if (!enable_ept) + vcpu->arch.walk_mmu->inject_page_fault = kvm_inject_page_fault; + /* * The emulated instruction was already skipped in * nested_vmx_run, but the updated RIP was never -- 2.7.4 From 1582949540170790784@xxx Thu Nov 02 10:25:20 +0000 2017 X-GM-THRID: 1582949540170790784 X-Gmail-Labels: Inbox,Category Forums,HistoricalUnread