From patchwork Fri Apr 24 12:03:04 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joerg Roedel X-Patchwork-Id: 19806 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n3OC3rUI025533 for ; Fri, 24 Apr 2009 12:03:53 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755967AbZDXMDS (ORCPT ); Fri, 24 Apr 2009 08:03:18 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1755736AbZDXMDS (ORCPT ); Fri, 24 Apr 2009 08:03:18 -0400 Received: from tx2ehsobe003.messaging.microsoft.com ([65.55.88.13]:38690 "EHLO TX2EHSOBE005.bigfish.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754156AbZDXMDQ (ORCPT ); Fri, 24 Apr 2009 08:03:16 -0400 Received: from mail133-tx2-R.bigfish.com (10.9.14.243) by TX2EHSOBE005.bigfish.com (10.9.40.25) with Microsoft SMTP Server id 8.1.340.0; Fri, 24 Apr 2009 12:03:16 +0000 Received: from mail133-tx2 (localhost.localdomain [127.0.0.1]) by mail133-tx2-R.bigfish.com (Postfix) with ESMTP id 1D3C217E0216; Fri, 24 Apr 2009 12:03:16 +0000 (UTC) X-BigFish: VPS1(zzzz1202hzzz32i) X-FB-SS: 5,13, Received: by mail133-tx2 (MessageSwitch) id 1240574594268306_307; Fri, 24 Apr 2009 12:03:14 +0000 (UCT) Received: from ausb3extmailp02.amd.com (ausb3extmailp02.amd.com [163.181.251.22]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail133-tx2.bigfish.com (Postfix) with ESMTP id 143281308046; Fri, 24 Apr 2009 12:03:13 +0000 (UTC) Received: from ausb3twp02.amd.com ([163.181.250.38]) by ausb3extmailp02.amd.com (Switch-3.2.7/Switch-3.2.7) with ESMTP id n3OC39LX021790; Fri, 24 Apr 2009 07:03:12 -0500 X-WSS-ID: 0KILTH2-02-NM3-01 Received: from sausexbh2.amd.com (SAUSEXBH2.amd.com [163.181.22.102]) by ausb3twp02.amd.com (Tumbleweed MailGate 3.5.1) with ESMTP id 241A516A03F1; Fri, 24 Apr 2009 07:03:02 -0500 (CDT) Received: from sausexmb5.amd.com ([163.181.49.129]) by sausexbh2.amd.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 24 Apr 2009 07:03:07 -0500 Received: from SDRSEXMB1.amd.com ([172.20.3.116]) by sausexmb5.amd.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 24 Apr 2009 07:03:07 -0500 Received: from seurexmb1.amd.com ([165.204.82.130]) by SDRSEXMB1.amd.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 24 Apr 2009 14:03:04 +0200 Received: from lemmy.amd.com ([165.204.15.93]) by seurexmb1.amd.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 24 Apr 2009 14:03:04 +0200 Received: by lemmy.amd.com (Postfix, from userid 41430) id 46543CA373; Fri, 24 Apr 2009 14:03:04 +0200 (CEST) From: Joerg Roedel To: Avi Kivity , Marcelo Tosatti CC: , Joerg Roedel Subject: [PATCH] kvm/qemu: set gbpages cpuid bit if kvm supports it Date: Fri, 24 Apr 2009 14:03:04 +0200 Message-ID: <1240574584-22089-1-git-send-email-joerg.roedel@amd.com> X-Mailer: git-send-email 1.6.2.3 X-OriginalArrivalTime: 24 Apr 2009 12:03:04.0458 (UTC) FILETIME=[9F7BEEA0:01C9C4D4] MIME-Version: 1.0 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org This patch contains the userspace part necessary to make use of the KVM 1GB page support. Signed-off-by: Joerg Roedel --- libkvm/libkvm.c | 9 +++++++++ libkvm/libkvm.h | 1 + qemu/qemu-kvm.c | 6 ++++++ qemu/qemu-kvm.h | 3 +++ qemu/qemu-options.hx | 2 ++ qemu/target-i386/helper.c | 4 ++++ qemu/vl.c | 4 ++++ 7 files changed, 29 insertions(+), 0 deletions(-) diff --git a/libkvm/libkvm.c b/libkvm/libkvm.c index 0610e3f..a699fe9 100644 --- a/libkvm/libkvm.c +++ b/libkvm/libkvm.c @@ -1065,6 +1065,15 @@ int kvm_has_sync_mmu(kvm_context_t kvm) return r; } +int kvm_has_gbpages(kvm_context_t kvm) +{ + int r = 0; +#ifdef KVM_CAP_1GB_PAGES + r = ioctl(kvm->fd, KVM_CHECK_EXTENSION, KVM_CAP_1GB_PAGES); +#endif + return r; +} + int kvm_inject_nmi(kvm_context_t kvm, int vcpu) { #ifdef KVM_CAP_USER_NMI diff --git a/libkvm/libkvm.h b/libkvm/libkvm.h index d3e431a..efbc23e 100644 --- a/libkvm/libkvm.h +++ b/libkvm/libkvm.h @@ -558,6 +558,7 @@ int kvm_dirty_pages_log_reset(kvm_context_t kvm); int kvm_irqchip_in_kernel(kvm_context_t kvm); int kvm_has_sync_mmu(kvm_context_t kvm); +int kvm_has_gbpages(kvm_context_t kvm); #ifdef KVM_CAP_IRQCHIP /*! diff --git a/qemu/qemu-kvm.c b/qemu/qemu-kvm.c index ed76367..bae0639 100644 --- a/qemu/qemu-kvm.c +++ b/qemu/qemu-kvm.c @@ -33,6 +33,7 @@ int kvm_irqchip = 1; int kvm_pit = 1; int kvm_pit_reinject = 1; int kvm_nested = 0; +int kvm_gb_pages = 0; kvm_context_t kvm_context; pthread_mutex_t qemu_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -1401,6 +1402,11 @@ int qemu_kvm_has_sync_mmu(void) return kvm_has_sync_mmu(kvm_context); } +int qemu_kvm_has_gbpages() +{ + return kvm_has_gbpages(kvm_context); +} + void qemu_kvm_cpu_stop(CPUState *env) { if (kvm_enabled()) diff --git a/qemu/qemu-kvm.h b/qemu/qemu-kvm.h index ca59af8..6f2d99f 100644 --- a/qemu/qemu-kvm.h +++ b/qemu/qemu-kvm.h @@ -151,6 +151,7 @@ extern int kvm_irqchip; extern int kvm_pit; extern int kvm_pit_reinject; extern int kvm_nested; +extern int kvm_gb_pages; extern kvm_context_t kvm_context; struct ioperm_data { @@ -161,6 +162,7 @@ struct ioperm_data { }; int qemu_kvm_has_sync_mmu(void); +int qemu_kvm_has_gbpages(void); void qemu_kvm_cpu_stop(CPUState *env); #define kvm_enabled() (kvm_allowed) @@ -172,6 +174,7 @@ void kvm_load_tsc(CPUState *env); #else #define kvm_enabled() (0) #define kvm_nested 0 +#define kvm_gb_pages 0 #define qemu_kvm_irqchip_in_kernel() (0) #define qemu_kvm_pit_in_kernel() (0) #define kvm_has_sync_mmu() (0) diff --git a/qemu/qemu-options.hx b/qemu/qemu-options.hx index ba7f291..ccc1769 100644 --- a/qemu/qemu-options.hx +++ b/qemu/qemu-options.hx @@ -1490,6 +1490,8 @@ DEF("pcidevice", HAS_ARG, QEMU_OPTION_pcidevice, #endif DEF("enable-nesting", 0, QEMU_OPTION_enable_nesting, "-enable-nesting enable support for running a VM inside the VM (AMD only)\n") +DEF("enable-gb-pages", 0, QEMU_OPTION_enable_gb_pages, + "-enable-gb-pages enable GB pages in the guest (if host supports it)\n") DEF("cpu-vendor", HAS_ARG, QEMU_OPTION_cpu_vendor, "-cpu-vendor STRING override the cpuid vendor string\n") DEF("nvram", HAS_ARG, QEMU_OPTION_nvram, diff --git a/qemu/target-i386/helper.c b/qemu/target-i386/helper.c index be7b021..78a5db5 100644 --- a/qemu/target-i386/helper.c +++ b/qemu/target-i386/helper.c @@ -1585,6 +1585,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count, *ecx &= ~4UL; /* 3dnow */ *edx &= ~0xc0000000; +#ifdef USE_KVM + if (qemu_kvm_has_gbpages() && kvm_gb_pages) + *edx |= CPUID_EXT2_PDPE1GB; +#endif } break; case 0x80000002: diff --git a/qemu/vl.c b/qemu/vl.c index 8aa9ebc..ac28fc4 100644 --- a/qemu/vl.c +++ b/qemu/vl.c @@ -5024,6 +5024,10 @@ int main(int argc, char **argv, char **envp) kvm_nested = 1; break; } + case QEMU_OPTION_enable_gb_pages: { + kvm_gb_pages = 1; + break; + } #if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(TARGET_IA64) || defined(__linux__) case QEMU_OPTION_pcidevice: if (assigned_devices_index >= MAX_DEV_ASSIGN_CMDLINE) {