Received: by 10.223.176.5 with SMTP id f5csp2845325wra; Mon, 5 Feb 2018 10:50:45 -0800 (PST) X-Google-Smtp-Source: AH8x226jDVwAbRZcRpHf/UglWV2AMKpgiC5ZPOY4VBbHtbgIq5MFh2aV1AsWkE7kTI3tAjyVrmRm X-Received: by 2002:a17:902:8b88:: with SMTP id ay8-v6mr31265927plb.197.1517856645588; Mon, 05 Feb 2018 10:50:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517856645; cv=none; d=google.com; s=arc-20160816; b=zNO0ajfFjC+/F6VjLYPm1QDtWuIk1hjhtrdreFN00+UjOedxnvBbkK4v3TapCZ0dTQ 3Iaj1dLK9KkGQ2+G409LLwihLsKmb6i1Il0avY7b7jNPdOnCuy3T/gY2mTZF5wAYntlu OddL+ypxRtrV5sIgQclZdGfVLi3f2y1JJOdq1AD/LqcXcdhLxp1nuptLOeiCsZ8ZHrU9 t5bjD5OgnDW2jRYHgmrKte4KvLvcjnWX1NJtaZXIMHVBheeFdSS1Bg30BiSQMYcK9kGD vr9lV4ixhIhz0A8YO+hyL/DW+bPziP1rTsVVBaUIOLRcNPZeN6W93dLnl4cobC/7S2dc ciZQ== 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=qbJSCeXoVg/FF2j7TMe8/FxsajXLYgrAYT+MrDJXrH8=; b=0TR+KK0oAybq7WelUb3kUBlxmeWmSiwhFE97Jodw6l+BI9b1E+MJPfGQjKfoXGIxv6 oxGAbPbS8iYnJ9xKQ6JsEwnbUXKUa5TeeLfTzWbwpCs84TWTNqQ3L7lzzBgU/grwjQzD Mq2NSq1CQD6QnS8GLrDKpt+WUcyepsiIABip4pmv4Tdy4FSy2FMVL197f9u9DIyuOTTF UOZSCywu8MF7sUfjpiAbtyN5L44Vj/jY3YGBlg9A/qzELfcooaKAGrar0cplL0pqWzjQ mGuN8qS36xuhQrzsqdCuV1GGKOBB6LVuK4dws62VcBIDgq4ihgPgOpXikPSVlGYIj2k6 RH+w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@amazon.de header.s=amazon201209 header.b=mbeX5M7r; 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=QUARANTINE sp=QUARANTINE dis=NONE) header.from=amazon.de Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i23-v6si272919pll.606.2018.02.05.10.50.30; Mon, 05 Feb 2018 10:50:45 -0800 (PST) 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=@amazon.de header.s=amazon201209 header.b=mbeX5M7r; 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=QUARANTINE sp=QUARANTINE dis=NONE) header.from=amazon.de Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753999AbeBEStD (ORCPT + 99 others); Mon, 5 Feb 2018 13:49:03 -0500 Received: from smtp-fw-6002.amazon.com ([52.95.49.90]:23901 "EHLO smtp-fw-6002.amazon.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753704AbeBESsA (ORCPT ); Mon, 5 Feb 2018 13:48:00 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amazon.de; i=@amazon.de; q=dns/txt; s=amazon201209; t=1517856480; x=1549392480; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=qbJSCeXoVg/FF2j7TMe8/FxsajXLYgrAYT+MrDJXrH8=; b=mbeX5M7rd9r2r4U38E6ZEhqyBTzYwLJRhX063gABwnVwDufVhdp2u0MS lb675Y9QggoN8Ia2qAVOcctkDo0i8sR6cs6+7OlYHLbh3X3oAsTamQ9n9 CWcmOR6rJDwH4bALLo67vmDG1jxZhYn7JyqIg+BB24l7kAZuyGdXGpR8h I=; X-IronPort-AV: E=Sophos;i="5.46,465,1511827200"; d="scan'208";a="330725242" Received: from iad6-co-svc-p1-lb1-vlan3.amazon.com (HELO email-inbound-relay-2c-a11fcaa7.us-west-2.amazon.com) ([10.124.125.6]) by smtp-border-fw-out-6002.iad6.amazon.com with ESMTP/TLS/DHE-RSA-AES256-SHA; 05 Feb 2018 18:47:55 +0000 Received: from u54e1ad5160425a4b64ea.ant.amazon.com (pdx2-ws-svc-lb17-vlan3.amazon.com [10.247.140.70]) by email-inbound-relay-2c-a11fcaa7.us-west-2.amazon.com (8.14.7/8.14.7) with ESMTP id w15Ilp3K086155 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 5 Feb 2018 18:47:52 GMT Received: from u54e1ad5160425a4b64ea.ant.amazon.com (localhost [127.0.0.1]) by u54e1ad5160425a4b64ea.ant.amazon.com (8.15.2/8.15.2/Debian-3) with ESMTP id w15Ilot8003149; Mon, 5 Feb 2018 19:47:50 +0100 Received: (from karahmed@localhost) by u54e1ad5160425a4b64ea.ant.amazon.com (8.15.2/8.15.2/Submit) id w15IloVl003148; Mon, 5 Feb 2018 19:47:50 +0100 From: KarimAllah Ahmed To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: KarimAllah Ahmed , Paolo Bonzini , =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= Subject: [RFC 03/12] KVM/VMX: Use the new host mapping API for virtual_apic_page Date: Mon, 5 Feb 2018 19:47:22 +0100 Message-Id: <1517856451-2932-4-git-send-email-karahmed@amazon.de> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1517856451-2932-1-git-send-email-karahmed@amazon.de> References: <1517856451-2932-1-git-send-email-karahmed@amazon.de> 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 For nested guests the virtual_apic_page was mapped to the host kernel using kvm_vcpu_gpa_to_page which assumes that all guest memory is backed by a "struct page". This breaks guests that have their memory outside the kernel control. Switch to the new host mapping API which takes care of this use-case as well. Cc: Paolo Bonzini Cc: Radim Krčmář Cc: kvm@vger.kernel.org Cc: linux-kernel@vger.kernel.org Signed-off-by: KarimAllah Ahmed --- arch/x86/kvm/vmx.c | 34 ++++++++++++---------------------- 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index b76ab06..6bd0c45 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -452,7 +452,7 @@ struct nested_vmx { * pointers, so we must keep them pinned while L2 runs. */ struct kvm_host_mapping apic_access_mapping; - struct page *virtual_apic_page; + struct kvm_host_mapping virtual_apic_mapping; struct page *pi_desc_page; struct pi_desc *pi_desc; bool pi_pending; @@ -5264,9 +5264,8 @@ static void vmx_complete_nested_posted_interrupt(struct kvm_vcpu *vcpu) max_irr = find_last_bit((unsigned long *)vmx->nested.pi_desc->pir, 256); if (max_irr != 256) { - vapic_page = kmap(vmx->nested.virtual_apic_page); + vapic_page = vmx->nested.virtual_apic_mapping.kaddr; __kvm_apic_update_irr(vmx->nested.pi_desc->pir, vapic_page); - kunmap(vmx->nested.virtual_apic_page); status = vmcs_read16(GUEST_INTR_STATUS); if ((u8)max_irr > ((u8)status & 0xff)) { @@ -7502,10 +7501,8 @@ static void free_nested(struct vcpu_vmx *vmx) /* Unpin physical memory we referred to in the vmcs02 */ if (vmx->nested.apic_access_mapping.pfn) kvm_release_host_mapping(&vmx->nested.apic_access_mapping, true); - if (vmx->nested.virtual_apic_page) { - kvm_release_page_dirty(vmx->nested.virtual_apic_page); - vmx->nested.virtual_apic_page = NULL; - } + if (vmx->nested.virtual_apic_mapping.pfn) + kvm_release_host_mapping(&vmx->nested.virtual_apic_mapping, true); if (vmx->nested.pi_desc_page) { kunmap(vmx->nested.pi_desc_page); kvm_release_page_dirty(vmx->nested.pi_desc_page); @@ -10045,7 +10042,6 @@ static void nested_get_vmcs12_pages(struct kvm_vcpu *vcpu, { struct vcpu_vmx *vmx = to_vmx(vcpu); struct page *page; - u64 hpa; if (nested_cpu_has2(vmcs12, SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES)) { /* @@ -10078,11 +10074,8 @@ static void nested_get_vmcs12_pages(struct kvm_vcpu *vcpu, } if (nested_cpu_has(vmcs12, CPU_BASED_TPR_SHADOW)) { - if (vmx->nested.virtual_apic_page) { /* shouldn't happen */ - kvm_release_page_dirty(vmx->nested.virtual_apic_page); - vmx->nested.virtual_apic_page = NULL; - } - page = kvm_vcpu_gpa_to_page(vcpu, vmcs12->virtual_apic_page_addr); + if (vmx->nested.virtual_apic_mapping.pfn) /* shouldn't happen */ + kvm_release_host_mapping(&vmx->nested.virtual_apic_mapping, true); /* * If translation failed, VM entry will fail because @@ -10097,11 +10090,10 @@ static void nested_get_vmcs12_pages(struct kvm_vcpu *vcpu, * control. But such a configuration is useless, so * let's keep the code simple. */ - if (!is_error_page(page)) { - vmx->nested.virtual_apic_page = page; - hpa = page_to_phys(vmx->nested.virtual_apic_page); - vmcs_write64(VIRTUAL_APIC_PAGE_ADDR, hpa); - } + if (kvm_vcpu_gpa_to_host_mapping(vcpu, vmcs12->virtual_apic_page_addr, + &vmx->nested.virtual_apic_mapping, true)) + vmcs_write64(VIRTUAL_APIC_PAGE_ADDR, + vmx->nested.virtual_apic_mapping.pfn << PAGE_SHIFT); } if (nested_cpu_has_posted_intr(vmcs12)) { @@ -11683,10 +11675,8 @@ static void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason, /* Unpin physical memory we referred to in vmcs02 */ if (vmx->nested.apic_access_mapping.pfn) kvm_release_host_mapping(&vmx->nested.apic_access_mapping, true); - if (vmx->nested.virtual_apic_page) { - kvm_release_page_dirty(vmx->nested.virtual_apic_page); - vmx->nested.virtual_apic_page = NULL; - } + if (vmx->nested.virtual_apic_mapping.pfn) + kvm_release_host_mapping(&vmx->nested.virtual_apic_mapping, true); if (vmx->nested.pi_desc_page) { kunmap(vmx->nested.pi_desc_page); kvm_release_page_dirty(vmx->nested.pi_desc_page); -- 2.7.4