aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/i8254.c
diff options
context:
space:
mode:
authorRadim Krčmář <rkrcmar@redhat.com>2016-03-02 16:56:46 -0500
committerPaolo Bonzini <pbonzini@redhat.com>2016-03-04 03:30:04 -0500
commit10d2482126d02682d5d21aa5ecdf76d5f49c6740 (patch)
treea0f2e016721d171eaa1ea2090bed29614b86d66f /arch/x86/kvm/i8254.c
parent71474e2f0f439b83b7b53ee6e9cf4f44c15b5806 (diff)
KVM: i8254: refactor kvm_create_pit
Locks are gone, so we don't need to duplicate error paths. Use goto everywhere. Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Radim Krčmář <rkrcmar@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'arch/x86/kvm/i8254.c')
-rw-r--r--arch/x86/kvm/i8254.c27
1 files changed, 12 insertions, 15 deletions
diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
index 7a2f14bdf4b5..c24735ae1871 100644
--- a/arch/x86/kvm/i8254.c
+++ b/arch/x86/kvm/i8254.c
@@ -676,10 +676,8 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32 flags)
676 return NULL; 676 return NULL;
677 677
678 pit->irq_source_id = kvm_request_irq_source_id(kvm); 678 pit->irq_source_id = kvm_request_irq_source_id(kvm);
679 if (pit->irq_source_id < 0) { 679 if (pit->irq_source_id < 0)
680 kfree(pit); 680 goto fail_request;
681 return NULL;
682 }
683 681
684 mutex_init(&pit->pit_state.lock); 682 mutex_init(&pit->pit_state.lock);
685 683
@@ -690,11 +688,9 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32 flags)
690 init_kthread_worker(&pit->worker); 688 init_kthread_worker(&pit->worker);
691 pit->worker_task = kthread_run(kthread_worker_fn, &pit->worker, 689 pit->worker_task = kthread_run(kthread_worker_fn, &pit->worker,
692 "kvm-pit/%d", pid_nr); 690 "kvm-pit/%d", pid_nr);
693 if (IS_ERR(pit->worker_task)) { 691 if (IS_ERR(pit->worker_task))
694 kvm_free_irq_source_id(kvm, pit->irq_source_id); 692 goto fail_kthread;
695 kfree(pit); 693
696 return NULL;
697 }
698 init_kthread_work(&pit->expired, pit_do_work); 694 init_kthread_work(&pit->expired, pit_do_work);
699 695
700 pit->kvm = kvm; 696 pit->kvm = kvm;
@@ -715,7 +711,7 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32 flags)
715 ret = kvm_io_bus_register_dev(kvm, KVM_PIO_BUS, KVM_PIT_BASE_ADDRESS, 711 ret = kvm_io_bus_register_dev(kvm, KVM_PIO_BUS, KVM_PIT_BASE_ADDRESS,
716 KVM_PIT_MEM_LENGTH, &pit->dev); 712 KVM_PIT_MEM_LENGTH, &pit->dev);
717 if (ret < 0) 713 if (ret < 0)
718 goto fail; 714 goto fail_register_pit;
719 715
720 if (flags & KVM_PIT_SPEAKER_DUMMY) { 716 if (flags & KVM_PIT_SPEAKER_DUMMY) {
721 kvm_iodevice_init(&pit->speaker_dev, &speaker_dev_ops); 717 kvm_iodevice_init(&pit->speaker_dev, &speaker_dev_ops);
@@ -723,18 +719,19 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32 flags)
723 KVM_SPEAKER_BASE_ADDRESS, 4, 719 KVM_SPEAKER_BASE_ADDRESS, 4,
724 &pit->speaker_dev); 720 &pit->speaker_dev);
725 if (ret < 0) 721 if (ret < 0)
726 goto fail_unregister; 722 goto fail_register_speaker;
727 } 723 }
728 724
729 return pit; 725 return pit;
730 726
731fail_unregister: 727fail_register_speaker:
732 kvm_io_bus_unregister_dev(kvm, KVM_PIO_BUS, &pit->dev); 728 kvm_io_bus_unregister_dev(kvm, KVM_PIO_BUS, &pit->dev);
733 729fail_register_pit:
734fail:
735 kvm_pit_set_reinject(pit, false); 730 kvm_pit_set_reinject(pit, false);
736 kvm_free_irq_source_id(kvm, pit->irq_source_id);
737 kthread_stop(pit->worker_task); 731 kthread_stop(pit->worker_task);
732fail_kthread:
733 kvm_free_irq_source_id(kvm, pit->irq_source_id);
734fail_request:
738 kfree(pit); 735 kfree(pit);
739 return NULL; 736 return NULL;
740} 737}