All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Yang, Sheng" <sheng.yang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
To: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Subject: [PATCH 2/2] kvm: libkvm/qemu: Support in-kernel PIT model
Date: Mon, 28 Jan 2008 14:46:30 +0800	[thread overview]
Message-ID: <200801281446.30147.sheng.yang@intel.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 5511 bytes --]

From 953edae7758f8414cc8de7edfc21699e6edc39cf Mon Sep 17 00:00:00 2001
From: Sheng Yang <sheng.yang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Date: Sun, 27 Jan 2008 11:25:29 +0800
Subject: [PATCH] kvm: libkvm/qemu: Support in-kernel PIT model

Add QEMU parameter for in-kernel PIT. Also disable userspace PIT when we using 
the in-kernel one.

Signed-off-by: Sheng Yang <sheng.yang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
---
 kernel/Kbuild       |    2 +-
 libkvm/kvm-common.h |    2 ++
 libkvm/libkvm.c     |   20 ++++++++++++++++++++
 qemu/hw/pc.c        |    6 ++++++
 qemu/qemu-kvm.c     |    4 ++++
 qemu/qemu-kvm.h     |    1 +
 qemu/vl.c           |    6 ++++++
 7 files changed, 40 insertions(+), 1 deletions(-)

diff --git a/kernel/Kbuild b/kernel/Kbuild
index ed02f5a..014cc17 100644
--- a/kernel/Kbuild
+++ b/kernel/Kbuild
@@ -1,7 +1,7 @@
 EXTRA_CFLAGS := -I$(src)/include -include $(src)/external-module-compat.h
 obj-m := kvm.o kvm-intel.o kvm-amd.o
 kvm-objs := kvm_main.o x86.o mmu.o x86_emulate.o anon_inodes.o irq.o i8259.o 
\
-	 lapic.o ioapic.o preempt.o
+	 lapic.o ioapic.o preempt.o i8254.o
 kvm-intel-objs := vmx.o vmx-debug.o
 kvm-amd-objs := svm.o

diff --git a/libkvm/kvm-common.h b/libkvm/kvm-common.h
index f4040be..bd9f1de 100644
--- a/libkvm/kvm-common.h
+++ b/libkvm/kvm-common.h
@@ -47,6 +47,8 @@ struct kvm_context {
 	int no_irqchip_creation;
 	/// in-kernel irqchip status
 	int irqchip_in_kernel;
+	/// do not create in-kernel pit if set
+	int no_pit_creation;
 };

 void init_slots(void);
diff --git a/libkvm/libkvm.c b/libkvm/libkvm.c
index 45f58d6..15e7c0d 100644
--- a/libkvm/libkvm.c
+++ b/libkvm/libkvm.c
@@ -271,6 +271,11 @@ void kvm_disable_irqchip_creation(kvm_context_t kvm)
 	kvm->no_irqchip_creation = 1;
 }

+void kvm_disable_pit_creation(kvm_context_t kvm)
+{
+	kvm->no_pit_creation = 1;
+}
+
 int kvm_create_vcpu(kvm_context_t kvm, int slot)
 {
 	long mmap_size;
@@ -368,6 +373,20 @@ void kvm_create_irqchip(kvm_context_t kvm)
 #endif
 }

+void kvm_create_pit(kvm_context_t kvm)
+{
+	int r;
+
+	if (!kvm->no_pit_creation) {
+		r = ioctl(kvm->fd, KVM_CHECK_EXTENSION, KVM_CAP_PIT);
+		if (r > 0) {
+			r = ioctl(kvm->vm_fd, KVM_CREATE_PIT);
+			if (r < 0)
+				printf("Create kernel PIC irqchip failed\n");
+		}
+	}
+}
+
 int kvm_create(kvm_context_t kvm, unsigned long phys_mem_bytes, void 
**vm_mem)
 {
 	int r;
@@ -383,6 +402,7 @@ int kvm_create(kvm_context_t kvm, unsigned long 
phys_mem_bytes, void **vm_mem)
 	if (r < 0)
 	        return r;
 	kvm_create_irqchip(kvm);
+	kvm_create_pit(kvm);
 	r = kvm_create_vcpu(kvm, 0);
 	if (r < 0)
 		return r;
diff --git a/qemu/hw/pc.c b/qemu/hw/pc.c
index 652b263..b4aecfe 100644
--- a/qemu/hw/pc.c
+++ b/qemu/hw/pc.c
@@ -986,8 +986,14 @@ static void pc_init1(ram_addr_t ram_size, int 
vga_ram_size,
     if (pci_enabled) {
         ioapic = ioapic_init();
     }
+#ifdef USE_KVM
+    if (!kvm_allowed || !kvm_pit) {
+#endif
     pit = pit_init(0x40, i8259[0]);
     pcspk_init(pit);
+#ifdef USE_KVM
+    }
+#endif
     if (pci_enabled) {
         pic_set_alt_irq_func(isa_pic, ioapic_set_irq, ioapic);
     }
diff --git a/qemu/qemu-kvm.c b/qemu/qemu-kvm.c
index ba4fd21..66eaf51 100644
--- a/qemu/qemu-kvm.c
+++ b/qemu/qemu-kvm.c
@@ -10,6 +10,7 @@

 int kvm_allowed = KVM_ALLOWED_DEFAULT;
 int kvm_irqchip = 1;
+int kvm_pit = 1;

 #ifdef USE_KVM

@@ -535,6 +536,9 @@ int kvm_qemu_create_context(void)
     if (!kvm_irqchip) {
         kvm_disable_irqchip_creation(kvm_context);
     }
+    if (!kvm_pit) {
+        kvm_disable_pit_creation(kvm_context);
+    }
     if (kvm_create(kvm_context, phys_ram_size, (void**)&phys_ram_base) < 0) {
 	kvm_qemu_destroy();
 	return -1;
diff --git a/qemu/qemu-kvm.h b/qemu/qemu-kvm.h
index bda1c0b..56aae6e 100644
--- a/qemu/qemu-kvm.h
+++ b/qemu/qemu-kvm.h
@@ -46,6 +46,7 @@ void qemu_kvm_aio_wait_end(void);

 extern int kvm_allowed;
 extern int kvm_irqchip;
+extern int kvm_pit;

 void kvm_tpr_opt_setup(CPUState *env);
 void kvm_tpr_access_report(CPUState *env, uint64_t rip, int is_write);
diff --git a/qemu/vl.c b/qemu/vl.c
index 756e13d..5b76c8d 100644
--- a/qemu/vl.c
+++ b/qemu/vl.c
@@ -8015,6 +8015,7 @@ static void help(int exitcode)
 #ifdef USE_KVM
 	   "-no-kvm         disable KVM hardware virtualization\n"
 	   "-no-kvm-irqchip disable KVM kernel mode PIC/IOAPIC/LAPIC\n"
+	   "-no-kvm-pit	    disable KVM kernel mode PIT\n"
 #endif
 #ifdef TARGET_I386
            "-std-vga        simulate a standard VGA card with VESA Bochs 
Extensions\n"
@@ -8131,6 +8132,7 @@ enum {
     QEMU_OPTION_no_acpi,
     QEMU_OPTION_no_kvm,
     QEMU_OPTION_no_kvm_irqchip,
+    QEMU_OPTION_no_kvm_pit,
     QEMU_OPTION_no_reboot,
     QEMU_OPTION_show_cursor,
     QEMU_OPTION_daemonize,
@@ -8213,6 +8215,7 @@ const QEMUOption qemu_options[] = {
 #ifdef USE_KVM
     { "no-kvm", 0, QEMU_OPTION_no_kvm },
     { "no-kvm-irqchip", 0, QEMU_OPTION_no_kvm_irqchip },
+    { "no-kvm-pit", 0, QEMU_OPTION_no_kvm_pit },
 #endif
 #if defined(TARGET_PPC) || defined(TARGET_SPARC)
     { "g", 1, QEMU_OPTION_g },
@@ -9046,6 +9049,9 @@ int main(int argc, char **argv)
 	    case QEMU_OPTION_no_kvm_irqchip:
 		kvm_irqchip = 0;
 		break;
+	    case QEMU_OPTION_no_kvm_pit:
+		kvm_pit = 0;
+		break;
 #endif
             case QEMU_OPTION_usb:
                 usb_enabled = 1;
--
debian.1.5.3.7.1-dirty


[-- Attachment #2: 0001-kvm-libkvm-qemu-Support-in-kernel-PIT-model.patch --]
[-- Type: text/x-diff, Size: 5509 bytes --]

From 953edae7758f8414cc8de7edfc21699e6edc39cf Mon Sep 17 00:00:00 2001
From: Sheng Yang <sheng.yang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Date: Sun, 27 Jan 2008 11:25:29 +0800
Subject: [PATCH] kvm: libkvm/qemu: Support in-kernel PIT model

Add QEMU parameter for in-kernel PIT. Also disable userspace PIT when we using the in-kernel one.

Signed-off-by: Sheng Yang <sheng.yang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
---
 kernel/Kbuild       |    2 +-
 libkvm/kvm-common.h |    2 ++
 libkvm/libkvm.c     |   20 ++++++++++++++++++++
 qemu/hw/pc.c        |    6 ++++++
 qemu/qemu-kvm.c     |    4 ++++
 qemu/qemu-kvm.h     |    1 +
 qemu/vl.c           |    6 ++++++
 7 files changed, 40 insertions(+), 1 deletions(-)

diff --git a/kernel/Kbuild b/kernel/Kbuild
index ed02f5a..014cc17 100644
--- a/kernel/Kbuild
+++ b/kernel/Kbuild
@@ -1,7 +1,7 @@
 EXTRA_CFLAGS := -I$(src)/include -include $(src)/external-module-compat.h
 obj-m := kvm.o kvm-intel.o kvm-amd.o
 kvm-objs := kvm_main.o x86.o mmu.o x86_emulate.o anon_inodes.o irq.o i8259.o \
-	 lapic.o ioapic.o preempt.o
+	 lapic.o ioapic.o preempt.o i8254.o
 kvm-intel-objs := vmx.o vmx-debug.o
 kvm-amd-objs := svm.o
 
diff --git a/libkvm/kvm-common.h b/libkvm/kvm-common.h
index f4040be..bd9f1de 100644
--- a/libkvm/kvm-common.h
+++ b/libkvm/kvm-common.h
@@ -47,6 +47,8 @@ struct kvm_context {
 	int no_irqchip_creation;
 	/// in-kernel irqchip status
 	int irqchip_in_kernel;
+	/// do not create in-kernel pit if set
+	int no_pit_creation;
 };
 
 void init_slots(void);
diff --git a/libkvm/libkvm.c b/libkvm/libkvm.c
index 45f58d6..15e7c0d 100644
--- a/libkvm/libkvm.c
+++ b/libkvm/libkvm.c
@@ -271,6 +271,11 @@ void kvm_disable_irqchip_creation(kvm_context_t kvm)
 	kvm->no_irqchip_creation = 1;
 }
 
+void kvm_disable_pit_creation(kvm_context_t kvm)
+{
+	kvm->no_pit_creation = 1;
+}
+
 int kvm_create_vcpu(kvm_context_t kvm, int slot)
 {
 	long mmap_size;
@@ -368,6 +373,20 @@ void kvm_create_irqchip(kvm_context_t kvm)
 #endif
 }
 
+void kvm_create_pit(kvm_context_t kvm)
+{
+	int r;
+
+	if (!kvm->no_pit_creation) {
+		r = ioctl(kvm->fd, KVM_CHECK_EXTENSION, KVM_CAP_PIT);
+		if (r > 0) {
+			r = ioctl(kvm->vm_fd, KVM_CREATE_PIT);
+			if (r < 0)
+				printf("Create kernel PIC irqchip failed\n");
+		}
+	}
+}
+
 int kvm_create(kvm_context_t kvm, unsigned long phys_mem_bytes, void **vm_mem)
 {
 	int r;
@@ -383,6 +402,7 @@ int kvm_create(kvm_context_t kvm, unsigned long phys_mem_bytes, void **vm_mem)
 	if (r < 0)
 	        return r;
 	kvm_create_irqchip(kvm);
+	kvm_create_pit(kvm);
 	r = kvm_create_vcpu(kvm, 0);
 	if (r < 0)
 		return r;
diff --git a/qemu/hw/pc.c b/qemu/hw/pc.c
index 652b263..b4aecfe 100644
--- a/qemu/hw/pc.c
+++ b/qemu/hw/pc.c
@@ -986,8 +986,14 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size,
     if (pci_enabled) {
         ioapic = ioapic_init();
     }
+#ifdef USE_KVM
+    if (!kvm_allowed || !kvm_pit) {
+#endif
     pit = pit_init(0x40, i8259[0]);
     pcspk_init(pit);
+#ifdef USE_KVM
+    }
+#endif
     if (pci_enabled) {
         pic_set_alt_irq_func(isa_pic, ioapic_set_irq, ioapic);
     }
diff --git a/qemu/qemu-kvm.c b/qemu/qemu-kvm.c
index ba4fd21..66eaf51 100644
--- a/qemu/qemu-kvm.c
+++ b/qemu/qemu-kvm.c
@@ -10,6 +10,7 @@
 
 int kvm_allowed = KVM_ALLOWED_DEFAULT;
 int kvm_irqchip = 1;
+int kvm_pit = 1;
 
 #ifdef USE_KVM
 
@@ -535,6 +536,9 @@ int kvm_qemu_create_context(void)
     if (!kvm_irqchip) {
         kvm_disable_irqchip_creation(kvm_context);
     }
+    if (!kvm_pit) {
+        kvm_disable_pit_creation(kvm_context);
+    }
     if (kvm_create(kvm_context, phys_ram_size, (void**)&phys_ram_base) < 0) {
 	kvm_qemu_destroy();
 	return -1;
diff --git a/qemu/qemu-kvm.h b/qemu/qemu-kvm.h
index bda1c0b..56aae6e 100644
--- a/qemu/qemu-kvm.h
+++ b/qemu/qemu-kvm.h
@@ -46,6 +46,7 @@ void qemu_kvm_aio_wait_end(void);
 
 extern int kvm_allowed;
 extern int kvm_irqchip;
+extern int kvm_pit;
 
 void kvm_tpr_opt_setup(CPUState *env);
 void kvm_tpr_access_report(CPUState *env, uint64_t rip, int is_write);
diff --git a/qemu/vl.c b/qemu/vl.c
index 756e13d..5b76c8d 100644
--- a/qemu/vl.c
+++ b/qemu/vl.c
@@ -8015,6 +8015,7 @@ static void help(int exitcode)
 #ifdef USE_KVM
 	   "-no-kvm         disable KVM hardware virtualization\n"
 	   "-no-kvm-irqchip disable KVM kernel mode PIC/IOAPIC/LAPIC\n"
+	   "-no-kvm-pit	    disable KVM kernel mode PIT\n"
 #endif
 #ifdef TARGET_I386
            "-std-vga        simulate a standard VGA card with VESA Bochs Extensions\n"
@@ -8131,6 +8132,7 @@ enum {
     QEMU_OPTION_no_acpi,
     QEMU_OPTION_no_kvm,
     QEMU_OPTION_no_kvm_irqchip,
+    QEMU_OPTION_no_kvm_pit,
     QEMU_OPTION_no_reboot,
     QEMU_OPTION_show_cursor,
     QEMU_OPTION_daemonize,
@@ -8213,6 +8215,7 @@ const QEMUOption qemu_options[] = {
 #ifdef USE_KVM
     { "no-kvm", 0, QEMU_OPTION_no_kvm },
     { "no-kvm-irqchip", 0, QEMU_OPTION_no_kvm_irqchip },
+    { "no-kvm-pit", 0, QEMU_OPTION_no_kvm_pit },
 #endif
 #if defined(TARGET_PPC) || defined(TARGET_SPARC)
     { "g", 1, QEMU_OPTION_g },
@@ -9046,6 +9049,9 @@ int main(int argc, char **argv)
 	    case QEMU_OPTION_no_kvm_irqchip:
 		kvm_irqchip = 0;
 		break;
+	    case QEMU_OPTION_no_kvm_pit:
+		kvm_pit = 0;
+		break;
 #endif
             case QEMU_OPTION_usb:
                 usb_enabled = 1;
-- 
debian.1.5.3.7.1-dirty


[-- Attachment #3: Type: text/plain, Size: 228 bytes --]

-------------------------------------------------------------------------
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/

[-- Attachment #4: Type: text/plain, Size: 186 bytes --]

_______________________________________________
kvm-devel mailing list
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
https://lists.sourceforge.net/lists/listinfo/kvm-devel

             reply	other threads:[~2008-01-28  6:46 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-01-28  6:46 Yang, Sheng [this message]
     [not found] ` <200801281446.30147.sheng.yang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2008-01-28 12:00   ` [PATCH 2/2] kvm: libkvm/qemu: Support in-kernel PIT model Avi Kivity

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200801281446.30147.sheng.yang@intel.com \
    --to=sheng.yang-ral2jqcrhueavxtiumwx3w@public.gmane.org \
    --cc=kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.