From patchwork Wed Feb 15 18:27:50 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Cao, Lei" X-Patchwork-Id: 9574773 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 9E0B060493 for ; Wed, 15 Feb 2017 18:28:01 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8962C27D5E for ; Wed, 15 Feb 2017 18:28:01 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7E0732850F; Wed, 15 Feb 2017 18:28:01 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E405D27D5E for ; Wed, 15 Feb 2017 18:28:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752172AbdBOS17 (ORCPT ); Wed, 15 Feb 2017 13:27:59 -0500 Received: from us-smtp-delivery-131.mimecast.com ([63.128.21.131]:30053 "EHLO us-smtp-delivery-131.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751429AbdBOS16 (ORCPT ); Wed, 15 Feb 2017 13:27:58 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=StratusTechnologies.onmicrosoft.com; s=selector1-stratus-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=UaGLE/hO8f5J6M/cZfgo+/s3yqNDa1SSs4Jjc8IKVpc=; b=02HZZH6eTC0jud2EbGWXT6fv/YVSmNdqWfzzWavGdGMBH0JYdn7wfdRMmF2qKOtaEYLU0hn2bmWt/Uy7yaZb5bKOzZypKXif1SzIamucqxeIbnji9l7KCkWgi4yWjsAfjWpGQJMcb06GBj8aDbwDE81YqbrHrnt14/rrZSx67rk= Received: from NAM03-DM3-obe.outbound.protection.outlook.com (mail-dm3nam03lp0023.outbound.protection.outlook.com [207.46.163.23]) (Using TLS) by us-smtp-1.mimecast.com with ESMTP id us-mta-6-SUrB48duPrOJWOnCD_I2Rg-1; Wed, 15 Feb 2017 13:27:52 -0500 Received: from CY1PR08MB1992.namprd08.prod.outlook.com (10.164.222.24) by CY1PR08MB1991.namprd08.prod.outlook.com (10.164.222.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.919.13; Wed, 15 Feb 2017 18:27:50 +0000 Received: from CY1PR08MB1992.namprd08.prod.outlook.com ([10.164.222.24]) by CY1PR08MB1992.namprd08.prod.outlook.com ([10.164.222.24]) with mapi id 15.01.0888.030; Wed, 15 Feb 2017 18:27:50 +0000 From: "Cao, Lei" To: Paolo Bonzini , =?iso-8859-2?Q?Radim_Kr=E8m=E1=F8?= , "kvm@vger.kernel.org" Subject: [PATCH v4 3/4] KVM: Add new exit reason for dirty ring full conditions Thread-Topic: [PATCH v4 3/4] KVM: Add new exit reason for dirty ring full conditions Thread-Index: AQHSh7k2YQEi7sbSWk2FboV7lAU1Dg== Date: Wed, 15 Feb 2017 18:27:50 +0000 Message-ID: References: <201702151812.v1FIC7vQ024508@dev1.sn.stratus.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [198.97.42.5] x-ms-office365-filtering-correlation-id: 677830a4-682f-4e4b-0870-08d455d0594f x-microsoft-antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001); SRVR:CY1PR08MB1991; x-microsoft-exchange-diagnostics: 1; CY1PR08MB1991; 7:hwd3I5L3PlAei9wLgXIlhLazDFHBYespgQIWToBNFRiXED0mXyxjWm8XkWZkilE5fXOLl7BzWgiG8vBbWGzu0g63aLERXDA1hUFkUX3UZOkJZxGUUpzoNfEoO8+PYSUE2raMyUve7vO+zVGLgSW+ByFZjhuQx+dmplRE3lrwQ5QbXdk1q4I39YM+ZZceg2m19QQCqg89sdYCNRj7QcSbhs4SqaXBNjZpNsxo602zQt38m9qTFxHCvadM/eDG0z53M2c9C3cPXNZoAZ6HScasH+gc4iNZc7FVgCms6nDxXY8BU74rwlcDCEsLHDPuL5GlbyC5Cyobt6STvF/xE14mO7j5/dFgA9gIGYNcVg7SK6d0MkEIVe2zOCbNHaWPL+GR9e51ZSEQVbFrqp/wWCsYpLpmsuMJuuZIVggeYRIcnVcDJaglvSxCW0smF1COMlrqN7bbRAUkWid77mKcwLw2HIhnURnnQUYJjfhz4csSiQSA/Q41vHAu6uSRvY/fD2RpSd7V4qJ/1eUq5TsHBrzn7g==; 20:NLcgS9PebaDFygQW8z6Foq8d/L+zU8iFYCSWmWO/ORBDphHArBqKf0ksjTm4zCSnhOcjmuwqnJ99S50WDs2Kt2x+l3ANPp3eQ+nZ3o4ypsMkKKo6OL69pPLA8ld3h/Mfm+s2qQKhsQSfvJwWJy3Yjavydhu4nyO00CeyCEIIcY4= x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:; x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(6040375)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(6041248)(20161123558025)(20161123562025)(20161123560025)(20161123564025)(20161123555025)(6072148); SRVR:CY1PR08MB1991; BCL:0; PCL:0; RULEID:; SRVR:CY1PR08MB1991; x-forefront-prvs: 021975AE46 x-forefront-antispam-report: SFV:NSPM; SFS:(10019020)(6009001)(7916002)(39450400003)(199003)(189002)(33656002)(7696004)(5660300001)(6116002)(76176999)(54356999)(50986999)(66066001)(101416001)(3846002)(122556002)(81166006)(102836003)(8936002)(8676002)(81156014)(7736002)(74316002)(305945005)(106356001)(105586002)(97736004)(106116001)(86362001)(25786008)(6436002)(9686003)(99286003)(189998001)(55016002)(3280700002)(2906002)(2900100001)(3660700001)(68736007)(6506006)(92566002)(53936002)(77096006)(389900002)(38730400002)(2501003)(14143004); DIR:OUT; SFP:1102; SCL:1; SRVR:CY1PR08MB1991; H:CY1PR08MB1992.namprd08.prod.outlook.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-OriginatorOrg: stratus.com X-MS-Exchange-CrossTenant-originalarrivaltime: 15 Feb 2017 18:27:50.4371 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: de36b473-b8ad-46ff-837f-9da16b8d1b77 X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR08MB1991 X-MC-Unique: SUrB48duPrOJWOnCD_I2Rg-1 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Add new KVM exit reason KVM_EXIT_DIRTY_LOG_FULL. Signed-off-by: Lei Cao --- arch/x86/include/asm/kvm_host.h | 3 +++ arch/x86/kvm/mmu.c | 7 +++++++ arch/x86/kvm/vmx.c | 7 +++++++ arch/x86/kvm/x86.c | 6 ++++++ include/linux/kvm_host.h | 1 + include/uapi/linux/kvm.h | 1 + 6 files changed, 25 insertions(+) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 6646aa5..c5e164d 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1002,6 +1002,7 @@ struct kvm_x86_ops { void (*enable_log_dirty_pt_masked)(struct kvm *kvm, struct kvm_memory_slot *slot, gfn_t offset, unsigned long mask); + int (*cpu_dirty_log_size)(void); /* pmu operations of sub-arch */ const struct kvm_pmu_ops *pmu_ops; @@ -1408,4 +1409,6 @@ static inline int kvm_cpu_get_apicid(int mps_cpu) #endif } +int kvm_cpu_dirty_log_size(void); + #endif /* _ASM_X86_KVM_HOST_H */ diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 7012de4..dd34ac6 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -1357,6 +1357,13 @@ void kvm_arch_mmu_enable_log_dirty_pt_masked(struct kvm *kvm, kvm_mmu_write_protect_pt_masked(kvm, slot, gfn_offset, mask); } +int kvm_cpu_dirty_log_size(void) +{ + if (kvm_x86_ops->cpu_dirty_log_size) + return kvm_x86_ops->cpu_dirty_log_size(); + return 0; +} + bool kvm_mmu_slot_gfn_write_protect(struct kvm *kvm, struct kvm_memory_slot *slot, u64 gfn) { diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index a236dec..0e11510 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -6723,6 +6723,7 @@ static __init int hardware_setup(void) kvm_x86_ops->slot_disable_log_dirty = NULL; kvm_x86_ops->flush_log_dirty = NULL; kvm_x86_ops->enable_log_dirty_pt_masked = NULL; + kvm_x86_ops->cpu_dirty_log_size = NULL; } if (cpu_has_vmx_preemption_timer() && enable_preemption_timer) { @@ -11497,6 +11498,11 @@ static void vmx_setup_mce(struct kvm_vcpu *vcpu) ~FEATURE_CONTROL_LMCE; } +static int vmx_cpu_dirty_log_size(void) +{ + return PML_ENTITY_NUM; +} + static struct kvm_x86_ops vmx_x86_ops __ro_after_init = { .cpu_has_kvm_support = cpu_has_kvm_support, .disabled_by_bios = vmx_disabled_by_bios, @@ -11611,6 +11617,7 @@ static struct kvm_x86_ops vmx_x86_ops __ro_after_init = { .slot_disable_log_dirty = vmx_slot_disable_log_dirty, .flush_log_dirty = vmx_flush_log_dirty, .enable_log_dirty_pt_masked = vmx_enable_log_dirty_pt_masked, + .cpu_dirty_log_size = vmx_cpu_dirty_log_size, .pre_block = vmx_pre_block, .post_block = vmx_post_block, diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 240fb75..24dcefd 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -6706,6 +6706,12 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) */ if (kvm_check_request(KVM_REQ_HV_STIMER, vcpu)) kvm_hv_process_stimers(vcpu); + + if (kvm_check_request(KVM_REQ_EXIT_DIRTY_LOG_FULL, vcpu)) { + vcpu->run->exit_reason = KVM_EXIT_DIRTY_LOG_FULL; + r = -EINTR; + goto out; + } } /* diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 33d9974..b0783da 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -123,6 +123,7 @@ static inline bool is_error_page(struct page *page) #define KVM_REQ_MMU_RELOAD 1 #define KVM_REQ_PENDING_TIMER 2 #define KVM_REQ_UNHALT 3 +#define KVM_REQ_EXIT_DIRTY_LOG_FULL 4 #define KVM_USERSPACE_IRQ_SOURCE_ID 0 #define KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID 1 diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 1a1ba4d..ec6c13f 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -205,6 +205,7 @@ struct kvm_hyperv_exit { #define KVM_EXIT_S390_STSI 25 #define KVM_EXIT_IOAPIC_EOI 26 #define KVM_EXIT_HYPERV 27 +#define KVM_EXIT_DIRTY_LOG_FULL 28 /* For KVM_EXIT_INTERNAL_ERROR */ /* Emulate instruction failed. */