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
|
From 3a148e0a7ee0ae56a498be5ba973314ec50cd999 Mon Sep 17 00:00:00 2001
From: Mukesh Rathor <mukesh.rathor@oracle.com>
Date: Fri, 4 Apr 2014 10:36:29 +0200
Subject: [PATCH] x86: call pit_init for pvh also
During halt of a pvh guest, the guest may do speaker shutdown. This
results in call to handle_speaker_io in xen. It will hang on the vpit
spin lock because it has not been initialized.
Since, pit_init is also called for both pv and hvm, the call is
moved to a more generic place.
Signed-off-by: Mukesh Rathor <mukesh.rathor@oracle.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
master commit: c30c544b199f70eada597c7352cdcb44648f6dcd
master date: 2014-03-11 13:56:50 +0100
---
xen/arch/x86/domain.c | 9 +++++----
xen/arch/x86/hvm/hvm.c | 2 --
xen/arch/x86/hvm/i8254.c | 3 +--
xen/include/asm-x86/hvm/vpt.h | 2 +-
4 files changed, 7 insertions(+), 9 deletions(-)
diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
index 6618ae6..bc073e5 100644
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -422,10 +422,6 @@ int vcpu_initialise(struct vcpu *v)
/* PV guests by default have a 100Hz ticker. */
v->periodic_period = MILLISECS(10);
-
- /* PV guests get an emulated PIT too for video BIOSes to use. */
- if ( v->vcpu_id == 0 )
- pit_init(v, cpu_khz);
}
v->arch.schedule_tail = continue_nonidle_domain;
@@ -579,6 +575,9 @@ int arch_domain_create(struct domain *d, unsigned int domcr_flags)
tsc_set_info(d, TSC_MODE_DEFAULT, 0UL, 0, 0);
spin_lock_init(&d->arch.vtsc_lock);
+ /* PV/PVH guests get an emulated PIT too for video BIOSes to use. */
+ pit_init(d, cpu_khz);
+
return 0;
fail:
@@ -1980,6 +1979,8 @@ int domain_relinquish_resources(struct domain *d)
BUG();
}
+ pit_deinit(d);
+
if ( has_hvm_container_domain(d) )
hvm_domain_relinquish_resources(d);
diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index 6150899..a666471 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -643,7 +643,6 @@ void hvm_domain_relinquish_resources(struct domain *d)
rtc_deinit(d);
if ( d->vcpu != NULL && d->vcpu[0] != NULL )
{
- pit_deinit(d);
pmtimer_deinit(d);
hpet_deinit(d);
}
@@ -1217,7 +1216,6 @@ int hvm_vcpu_initialise(struct vcpu *v)
if ( v->vcpu_id == 0 )
{
/* NB. All these really belong in hvm_domain_initialise(). */
- pit_init(v, cpu_khz);
pmtimer_init(v);
hpet_init(v);
diff --git a/xen/arch/x86/hvm/i8254.c b/xen/arch/x86/hvm/i8254.c
index c0d6bc2..f7493b8 100644
--- a/xen/arch/x86/hvm/i8254.c
+++ b/xen/arch/x86/hvm/i8254.c
@@ -447,9 +447,8 @@ void pit_reset(struct domain *d)
spin_unlock(&pit->lock);
}
-void pit_init(struct vcpu *v, unsigned long cpu_khz)
+void pit_init(struct domain *d, unsigned long cpu_khz)
{
- struct domain *d = v->domain;
PITState *pit = domain_vpit(d);
spin_lock_init(&pit->lock);
diff --git a/xen/include/asm-x86/hvm/vpt.h b/xen/include/asm-x86/hvm/vpt.h
index 87c3a66..9f3ec8d 100644
--- a/xen/include/asm-x86/hvm/vpt.h
+++ b/xen/include/asm-x86/hvm/vpt.h
@@ -175,7 +175,7 @@ void destroy_periodic_time(struct periodic_time *pt);
int pv_pit_handler(int port, int data, int write);
void pit_reset(struct domain *d);
-void pit_init(struct vcpu *v, unsigned long cpu_khz);
+void pit_init(struct domain *d, unsigned long cpu_khz);
void pit_stop_channel0_irq(PITState * pit);
void pit_deinit(struct domain *d);
void rtc_init(struct domain *d);
--
1.7.2.5
|