mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
pvh: 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>
This commit is contained in:
1 parent
819c084b29
commit
c30c544b19
4 files changed
+7
-9
No files matched your search
@@ -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:
|
||||
@@ -1978,6 +1977,8 @@ int domain_relinquish_resources(struct domain *d)
|
||||
BUG();
|
||||
}
|
||||
|
||||
pit_deinit(d);
|
||||
|
||||
if ( has_hvm_container_domain(d) )
|
||||
hvm_domain_relinquish_resources(d);
|
||||
|
||||
|
||||
@@ -650,7 +650,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);
|
||||
}
|
||||
@@ -1346,7 +1345,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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -176,7 +176,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);
|
||||
|
||||