From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [PATCH] Activate Virtualization On Demand v2 Date: Tue, 16 Jun 2009 17:01:01 +0300 Message-ID: <4A37A59D.5070604@redhat.com> References: <1245065405-5714-1-git-send-email-agraf@suse.de> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: kvm@vger.kernel.org To: Alexander Graf Return-path: Received: from mx2.redhat.com ([66.187.237.31]:56758 "EHLO mx2.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751291AbZFPOAu (ORCPT ); Tue, 16 Jun 2009 10:00:50 -0400 In-Reply-To: <1245065405-5714-1-git-send-email-agraf@suse.de> Sender: kvm-owner@vger.kernel.org List-ID: On 06/15/2009 02:30 PM, Alexander Graf wrote: > X86 CPUs need to have some magic happening to enable the virtualization > extensions on them. This magic can result in unpleasant results for > users, like blocking other VMMs from working (vmx) or using invalid TLB > entries (svm). > > Currently KVM activates virtualization when the respective kernel module > is loaded. This blocks us from autoloading KVM modules without breaking > other VMMs. > > To circumvent this problem at least a bit, this patch introduces on > demand activation of virtualization. This means, that instead > virtualization is enabled on creation of the first virtual machine > and disabled on destruction of the last one. > > So using this, KVM can be easily autoloaded, while keeping other > hypervisors usable. > > +static int hardware_enable_all(void) > +{ > + int r = 0; > + > + spin_lock(&kvm_lock); > + > + kvm_usage_count++; > + if (kvm_usage_count == 1) { > + atomic_set(&hardware_enable_failed, 1); > + on_each_cpu(hardware_enable, NULL, 1); > + > + if (!atomic_dec_and_test(&hardware_enable_failed)) > + r = -EBUSY; > + } > That's a little obfuscated. I suggest atomic_set(..., p) and atomic_read(...). > + > static int kvm_cpu_hotplug(struct notifier_block *notifier, unsigned long val, > void *v) > { > int cpu = (long)v; > > + if (!kvm_usage_count) > + return NOTIFY_OK; > + > val&= ~CPU_TASKS_FROZEN; > switch (val) { > case CPU_DYING: > @@ -2513,13 +2571,15 @@ static void kvm_exit_debug(void) > > static int kvm_suspend(struct sys_device *dev, pm_message_t state) > { > - hardware_disable(NULL); > + if (kvm_usage_count) > + hardware_disable(NULL); > return 0; > } > > static int kvm_resume(struct sys_device *dev) > { > - hardware_enable(NULL); > + if (kvm_usage_count) > + hardware_enable(NULL); > return 0; > } > > Please tell me you tested suspend/resume with/without VMs and cpu hotunplug/hotplug. -- error compiling committee.c: too many arguments to function