[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [V1 PATCH] 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@xxxxxxxxxx> --- 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 c42a079..f22c68d 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 for video BIOSes. */ + 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); diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 9e85c13..4f83841 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); } @@ -1337,7 +1336,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 7d62653..41159d8 100644 --- a/xen/include/asm-x86/hvm/vpt.h +++ b/xen/include/asm-x86/hvm/vpt.h @@ -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); -- 1.8.3.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |