From: Jan Kiszka <jan.kiszka@siemens.com>
To: Avi Kivity <avi@redhat.com>, Marcelo Tosatti <mtosatti@redhat.com>
Cc: kvm <kvm@vger.kernel.org>
Subject: [PATCH] qemu-kvm: Switch to upstream in-kernel KVM PIT
Date: Mon, 23 Apr 2012 10:47:14 +0200 [thread overview]
Message-ID: <4F951712.7050101@siemens.com> (raw)
The upstream version provides the same feature plus proper support for
the PC speaker port while the in-kernel PIT is enabled.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
A cleanup patch will follow once the _kvm_arch_init_vcpu thing is
resolved.
Makefile.objs | 3 +-
Makefile.target | 2 -
configure | 11 -----
hw/hpet.c | 1 -
hw/i8254-kvm.c | 114 -----------------------------------------------------
hw/i8254.c | 19 ---------
hw/i8254.h | 6 ---
hw/i8254_common.c | 2 +-
hw/pc.c | 4 +-
vl.c | 13 ++++++-
10 files changed, 16 insertions(+), 159 deletions(-)
delete mode 100644 hw/i8254-kvm.c
diff --git a/Makefile.objs b/Makefile.objs
index e1509f1..a166112 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -227,8 +227,7 @@ hw-obj-$(CONFIG_EMPTY_SLOT) += empty_slot.o
hw-obj-$(CONFIG_SERIAL) += serial.o
hw-obj-$(CONFIG_PARALLEL) += parallel.o
-# Moved back to Makefile.target due to #include qemu-kvm.h:
-#hw-obj-$(CONFIG_I8254) += i8254_common.o i8254.o
+hw-obj-$(CONFIG_I8254) += i8254_common.o i8254.o
hw-obj-$(CONFIG_PCSPK) += pcspk.o
hw-obj-$(CONFIG_PCKBD) += pckbd.o
hw-obj-$(CONFIG_USB_UHCI) += usb/hcd-uhci.o
diff --git a/Makefile.target b/Makefile.target
index 5c74f88..7ed7535 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -253,7 +253,6 @@ obj-i386-$(CONFIG_SPICE) += qxl.o qxl-logger.o qxl-render.o
obj-i386-y += testdev.o
obj-i386-y += acpi.o acpi_piix4.o
-obj-i386-y += i8254_common.o i8254.o
obj-i386-$(CONFIG_KVM_DEVICE_ASSIGNMENT) += device-assignment.o
# shared objects
@@ -310,7 +309,6 @@ obj-lm32-y += milkymist-vgafb.o
obj-lm32-y += framebuffer.o
obj-mips-y = mips_r4k.o mips_jazz.o mips_malta.o mips_mipssim.o
-obj-mips-y += i8254_common.o i8254.o
obj-mips-y += acpi.o acpi_piix4.o
obj-mips-y += mips_addr.o mips_timer.o mips_int.o
obj-mips-y += gt64xxx.o mc146818rtc.o
diff --git a/configure b/configure
index b1640f0..f69e08fd 100755
--- a/configure
+++ b/configure
@@ -188,7 +188,6 @@ bsd_user="no"
guest_base=""
uname_release=""
mixemu="no"
-kvm_cap_pit="yes"
kvm_cap_device_assignment="yes"
aix="no"
blobs="yes"
@@ -710,10 +709,6 @@ for opt do
;;
--enable-tcg-interpreter) tcg_interpreter="yes"
;;
- --disable-kvm-pit) kvm_cap_pit="no"
- ;;
- --enable-kvm-pit) kvm_cap_pit="yes"
- ;;
--disable-kvm-device-assignment) kvm_cap_device_assignment="no"
;;
--enable-kvm-device-assignment) kvm_cap_device_assignment="yes"
@@ -1078,8 +1073,6 @@ echo " --disable-slirp disable SLIRP userspace network connectivity"
echo " --disable-kvm disable KVM acceleration support"
echo " --enable-kvm enable KVM acceleration support"
echo " --enable-tcg-interpreter enable TCG with bytecode interpreter (TCI)"
-echo " --disable-kvm-pit disable KVM pit support"
-echo " --enable-kvm-pit enable KVM pit support"
echo " --disable-kvm-device-assignment disable KVM device assignment support"
echo " --enable-kvm-device-assignment enable KVM device assignment support"
echo " --disable-nptl disable usermode NPTL support"
@@ -2959,7 +2952,6 @@ echo "ATTR/XATTR support $attr"
echo "Install blobs $blobs"
echo "KVM support $kvm"
echo "TCG interpreter $tcg_interpreter"
-echo "KVM PIT support $kvm_cap_pit"
echo "KVM device assig. $kvm_cap_device_assignment"
echo "fdt support $fdt"
echo "preadv support $preadv"
@@ -3677,9 +3669,6 @@ case "$target_arch2" in
if test "$vhost_net" = "yes" ; then
echo "CONFIG_VHOST_NET=y" >> $config_target_mak
fi
- if test $kvm_cap_pit = "yes" ; then
- echo "CONFIG_KVM_PIT=y" >> $config_target_mak
- fi
if test $kvm_cap_device_assignment = "yes" ; then
echo "CONFIG_KVM_DEVICE_ASSIGNMENT=y" >> $config_target_mak
fi
diff --git a/hw/hpet.c b/hw/hpet.c
index 51074b7..fd3ddca 100644
--- a/hw/hpet.c
+++ b/hw/hpet.c
@@ -239,7 +239,6 @@ static int hpet_post_load(void *opaque, int version_id)
if (s->timer[0].config & HPET_TN_FSB_CAP) {
s->flags |= 1 << HPET_MSI_SUPPORT;
}
-
return 0;
}
diff --git a/hw/i8254-kvm.c b/hw/i8254-kvm.c
deleted file mode 100644
index 9da1c8b..0000000
--- a/hw/i8254-kvm.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * QEMU 8253/8254 interval timer emulation
- *
- * Copyright (c) 2003-2004 Fabrice Bellard
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-#ifdef CONFIG_KVM_PIT
-
-static void kvm_pit_pre_save(void *opaque)
-{
- PITCommonState *s = (void *)opaque;
- struct kvm_pit_state2 pit2;
- struct kvm_pit_channel_state *c;
- struct PITChannelState *sc;
- int i;
-
- if (kvm_has_pit_state2()) {
- kvm_get_pit2(kvm_state, &pit2);
- s->channels[0].irq_disabled = pit2.flags;
- } else {
- /* pit2 is superset of pit struct so just cast it and use it */
- kvm_get_pit(kvm_state, (struct kvm_pit_state *)&pit2);
- }
- for (i = 0; i < 3; i++) {
- c = &pit2.channels[i];
- sc = &s->channels[i];
- sc->count = c->count;
- sc->latched_count = c->latched_count;
- sc->count_latched = c->count_latched;
- sc->status_latched = c->status_latched;
- sc->status = c->status;
- sc->read_state = c->read_state;
- sc->write_state = c->write_state;
- sc->write_latch = c->write_latch;
- sc->rw_mode = c->rw_mode;
- sc->mode = c->mode;
- sc->bcd = c->bcd;
- sc->gate = c->gate;
- sc->count_load_time = c->count_load_time;
- }
-}
-
-static int kvm_pit_post_load(void *opaque, int version_id)
-{
- PITCommonState *s = opaque;
- struct kvm_pit_state2 pit2;
- struct kvm_pit_channel_state *c;
- struct PITChannelState *sc;
- int i;
-
- pit2.flags = s->channels[0].irq_disabled;
- for (i = 0; i < 3; i++) {
- c = &pit2.channels[i];
- sc = &s->channels[i];
- c->count = sc->count;
- c->latched_count = sc->latched_count;
- c->count_latched = sc->count_latched;
- c->status_latched = sc->status_latched;
- c->status = sc->status;
- c->read_state = sc->read_state;
- c->write_state = sc->write_state;
- c->write_latch = sc->write_latch;
- c->rw_mode = sc->rw_mode;
- c->mode = sc->mode;
- c->bcd = sc->bcd;
- c->gate = sc->gate;
- c->count_load_time = sc->count_load_time;
- }
-
- if (kvm_has_pit_state2()) {
- kvm_set_pit2(kvm_state, &pit2);
- } else {
- kvm_set_pit(kvm_state, (struct kvm_pit_state *)&pit2);
- }
- return 0;
-}
-
-static void dummy_timer(void *opaque)
-{
-}
-
-static void qemu_kvm_pit_init(PITCommonState *pit)
-{
- PITChannelState *s;
-
- if (kvm_create_pit(kvm_state) < 0) {
- hw_error("KVM PIT creation failed\n");
- }
- s = &pit->channels[0];
- s->irq_timer = qemu_new_timer_ns(vm_clock, dummy_timer, s);
- vmstate_pit_common.pre_save = kvm_pit_pre_save;
- vmstate_pit_common.post_load = kvm_pit_post_load;
- return;
-}
-
-#endif
diff --git a/hw/i8254.c b/hw/i8254.c
index 9604547..77bd5e8 100644
--- a/hw/i8254.c
+++ b/hw/i8254.c
@@ -25,7 +25,6 @@
#include "pc.h"
#include "isa.h"
#include "qemu-timer.h"
-#include "kvm.h"
#include "i8254.h"
#include "i8254_internal.h"
@@ -38,10 +37,6 @@
static void pit_irq_timer_update(PITChannelState *s, int64_t current_time);
-#ifdef CONFIG_KVM_PIT
-static void qemu_kvm_pit_init(PITCommonState *pit);
-#endif
-
static int pit_get_count(PITChannelState *s)
{
uint64_t d;
@@ -266,8 +261,6 @@ static void pit_irq_timer(void *opaque)
pit_irq_timer_update(s, s->next_transition_time);
}
-extern VMStateDescription vmstate_pit_common;
-
static void pit_reset(DeviceState *dev)
{
PITCommonState *pit = DO_UPCAST(PITCommonState, dev.qdev, dev);
@@ -279,9 +272,6 @@ static void pit_reset(DeviceState *dev)
if (!s->irq_disabled) {
qemu_mod_timer(s->irq_timer, s->next_transition_time);
}
- if (vmstate_pit_common.post_load) {
- vmstate_pit_common.post_load(pit, 2);
- }
}
/* When HPET is operating in legacy mode, suppress the ignored timer IRQ,
@@ -325,13 +315,6 @@ static int pit_initfn(PITCommonState *pit)
{
PITChannelState *s;
-#ifdef CONFIG_KVM_PIT
- if (kvm_enabled() && kvm_irqchip_in_kernel()) {
- qemu_kvm_pit_init(pit);
- return 0;
- }
-#endif
-
s = &pit->channels[0];
/* the timer 0 is connected to an IRQ */
s->irq_timer = qemu_new_timer_ns(vm_clock, pit_irq_timer, s);
@@ -375,5 +358,3 @@ static void pit_register_types(void)
}
type_init(pit_register_types)
-
-#include "i8254-kvm.c"
diff --git a/hw/i8254.h b/hw/i8254.h
index 933866d..ba6b598 100644
--- a/hw/i8254.h
+++ b/hw/i8254.h
@@ -27,7 +27,6 @@
#include "hw.h"
#include "isa.h"
-#include "kvm.h"
#define PIT_FREQ 1193182
@@ -46,11 +45,6 @@ static inline ISADevice *pit_init(ISABus *bus, int base, int isa_irq,
dev = isa_create(bus, "isa-pit");
qdev_prop_set_uint32(&dev->qdev, "iobase", base);
qdev_init_nofail(&dev->qdev);
-
- if (kvm_enabled() && kvm_irqchip_in_kernel()) {
- return dev;
- }
-
qdev_connect_gpio_out(&dev->qdev, 0,
isa_irq >= 0 ? isa_get_irq(dev, isa_irq) : alt_irq);
diff --git a/hw/i8254_common.c b/hw/i8254_common.c
index e2e11b5..b01ad70 100644
--- a/hw/i8254_common.c
+++ b/hw/i8254_common.c
@@ -266,7 +266,7 @@ static int pit_dispatch_post_load(void *opaque, int version_id)
return 0;
}
-VMStateDescription vmstate_pit_common = {
+static const VMStateDescription vmstate_pit_common = {
.name = "i8254",
.version_id = 3,
.minimum_version_id = 2,
diff --git a/hw/pc.c b/hw/pc.c
index feb6ef3..edfeed1 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -907,7 +907,7 @@ static DeviceState *apic_init(void *env, uint8_t apic_id)
apic_mapped = 1;
}
-#ifdef UNUSED_UPSTREAM_KVM
+#ifdef UPSTREAM_KVM
/* KVM does not support MSI yet. */
if (!kvm_irqchip_in_kernel()) {
msi_supported = true;
@@ -1127,7 +1127,7 @@ void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
} else {
pit = pit_init(isa_bus, 0x40, pit_isa_irq, pit_alt_irq);
}
- if (hpet && !(kvm_enabled() && kvm_irqchip_in_kernel())) {
+ if (hpet) {
/* connect PIT to output control line of the HPET */
qdev_connect_gpio_out(hpet, 0, qdev_get_gpio_in(&pit->qdev, 0));
}
diff --git a/vl.c b/vl.c
index fccf647..e857b68 100644
--- a/vl.c
+++ b/vl.c
@@ -2986,7 +2986,18 @@ int main(int argc, char **argv, char **envp)
break;
}
case QEMU_OPTION_no_kvm_pit_reinjection: {
- kvm_pit_reinject = 0;
+ static GlobalProperty kvm_pit_lost_tick_policy[] = {
+ {
+ .driver = "kvm-pit",
+ .property = "lost_tick_policy",
+ .value = "discard",
+ },
+ { /* end of list */ }
+ };
+
+ fprintf(stderr, "Warning: option deprecated, use "
+ "lost_tick_policy property of kvm-pit instead.\n");
+ qdev_prop_register_global_list(kvm_pit_lost_tick_policy);
break;
}
#endif
--
1.7.3.4
next reply other threads:[~2012-04-23 8:47 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-04-23 8:47 Jan Kiszka [this message]
2012-04-24 14:13 ` [PATCH] qemu-kvm: Switch to upstream in-kernel KVM PIT 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=4F951712.7050101@siemens.com \
--to=jan.kiszka@siemens.com \
--cc=avi@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=mtosatti@redhat.com \
/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.