From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= Subject: [PATCH v2 07/14] KVM: x86: remove unnecessary uses of PIT state lock Date: Wed, 17 Feb 2016 20:14:49 +0100 Message-ID: <1455736496-374-8-git-send-email-rkrcmar@redhat.com> References: <1455736496-374-1-git-send-email-rkrcmar@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: QUOTED-PRINTABLE Cc: kvm@vger.kernel.org, Paolo Bonzini , Yuki Shibuya To: linux-kernel@vger.kernel.org Return-path: In-Reply-To: <1455736496-374-1-git-send-email-rkrcmar@redhat.com> Sender: linux-kernel-owner@vger.kernel.org List-Id: kvm.vger.kernel.org - kvm_create_pit had to lock only because it exposed kvm->arch.vpit ver= y early, but initialization doesn't use kvm->arch.vpit since the last patch, so we can drop locking. - kvm_free_pit is only run after there are no users of KVM and therefor= e is the sole actor. - Locking in kvm_vm_ioctl_reinject doesn't do anything, because reinjec= t is only protected at that place. - kvm_pit_reset isn't used anywhere and its locking can be dropped if w= e hide it. Removing useless locking allows to see what actually is being protected by PIT state lock (values accessible from the guest). Signed-off-by: Radim Kr=C4=8Dm=C3=A1=C5=99 --- v2: new arch/x86/kvm/i8254.c | 7 ------- arch/x86/kvm/i8254.h | 7 ++++--- arch/x86/kvm/x86.c | 4 ++-- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c index c11734dd5092..01f9c70ebc21 100644 --- a/arch/x86/kvm/i8254.c +++ b/arch/x86/kvm/i8254.c @@ -612,7 +612,6 @@ void kvm_pit_reset(struct kvm_pit *pit) int i; struct kvm_kpit_channel_state *c; =20 - mutex_lock(&pit->pit_state.lock); pit->pit_state.flags =3D 0; for (i =3D 0; i < 3; i++) { c =3D &pit->pit_state.channels[i]; @@ -620,7 +619,6 @@ void kvm_pit_reset(struct kvm_pit *pit) c->gate =3D (i !=3D 2); pit_load_count(pit, i, 0); } - mutex_unlock(&pit->pit_state.lock); =20 kvm_pit_reset_reinject(pit); } @@ -663,7 +661,6 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32= flags) } =20 mutex_init(&pit->pit_state.lock); - mutex_lock(&pit->pit_state.lock); =20 pid =3D get_pid(task_tgid(current)); pid_nr =3D pid_vnr(pid); @@ -673,7 +670,6 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32= flags) pit->worker_task =3D kthread_run(kthread_worker_fn, &pit->worker, "kvm-pit/%d", pid_nr); if (IS_ERR(pit->worker_task)) { - mutex_unlock(&pit->pit_state.lock); kvm_free_irq_source_id(kvm, pit->irq_source_id); kfree(pit); return NULL; @@ -689,7 +685,6 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32= flags) pit_state->irq_ack_notifier.irq_acked =3D kvm_pit_ack_irq; kvm_register_irq_ack_notifier(kvm, &pit_state->irq_ack_notifier); pit_state->reinject =3D true; - mutex_unlock(&pit->pit_state.lock); =20 kvm_pit_reset(pit); =20 @@ -737,13 +732,11 @@ void kvm_free_pit(struct kvm *kvm) &kvm->arch.vpit->mask_notifier); kvm_unregister_irq_ack_notifier(kvm, &kvm->arch.vpit->pit_state.irq_ack_notifier); - mutex_lock(&kvm->arch.vpit->pit_state.lock); timer =3D &kvm->arch.vpit->pit_state.timer; hrtimer_cancel(timer); flush_kthread_work(&kvm->arch.vpit->expired); kthread_stop(kvm->arch.vpit->worker_task); kvm_free_irq_source_id(kvm, kvm->arch.vpit->irq_source_id); - mutex_unlock(&kvm->arch.vpit->pit_state.lock); kfree(kvm->arch.vpit); } } diff --git a/arch/x86/kvm/i8254.h b/arch/x86/kvm/i8254.h index a6aceaf08df5..568d87ec3698 100644 --- a/arch/x86/kvm/i8254.h +++ b/arch/x86/kvm/i8254.h @@ -22,17 +22,19 @@ struct kvm_kpit_channel_state { }; =20 struct kvm_kpit_state { + /* All members before "struct mutex lock" are protected by the lock. = */ struct kvm_kpit_channel_state channels[3]; u32 flags; bool is_periodic; s64 period; /* unit: ns */ struct hrtimer timer; - atomic_t pending; /* accumulated triggered timers */ bool reinject; - struct kvm *kvm; u32 speaker_data_on; + struct mutex lock; + struct kvm *kvm; struct kvm_pit *pit; + atomic_t pending; /* accumulated triggered timers */ atomic_t irq_ack; struct kvm_irq_ack_notifier irq_ack_notifier; }; @@ -59,7 +61,6 @@ struct kvm_pit { struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32 flags); void kvm_free_pit(struct kvm *kvm); =20 -void kvm_pit_reset(struct kvm_pit *pit); void kvm_pit_load_count(struct kvm_pit *pit, int channel, u32 val, int hpet_legacy_start); =20 diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 57b296466bf0..f2f7ba74da6b 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -3685,9 +3685,9 @@ static int kvm_vm_ioctl_reinject(struct kvm *kvm, { if (!kvm->arch.vpit) return -ENXIO; - mutex_lock(&kvm->arch.vpit->pit_state.lock); + kvm->arch.vpit->pit_state.reinject =3D control->pit_reinject; - mutex_unlock(&kvm->arch.vpit->pit_state.lock); + return 0; } =20 --=20 2.7.1