From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755667AbcKVONU (ORCPT ); Tue, 22 Nov 2016 09:13:20 -0500 Received: from mail-bl2nam02on0068.outbound.protection.outlook.com ([104.47.38.68]:2231 "EHLO NAM02-BL2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755305AbcKVONS (ORCPT ); Tue, 22 Nov 2016 09:13:18 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Thomas.Lendacky@amd.com; Subject: Re: [PATCH v1 3/3] kvm: svm: Use the hardware provided GPA instead of page walk To: Paolo Bonzini , Brijesh Singh , References: <147916172660.16347.15695649975899246333.stgit@brijesh-build-machine> <147916176259.16347.7828367075943432152.stgit@brijesh-build-machine> <40c0e826-e8ef-2270-17e1-1b35e121ab1e@redhat.com> CC: , , , , , , , From: Tom Lendacky Message-ID: <30a3c431-4e4c-1da3-795c-24d889bf339a@amd.com> Date: Tue, 22 Nov 2016 08:13:07 -0600 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 In-Reply-To: <40c0e826-e8ef-2270-17e1-1b35e121ab1e@redhat.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: MWHPR14CA0016.namprd14.prod.outlook.com (10.173.227.26) To BN6PR12MB1137.namprd12.prod.outlook.com (10.168.226.139) X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1137;2:JvE1q14JcLUODWonM1RGcgDsfWk9F116Odrwhq2anvvDoatakfhlzUZ4nVgaAQGkKgDSIbOEufwUw0xiY6LS5+1gqdeoZohQQ76gAj5Fr1B8qkQFv+s7nOX0hxDE+k1FOpXV+BtvTEXQh+DXfHL0Ky1Px8J7oDMrk0TgC8eYYM8=;3:uPcMj00lQOhP+R/wixz7uwBsxDD4oOA6/POPdL1kEDQXyJpeh+WMVoGBbFt+lGQ1oR1MpQcnTmfZdMGY1FVaWedZdanbAy+u9/J/Oa+G8Q2P5CO8IFkD9xqw7+2ukyT0Zl2v1D11lA7N+7SW32X4RURm8KxVMfWfBIdEncLDz5s= X-MS-Office365-Filtering-Correlation-Id: 5e59a0b0-b1f5-4014-1e10-08d412e1b375 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:BN6PR12MB1137; X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1137;25:m1tckHj8ljtjtTsl5vJLXbUNexqR6D093tbQHFUpTDwe8dlbqj234v5d2mZptg5hYjxkfYayBBu9NUWGySasMupt96kX9x0/l1qFexHCIxXWa4orhhabmzQGIFjOD+lrDXJ2IUKfzcCdWh08NYvRIu+XDXXjuhpwWKne3pykJSrta5VBaY+qZ2p619pd7HaKT47+NZaB6YRvZTM7xrbqKC1JSefj549hv3L3ygFMxh0cakYe8XsoKANCjzJ3M1Q0OVWiVPZo07nJY/tGbMysEy2VljHaCgt3aVoZJXaxXuOeajUg6hlrpPnXkc22IPTKjGZkkOSvc9RKJPmZCZwfH/z7IEiNoIB3u1HQeJuHR88WdGt2P0LvU/giaLjn5ZrGiatnvFruEFooY7pzVUqW3vQ0wsXJWN/8zlU3ZEmhqhWPxm7jDv88UyncbBOSvBUUmNidYyHhJ1DQJ95k+kDZhCYT9E5TvU8LDtxwzKp+27VThwpbHeoiRO3QbicGkQeQL7cg75ZPUraf14Nsjv1PHxlYvuLD5Y71+VnDSZ32ofZEsFzxZtDxi2MCGDr7DNtU1H/lbsJX+5DIIOW3F2nSlAd/1Lkf4/BJTjCOMolEbO6TVggRpDEIehKIu/2NSLCkunhGYmbHiRQ1UPshHyAoIY/wwwieshuyzHSNKzI/ZpWptjyNN7kP0BGF0pjmlybGcJD1AcEcjnKiLYMzfRWf8d+EeIaJ3y4ie8NnPKp+35utyDmiZ6DWBW9Kd5tQMa+/ X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1137;31:74rVWJ+3fF53HmrpTf4Uqn0MZuaex5i+n1uSuvN1yfQOVd32KQyUa0vzXqPwkZaHM6WFXlsUpzvqUnnNhPzGKBqxRcw4xRxJqPMG67uo/LrG+lS2g+exwGS2tYZVLwf5R3OHtxTdxMbTciS0CbSVQEffKCQ9H7e2jtN6dOLWxnNvmp0co/trm7qcbRm7kzDil9R3XwDE4a3cO5QN6xLunIAXz6s+FdRoTVDoFVqOgy3eExWI08y/cj934Y28/+mQw0gFbfrNYsPIzNddZdtHarNlQafd/FO+NxTWFbep81M=;20:FLFA4z30ncCYesPO+4HAif59r5w41cqONZn3cEXDkXustrwiwsQvK32Nj95DvXLr13JRxAddQ2QRMLDrEIQvPESKnoxcbIiY/neKC/QgOsbU2OJluf0GfNWw/P2K3slPLPxg/nby7w+pFHkk9eLGIgvyKu+pHFvy/AzmZvxfZKmHlDUTcyoX5gGJNeiyWLrXHND2kZfR4BkXsde3S0X8Lmb/yVyykJlgQMO+0hyUpN3MnAL0FmP4RG4mjAySwrG5q2JOsr7qZBSvcLVu2gwm2gRmLjh3PuLdBSNZH9IOR8Ug+IEVJRkLHGIQ+895sV8ea+fEWXS2pfUbyRNuniWzf2z9OERpj8VUQpWN/au3HubvNQ1qs+WLGCSiG5N4niGf93JduOjhJFe2oCRyFIx1jpeZwSAxgpAd8mF0FnPV7ymRHcK2FaxW+Q98NRAdA4ZzokialTeNRhGw6TUX4ZWGD76cySx2wavBlJFe6FtFDGwoj2ERlfym0nd5GI/30l6J X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6045199)(6040307)(6060326)(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6055026)(6041248)(6061324)(6042181);SRVR:BN6PR12MB1137;BCL:0;PCL:0;RULEID:;SRVR:BN6PR12MB1137; X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1137;4:DGfxYe+xd7Le+4+NB7e6Xti9uzyr1L5/RHTEmTYCXHlNVbXQNUtvK4b7l7JajVYKRXwuNV6SLlqTFVbL7aiDiIa6GfKHEQMUVqasWx+8JoxdSGYk9YI0aiAA1cRu8S2/4PR4yreK7IMbx5fZKNMBxpQSdHdUaA0G3oSJNovD1VjyIObyO1qnpCiEXfCNG7/QTHbz1be3UuOkGTfaHKKTpKVAALdvrunn2OiXmajvd64ND/fOJPq2sdKvEXqVPtyX1pc29hmpt2QA/ef83UbeeBZcIy9kFQOPukxedu7pqh7ZrM2iC/UIzJZ/vJgg9k+SWDi3ABz5yFpkKheGZ0dANK+4U9TaTPbid1auR36OVl8yUnM6pHogJHLoGRWy3CII/9yPZVRsPgLBuhWmi/6U+KJcWkd6I0zEhNvYLAv8O1yfP5bJ0Uppt+eZsePbOB2NS20Ihvb/CQllit+uB3D2lZSS/wwJeWcQ6ibeqZPGX4a9YhF1HGXlyayBkHb5lU2AadC8gUCrA3g0U0iepdAgmklcyXZYhHDzhuGSW5Bud+8= X-Forefront-PRVS: 0134AD334F X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(6049001)(7916002)(377454003)(199003)(189002)(24454002)(54356999)(76176999)(65956001)(50986999)(65806001)(66066001)(6666003)(7736002)(305945005)(2950100002)(47776003)(64126003)(101416001)(68736007)(86362001)(5660300001)(31696002)(2906002)(7416002)(8676002)(83506001)(230700001)(7846002)(65826007)(105586002)(106356001)(6116002)(4326007)(42186005)(3846002)(92566002)(38730400001)(36756003)(77096005)(229853002)(81166006)(189998001)(4001350100001)(81156014)(5001770100001)(97736004)(31686004)(23676002)(33646002)(50466002);DIR:OUT;SFP:1101;SCL:1;SRVR:BN6PR12MB1137;H:[10.236.64.222];FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtCTjZQUjEyTUIxMTM3OzIzOnlNdXdlbjVEZzdzcUNaYlpzTUwzMjdpWFRK?= =?utf-8?B?QXFmdll3WmNrVVppVkppYWRPT3QzYWVXQ2RCRjduc2pTM292RlRuVFlTNUwy?= =?utf-8?B?dTR0Z25idXFQRHZYWVJ6MmlTVHYwT1V0cFpHenRRUTZFeHpnSHJOdis0TUNB?= =?utf-8?B?S3ErUTRLZnlNWk16ZDhPTTZJb2dLTWpYOWk3Qzh0b1FXcjFhSklLRkJXdzNC?= =?utf-8?B?bGJzdXRnSy8vU2gvM2t1WlpCV0FJWW1LaHhidS9LdkdhOTRaN0JiVU1UK2VD?= =?utf-8?B?eEZMdlhsbnRTcXhzeVhGeW1MZnNEMDA4QnFqdzJnUXF0UERxTUFyMkc3TFpp?= =?utf-8?B?L3pDN3lXYS9vanFEbmdEVUpXbEM5MkNMSVNROXI1eUZNdlZWN3p0SjNZeEll?= =?utf-8?B?cjdrcWVPUHpsSmQ3WE1vamxPSWlFTmdWbUpJcGZsdnVtZG5pbDBJYXM4QlNt?= =?utf-8?B?eXUyclREOU9HS3NBdUtNRWtOOWlqemJOTXcybVZnR1Z2N2xuODJSWFJlK2g3?= =?utf-8?B?VHo0bjV6VGowaW5pbW8wSytTNDNnWTlSbEJwSG5QcGV6T2lzSVhMUzFjSEt1?= =?utf-8?B?ZlFUYWNHQjZFSk1HMDhXWW93VmZiYjIxUkRCM1F2endLc3gweHlTdWpBK0pX?= =?utf-8?B?enU3SXVGc0wzamdiaGNEUTZvQlNXY0VnU0g3NVB2TjA1WGx0QWdaL1ZLZ0ZX?= =?utf-8?B?elgweXJhOWR4cGk1SzIxUDBYVmtrcm9GTnI1VW9CK25PYjJNNDlqWVFwS1Rk?= =?utf-8?B?b3BtREQrZ2pCeFBIT25MWmxqY1dVb0wxMWtNRGM1T3NETkorMVdlYVFSUUNY?= =?utf-8?B?ZVRGWjdIS3lSL0VBNVJFakZyc05nVngzYXkxQkUxNmNrTlhWNTV6QUcwemc4?= =?utf-8?B?OTJBU1lwN3orVFQ4ZG1aMk92Z2VMZ2hDSTFyeENQbWtOQlZjUmJtUFdnNWRO?= =?utf-8?B?SnE4MXpmbEZmTWFqeFg3RVJScEE1WlFkOGdNUDN6RVZiSEpiNkU2NjRwUkVZ?= =?utf-8?B?TEwwaTI0NEV4RVJPT1daUk9JRGh6bXdvSWZ1NGRHeFk5VzkxSXNmMm9aYmIx?= =?utf-8?B?aWk5alRPOGNYV1FQTXVmVFhVMUxXM0NBRDhabDVWZmNqUVY3SEo4SDBmdTBH?= =?utf-8?B?RExqVkx6N1V4NHV3SlhDWlNIQ2syVXlrQW9zOFozL0lnZXJpTFNUUEEzK3BH?= =?utf-8?B?VXRyME9CU1NCTUtoMmk1YjVueXNyV2NVQ0tTUitER1Qxc0FXcFY4S21xTzdM?= =?utf-8?B?MWxLbzAyUE1wUEtPNitoQ3FSTWhHZGlPSngvQnMybktLMjRTTlN0UVQrMTVL?= =?utf-8?B?QWMvSU1nNm1UMlJsSytSQ1MyRjArUFdDUWI0QlF1U0ZKc0loRGNBbDBpWkpS?= =?utf-8?B?UnIwSUFKbjd1cW1ISkhJTlR0NUpIL09VdFl3OXA5L3lmY3hVVGx0L2FEei9z?= =?utf-8?B?Mzd2NVEweHAyR3RwTVBjQnBZbVFPRkVtSVRKT0hYRE92WTRQMDVwZTMrb0NT?= =?utf-8?B?ZVM4RzRrRktDeDZnRktCb1gwd2kwYzFsd256K2lRWThNa1YvVUhnVlR5c3Rt?= =?utf-8?B?eExEOG4vcExmWHdVVk5Oa1RFSldXT2ZkS2Y2MEc4bVQzWFRvWE9tMmlSdlVk?= =?utf-8?B?Y2dmYnFtRjJXbzV5ZzNPRElMUEc2cjN0Ti9CT2gwN1VMTVRsMWZKSnBPNFcx?= =?utf-8?B?Q3g3bE5wZDhBaFA0US95VEJIdGhOcHd1WExzdlQ3QjFBVjZkam05RTVXOWJ6?= =?utf-8?Q?lvzKhTkQL7eRfqqq77R9yQx9k+WUQ7nquwgyQ=3D?= X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1137;6:ScF/8P2qwoTV4ggnVbSSJKh5s1w+bYfyJSgT2CYSd8ktVJ0jBTFcEDbQG6YHDrEpKcxucFk1ZqvXqaM4mTr+BnXTn+SICPr+DJ1LI9infmQY5td8b4jEgqeCYP0BKwJ5tOJwAUips1u17j8KzgDF6wJegMm2VnFzxvSGnkAlJBrSfomxBreYPO+HU2o4qffcQY2IR+brizVVEqZeMso3bq0sgbPyaglDEsfDNaS3BnBu/IgLEJgBj0ULfxBqmhRNR78TUgQdao294VYoJ8/YD+whODPGvCNGgSuIRaz+czkMukr3isBs1sKAQlNjVS5BaQdQcpKDXKS6U1FXIdWLbnupORLb58U4wlxFhIGRdbCCms+hXKYDgqigT/uVtPE1;5:LkA1C5jyIMEdrFCzy7GcnMvcLsdCH9R9haqZx8FkUHO6UvtSDZaZRJKRU3jIAcpKSMHEhD1WjnOLWVb3AvtQigVUYKT0nbl6U16+xS7O6hR/JKxfUWOxhFNv1uhSmdghxnrIpx9v75F/DS6Qic6D/1uua2kBE/df13Z/iquar6A=;24:fA3kYMHa1u+JmVAJORbKYPVfT6xLm0G2O7M1mW87Ftc9ihw1tPnGjveyETZLNWGnBINRQOuG78aCCD9bs4Wj9wpgFoj5QhS9eKBim/NkaWs= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1137;7:9likKtGtY2RuMnGwsjKLhWrc4j6UiR1WmM03UQXcrUeRDyJP0Drcfnx1whR1GbLpnXP2EFZ1nTEpKZyCMsi3xD+T+CgGu/6ko9ZpgEzT8c0SLBYoGz3oz4p+sjTLuscr4sldpbHiMV4tiPRV+q2qoCQGQfK7r6GyUY9IY1TDwUr5OYuVRotxBwgIuBgyafQUF1HghGq5ornFI/M+4TQV9dAjIWXe0cTL+Q0J9AvoDadScT1+5otvU+EZ2XpB3sc0jb8v+P2xLhDR29WrPlqcZsqOdkB9iUE41pFKxnZBAG/gu3H1zCNOAdMj1cYnHPQndMCUV2WE79FU6DNZruiqh1cQYPJwBU9FJ0Xp4/sQY2o=;20:Fa1I8PfhSPPJpt0/hqAmewMEKcdoe9QE5mz54FnHuhfYAWS/IDvwjoYwzjb5NczEjTmdKdZudFnVH/TexS7+FjpeHXD595AgViYAfHwJcNiSYGwVFuE6QvrzUoY0JInDcTfWGlaAe4tSFVl37wMo/0DvOpxw32rd7lwAw30NQH1keUB5PLs54v7VwTq1HgkhAlyDuwfphYiPv6A3uDuaejTjp2zWzmhonJ47Vc1VCWFRbhDC4CcYCCTghQ3T09Yn X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Nov 2016 14:13:13.7227 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR12MB1137 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 11/21/2016 9:07 AM, Paolo Bonzini wrote: > > > On 14/11/2016 23:16, Brijesh Singh wrote: >> From: Tom Lendacky >> >> When a guest causes a NPF which requires emulation, KVM sometimes walks >> the guest page tables to translate the GVA to a GPA. This is unnecessary >> most of the time on AMD hardware since the hardware provides the GPA in >> EXITINFO2. >> >> The only exception cases involve string operations involving rep or >> operations that use two memory locations. With rep, the GPA will only be >> the value of the initial NPF and with dual memory locations we won't know >> which memory address was translated into EXITINFO2. >> >> Signed-off-by: Tom Lendacky >> Reviewed-by: Borislav Petkov >> Signed-off-by: Brijesh Singh >> --- >> arch/x86/include/asm/kvm_emulate.h | 3 +++ >> arch/x86/include/asm/kvm_host.h | 3 +++ >> arch/x86/kvm/svm.c | 9 ++++++++- >> arch/x86/kvm/x86.c | 17 ++++++++++++++++- >> 4 files changed, 30 insertions(+), 2 deletions(-) >> >> diff --git a/arch/x86/include/asm/kvm_emulate.h b/arch/x86/include/asm/kvm_emulate.h >> index e9cd7be..2d1ac09 100644 >> --- a/arch/x86/include/asm/kvm_emulate.h >> +++ b/arch/x86/include/asm/kvm_emulate.h >> @@ -344,6 +344,9 @@ struct x86_emulate_ctxt { >> struct read_cache mem_read; >> }; >> >> +/* String operation identifier (matches the definition in emulate.c) */ >> +#define CTXT_STRING_OP (1 << 13) >> + >> /* Repeat String Operation Prefix */ >> #define REPE_PREFIX 0xf3 >> #define REPNE_PREFIX 0xf2 >> diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h >> index 77cb3f9..fd5b1c8 100644 >> --- a/arch/x86/include/asm/kvm_host.h >> +++ b/arch/x86/include/asm/kvm_host.h >> @@ -668,6 +668,9 @@ struct kvm_vcpu_arch { >> >> int pending_ioapic_eoi; >> int pending_external_vector; >> + >> + /* GPA available (AMD only) */ >> + bool gpa_available; >> }; >> >> struct kvm_lpage_info { >> diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c >> index 5e64e656..b442c5a 100644 >> --- a/arch/x86/kvm/svm.c >> +++ b/arch/x86/kvm/svm.c >> @@ -275,6 +275,9 @@ static int avic; >> module_param(avic, int, S_IRUGO); >> #endif >> >> +/* EXITINFO2 contains valid GPA */ >> +static bool gpa_avail = true; >> + >> /* AVIC VM ID bit masks and lock */ >> static DECLARE_BITMAP(avic_vm_id_bitmap, AVIC_VM_ID_NR); >> static DEFINE_SPINLOCK(avic_vm_id_lock); >> @@ -1055,8 +1058,10 @@ static __init int svm_hardware_setup(void) >> goto err; >> } >> >> - if (!boot_cpu_has(X86_FEATURE_NPT)) >> + if (!boot_cpu_has(X86_FEATURE_NPT)) { >> npt_enabled = false; >> + gpa_avail = false; > > This is not necessary, since you will never have exit_code == > SVM_EXIT_NPF && !gpa_avail. Ah, yes, that is a bit redundant. We'll get rid of the gpa_avail flag. Thanks, Tom > >> + } >> >> if (npt_enabled && !npt) { >> printk(KERN_INFO "kvm: Nested Paging disabled\n"); >> @@ -4192,6 +4197,8 @@ static int handle_exit(struct kvm_vcpu *vcpu) >> vcpu->arch.cr0 = svm->vmcb->save.cr0; >> if (npt_enabled) >> vcpu->arch.cr3 = svm->vmcb->save.cr3; >> + if (gpa_avail) >> + vcpu->arch.gpa_available = (exit_code == SVM_EXIT_NPF); > > The "if", and the body moved just before > > return svm_exit_handlers[exit_code](svm); > > I'll try doing a similar patch for Intel too, for better testing. > >> >> if (unlikely(svm->nested.exit_required)) { >> nested_svm_vmexit(svm); >> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c >> index d02aeff..c290794 100644 >> --- a/arch/x86/kvm/x86.c >> +++ b/arch/x86/kvm/x86.c >> @@ -4420,7 +4420,19 @@ static int vcpu_mmio_gva_to_gpa(struct kvm_vcpu *vcpu, unsigned long gva, >> return 1; >> } >> >> - *gpa = vcpu->arch.walk_mmu->gva_to_gpa(vcpu, gva, access, exception); >> + /* >> + * If the exit was due to a NPF we may already have a GPA. >> + * If the GPA is present, use it to avoid the GVA to GPA table >> + * walk. Note, this cannot be used on string operations since >> + * string operation using rep will only have the initial GPA >> + * from when the NPF occurred. >> + */ >> + if (vcpu->arch.gpa_available && >> + !(vcpu->arch.emulate_ctxt.d & CTXT_STRING_OP)) >> + *gpa = exception->address; >> + else >> + *gpa = vcpu->arch.walk_mmu->gva_to_gpa(vcpu, gva, access, >> + exception); >> >> if (*gpa == UNMAPPED_GVA) >> return -1; >> @@ -5542,6 +5554,9 @@ int x86_emulate_instruction(struct kvm_vcpu *vcpu, >> } >> >> restart: >> + /* Save the faulting GPA (cr2) in the address field */ >> + ctxt->exception.address = cr2; >> + >> r = x86_emulate_insn(ctxt); >> >> if (r == EMULATION_INTERCEPTED) >>