From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Yang, Sheng" Subject: [RFC][PATCH 6/7] KVM: VMX: Add swap support for EPT Date: Fri, 1 Feb 2008 16:25:38 +0800 Message-ID: <200802011625.38807.sheng.yang@intel.com> Mime-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_CetoHaeIR9xbQ2R" Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org To: Avi Kivity Return-path: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org Errors-To: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org List-Id: kvm.vger.kernel.org --Boundary-00=_CetoHaeIR9xbQ2R Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline =46rom 720eee463536fdb6e15dcc5388754ea229c71118 Mon Sep 17 00:00:00 2001 =46rom: Sheng Yang Date: Fri, 1 Feb 2008 06:53:39 +0800 Subject: [PATCH] KVM: VMX: Add swap support for EPT Add tlp_unmap() in kvm_x86_ops, to support swap of EPT pages. Now EPT can support linux swap along with mmu_notifier. Signed-off-by: Sheng Yang =2D-- arch/x86/kvm/vmx.c | 46=20 ++++++++++++++++++++++++++++++++++++++++++++ include/asm-x86/kvm_host.h | 1 + 2 files changed, 47 insertions(+), 0 deletions(-) diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index f5b59e7..f07f161 100644 =2D-- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -2889,6 +2889,51 @@ static void vmx_free_vmcs(struct kvm_vcpu *vcpu) } } +static int remove_ept_entry(struct kvm *kvm, gpa_t gpa) +{ + eptp_t eptp =3D kvm->arch.eptp; + hpa_t path[VMX_EPT_MAX_GAW]; + int offsets[VMX_EPT_MAX_GAW]; + int level, offset; + struct page *page, *ept_page; + epte_t *table; + + mutex_lock(&kvm->arch.ept_mutex); + path[kvm->arch.eptp.fields.gaw] =3D eptp.fields.asr_mfn; + for (level =3D kvm->arch.eptp.fields.gaw; level >=3D 0; level--) { + ept_page =3D pfn_to_page(path[level]); + table =3D kmap_atomic(ept_page, KM_USER0); + offsets[level] =3D offset =3D VMX_GET_EPTE_OFFSET(gpa, level); + if (table[offset].entry !=3D 0) { + if (level =3D=3D 0) { + page =3D pfn_to_page( + table[offset].fields.addr_mfn); + kvm_release_page_clean(page); + atomic_dec(&kvm->arch.guest_npages); + table[offset].entry =3D 0; + } else + path[level - 1] =3D + table[offset].fields.addr_mfn; + kunmap_atomic(table, KM_USER0); + } else { + kunmap_atomic(table, KM_USER0); + break; + } + } + mutex_unlock(&kvm->arch.ept_mutex); + if (level >=3D 0) + return -1; + ept_sync_individual_addr(kvm, gpa); + return 0; +} + +static void vmx_unmap_ept(struct kvm *kvm, gfn_t gfn) +{ + if (remove_ept_entry(kvm, gfn << PAGE_SHIFT) < 0) + printk(KERN_WARNING "EPT: Fail to unmap gfn 0x%lx\n", + (long unsigned int)gfn); +} + static int ept_teardown(struct kvm *kvm) { const int entries_per_page =3D PAGE_SIZE / sizeof(u64); @@ -3108,6 +3153,7 @@ static struct kvm_x86_ops vmx_x86_ops =3D { .set_tss_addr =3D vmx_set_tss_addr, .tlp_enabled =3D vm_need_ept, + .tlp_unmap =3D vmx_unmap_ept, }; static int __init vmx_init(void) diff --git a/include/asm-x86/kvm_host.h b/include/asm-x86/kvm_host.h index b133317..0c3b73a 100644 =2D-- a/include/asm-x86/kvm_host.h +++ b/include/asm-x86/kvm_host.h @@ -408,6 +408,7 @@ struct kvm_x86_ops { int (*set_tss_addr)(struct kvm *kvm, unsigned int addr); int (*tlp_enabled)(void); /* Two Level Paging */ + void (*tlp_unmap)(struct kvm *kvm, gfn_t gfn); }; extern struct kvm_x86_ops *kvm_x86_ops; =2D- debian.1.5.3.7.1-dirty --Boundary-00=_CetoHaeIR9xbQ2R Content-Type: text/x-diff; charset="utf-8"; name="0006-KVM-VMX-Add-swap-support-for-EPT.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="0006-KVM-VMX-Add-swap-support-for-EPT.patch" =46rom 720eee463536fdb6e15dcc5388754ea229c71118 Mon Sep 17 00:00:00 2001 =46rom: Sheng Yang Date: Fri, 1 Feb 2008 06:53:39 +0800 Subject: [PATCH] KVM: VMX: Add swap support for EPT Add tlp_unmap() in kvm_x86_ops, to support swap of EPT pages. Now EPT can support linux swap along with mmu_notifier. Signed-off-by: Sheng Yang =2D-- arch/x86/kvm/vmx.c | 46 ++++++++++++++++++++++++++++++++++++++++= ++++ include/asm-x86/kvm_host.h | 1 + 2 files changed, 47 insertions(+), 0 deletions(-) diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index f5b59e7..f07f161 100644 =2D-- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -2889,6 +2889,51 @@ static void vmx_free_vmcs(struct kvm_vcpu *vcpu) } } =20 +static int remove_ept_entry(struct kvm *kvm, gpa_t gpa) +{ + eptp_t eptp =3D kvm->arch.eptp; + hpa_t path[VMX_EPT_MAX_GAW]; + int offsets[VMX_EPT_MAX_GAW]; + int level, offset; + struct page *page, *ept_page; + epte_t *table; + + mutex_lock(&kvm->arch.ept_mutex); + path[kvm->arch.eptp.fields.gaw] =3D eptp.fields.asr_mfn; + for (level =3D kvm->arch.eptp.fields.gaw; level >=3D 0; level--) { + ept_page =3D pfn_to_page(path[level]); + table =3D kmap_atomic(ept_page, KM_USER0); + offsets[level] =3D offset =3D VMX_GET_EPTE_OFFSET(gpa, level); + if (table[offset].entry !=3D 0) { + if (level =3D=3D 0) { + page =3D pfn_to_page( + table[offset].fields.addr_mfn); + kvm_release_page_clean(page); + atomic_dec(&kvm->arch.guest_npages); + table[offset].entry =3D 0; + } else + path[level - 1] =3D + table[offset].fields.addr_mfn; + kunmap_atomic(table, KM_USER0); + } else { + kunmap_atomic(table, KM_USER0); + break; + } + } + mutex_unlock(&kvm->arch.ept_mutex); + if (level >=3D 0) + return -1; + ept_sync_individual_addr(kvm, gpa); + return 0; +} + +static void vmx_unmap_ept(struct kvm *kvm, gfn_t gfn) +{ + if (remove_ept_entry(kvm, gfn << PAGE_SHIFT) < 0) + printk(KERN_WARNING "EPT: Fail to unmap gfn 0x%lx\n", + (long unsigned int)gfn); +} + static int ept_teardown(struct kvm *kvm) { const int entries_per_page =3D PAGE_SIZE / sizeof(u64); @@ -3108,6 +3153,7 @@ static struct kvm_x86_ops vmx_x86_ops =3D { =20 .set_tss_addr =3D vmx_set_tss_addr, .tlp_enabled =3D vm_need_ept, + .tlp_unmap =3D vmx_unmap_ept, }; =20 static int __init vmx_init(void) diff --git a/include/asm-x86/kvm_host.h b/include/asm-x86/kvm_host.h index b133317..0c3b73a 100644 =2D-- a/include/asm-x86/kvm_host.h +++ b/include/asm-x86/kvm_host.h @@ -408,6 +408,7 @@ struct kvm_x86_ops { =20 int (*set_tss_addr)(struct kvm *kvm, unsigned int addr); int (*tlp_enabled)(void); /* Two Level Paging */ + void (*tlp_unmap)(struct kvm *kvm, gfn_t gfn); }; =20 extern struct kvm_x86_ops *kvm_x86_ops; =2D-=20 debian.1.5.3.7.1-dirty --Boundary-00=_CetoHaeIR9xbQ2R Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ --Boundary-00=_CetoHaeIR9xbQ2R Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ kvm-devel mailing list kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org https://lists.sourceforge.net/lists/listinfo/kvm-devel --Boundary-00=_CetoHaeIR9xbQ2R--