* [PATCH 2/2] kvm: libkvm/qemu: Support in-kernel PIT model
@ 2008-01-28 6:46 Yang, Sheng
[not found] ` <200801281446.30147.sheng.yang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
0 siblings, 1 reply; 2+ messages in thread
From: Yang, Sheng @ 2008-01-28 6:46 UTC (permalink / raw)
To: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
[-- 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
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH 2/2] kvm: libkvm/qemu: Support in-kernel PIT model
[not found] ` <200801281446.30147.sheng.yang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
@ 2008-01-28 12:00 ` Avi Kivity
0 siblings, 0 replies; 2+ messages in thread
From: Avi Kivity @ 2008-01-28 12:00 UTC (permalink / raw)
To: Yang, Sheng; +Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
Yang, Sheng wrote:
> +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");
> + }
> + }
> +}
>
>
Need to protect this with #ifdef KVM_CAP_PIT to support compilation with
older kernels. If support is not available, qemu should fall back to
userspace pit.
Please separate the qemu and libkvm parts.
--
error compiling committee.c: too many arguments to function
-------------------------------------------------------------------------
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/
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2008-01-28 12:00 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-01-28 6:46 [PATCH 2/2] kvm: libkvm/qemu: Support in-kernel PIT model Yang, Sheng
[not found] ` <200801281446.30147.sheng.yang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2008-01-28 12:00 ` Avi Kivity
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox