1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
From d527b774878defc27f317cdde19b5c54fd0d5666 Mon Sep 17 00:00:00 2001
From: Jan Kiszka <jan.kiszka@siemens.com>
Date: Sun, 15 Jan 2012 12:06:12 +0100
Subject: [PATCH] qemu-kvm: Deprecate time drift fix
Remove this divergence from upstream. It is practically unused today as
the default mode is in-kernel irqchip. We keep the command line switch
for now, adding a warning that there is no effect anymore.
The feature can be reintroduced to upstream once we have IRQ paths with
feedback support.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
---
hw/i8254.c | 28 ++--------------------------
hw/i8259.c | 17 -----------------
qemu-options.hx | 4 ++--
vl.c | 4 ++--
4 files changed, 6 insertions(+), 47 deletions(-)
diff --git a/hw/i8254.c b/hw/i8254.c
index d73a5f2..50ecceb 100644
--- a/hw/i8254.c
+++ b/hw/i8254.c
@@ -347,11 +347,6 @@ static uint32_t pit_ioport_read(void *opaque, uint32_t addr)
return ret;
}
-/* global counters for time-drift fix */
-int64_t timer_acks=0, timer_interrupts=0, timer_ints_to_push=0;
-
-extern int time_drift_fix;
-
static void pit_irq_timer_update(PITChannelState *s, int64_t current_time)
{
int64_t expire_time;
@@ -362,35 +357,16 @@ static void pit_irq_timer_update(PITChannelState *s, int64_t current_time)
expire_time = pit_get_next_transition_time(s, current_time);
irq_level = pit_get_out1(s, current_time);
qemu_set_irq(s->irq, irq_level);
- if (time_drift_fix && irq_level==1) {
- /* FIXME: fine tune timer_max_fix (max fix per tick).
- * Should it be 1 (double time), 2 , 4, 10 ?
- * Currently setting it to 5% of PIT-ticks-per-second (per PIT-tick)
- */
- const long pit_ticks_per_sec = (s->count>0) ? (PIT_FREQ/s->count) : 0;
- const long timer_max_fix = pit_ticks_per_sec/20;
- const long delta = timer_interrupts - timer_acks;
- const long max_delta = pit_ticks_per_sec * 60; /* one minute */
- if ((delta > max_delta) && (pit_ticks_per_sec > 0)) {
- printf("time drift is too long, %ld seconds were lost\n", delta/pit_ticks_per_sec);
- timer_acks = timer_interrupts;
- timer_ints_to_push = 0;
- } else if (delta > 0) {
- timer_ints_to_push = MIN(delta, timer_max_fix);
- }
- timer_interrupts++;
- }
#ifdef DEBUG_PIT
printf("irq_level=%d next_delay=%f\n",
irq_level,
(double)(expire_time - current_time) / get_ticks_per_sec());
#endif
s->next_transition_time = expire_time;
- if (expire_time != -1) {
+ if (expire_time != -1)
qemu_mod_timer(s->irq_timer, expire_time);
- } else {
+ else
qemu_del_timer(s->irq_timer);
- }
}
static void pit_irq_timer(void *opaque)
diff --git a/hw/i8259.c b/hw/i8259.c
index 7e17071..0632ea2 100644
--- a/hw/i8259.c
+++ b/hw/i8259.c
@@ -210,9 +210,6 @@ static void pic_intack(PicState *s, int irq)
pic_update_irq(s);
}
-extern int time_drift_fix;
-extern int64_t timer_acks, timer_ints_to_push;
-
int pic_read_irq(PicState *s)
{
int irq, irq2, intno;
@@ -232,20 +229,6 @@ int pic_read_irq(PicState *s)
intno = s->irq_base + irq;
}
pic_intack(s, irq);
-
- /* FIXME: limit to x86, or better, to platforms where irq0 is the
- * timer interrupts. */
-
- if (time_drift_fix && s->master && irq == 0) {
- timer_acks++;
- if (timer_ints_to_push > 0) {
- timer_ints_to_push--;
- /* simulate an edge irq0, like the one generated by i8254 */
- pic_set_irq(s, 0, 0);
- pic_set_irq(s, 0, 1);
- }
- }
-
} else {
/* spurious IRQ on host controller */
irq = 7;
diff --git a/qemu-options.hx b/qemu-options.hx
index c645f87..d567ba3 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -2633,8 +2633,8 @@ DEF("no-kvm-pit-reinjection", 0, QEMU_OPTION_no_kvm_pit_reinjection,
"-no-kvm-pit-reinjection\n"
" disable KVM kernel mode PIT interrupt reinjection\n",
QEMU_ARCH_I386)
-DEF("tdf", 0, QEMU_OPTION_tdf,
- "-tdf enable guest time drift compensation\n", QEMU_ARCH_ALL)
+HXCOMM -tdf is deprecated and ignored today
+DEF("tdf", 0, QEMU_OPTION_tdf, "", QEMU_ARCH_ALL)
DEF("kvm-shadow-memory", HAS_ARG, QEMU_OPTION_kvm_shadow_memory,
"-kvm-shadow-memory MEGABYTES\n"
" allocate MEGABYTES for kvm mmu shadowing\n",
diff --git a/vl.c b/vl.c
index c009eb8..1a77de1 100644
--- a/vl.c
+++ b/vl.c
@@ -222,7 +222,6 @@ const char *watchdog;
QEMUOptionRom option_rom[MAX_OPTION_ROMS];
int nb_option_roms;
int semihosting_enabled = 0;
-int time_drift_fix = 0;
unsigned int kvm_shadow_memory = 0;
int old_param = 0;
const char *qemu_name;
@@ -2955,7 +2954,8 @@ int main(int argc, char **argv, char **envp)
semihosting_enabled = 1;
break;
case QEMU_OPTION_tdf:
- time_drift_fix = 1;
+ fprintf(stderr, "Warning: user space PIT time drift fix "
+ "is no longer supported.\n");
break;
case QEMU_OPTION_kvm_shadow_memory:
kvm_shadow_memory = (int64_t)atoi(optarg) * 1024 * 1024 / 4096;
--
1.7.6.5
|