Re: [PATCH 01/26] KVM: PPC: Introduce shared page

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 06/26/2010 02:24 AM, Alexander Graf wrote:
For transparent variable sharing between the hypervisor and guest, I introduce
a shared page. This shared page will contain all the registers the guest can
read and write safely without exiting guest context.

This patch only implements the stubs required for the basic structure of the
shared page. The actual register moving follows.


@@ -123,8 +123,14 @@ struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm, unsigned int id)
  	if (err)
  		goto free_vcpu;

+	vcpu->arch.shared = (void*)__get_free_page(GFP_KERNEL|__GFP_ZERO);
+	if (!vcpu->arch.shared)
+		goto uninit_vcpu;
+
  	return vcpu;

+uninit_vcpu:
+	kvm_vcpu_uninit(vcpu);
  free_vcpu:
  	kmem_cache_free(kvm_vcpu_cache, vcpu_44x);
  out:
@@ -135,6 +141,7 @@ void kvmppc_core_vcpu_free(struct kvm_vcpu *vcpu)
  {
  	struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu);

+	free_page((unsigned long)vcpu->arch.shared);
  	kvm_vcpu_uninit(vcpu);
  	kmem_cache_free(kvm_vcpu_cache, vcpu_44x);
  }
diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c
index 884d4a5..ba79b35 100644
--- a/arch/powerpc/kvm/book3s.c
+++ b/arch/powerpc/kvm/book3s.c
@@ -1247,6 +1247,10 @@ struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm, unsigned int id)
  	if (err)
  		goto free_shadow_vcpu;

+	vcpu->arch.shared = (void*)__get_free_page(GFP_KERNEL|__GFP_ZERO);
+	if (!vcpu->arch.shared)
+		goto uninit_vcpu;
+
  	vcpu->arch.host_retip = kvm_return_point;
  	vcpu->arch.host_msr = mfmsr();
  #ifdef CONFIG_PPC_BOOK3S_64
@@ -1277,6 +1281,8 @@ struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm, unsigned int id)

  	return vcpu;

+uninit_vcpu:
+	kvm_vcpu_uninit(vcpu);
  free_shadow_vcpu:
  	kfree(vcpu_book3s->shadow_vcpu);
  free_vcpu:
@@ -1289,6 +1295,7 @@ void kvmppc_core_vcpu_free(struct kvm_vcpu *vcpu)
  {
  	struct kvmppc_vcpu_book3s *vcpu_book3s = to_book3s(vcpu);

+	free_page((unsigned long)vcpu->arch.shared);
  	kvm_vcpu_uninit(vcpu);
  	kfree(vcpu_book3s->shadow_vcpu);
  	vfree(vcpu_book3s);
diff --git a/arch/powerpc/kvm/e500.c b/arch/powerpc/kvm/e500.c
index e8a00b0..71750f2 100644
--- a/arch/powerpc/kvm/e500.c
+++ b/arch/powerpc/kvm/e500.c
@@ -117,8 +117,14 @@ struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm, unsigned int id)
  	if (err)
  		goto uninit_vcpu;

+	vcpu->arch.shared = (void*)__get_free_page(GFP_KERNEL|__GFP_ZERO);
+	if (!vcpu->arch.shared)
+		goto uninit_tlb;
+
  	return vcpu;

+uninit_tlb:
+	kvmppc_e500_tlb_uninit(vcpu_e500);
  uninit_vcpu:
  	kvm_vcpu_uninit(vcpu);
  free_vcpu:
@@ -131,6 +137,7 @@ void kvmppc_core_vcpu_free(struct kvm_vcpu *vcpu)
  {
  	struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu);

+	free_page((unsigned long)vcpu->arch.shared);
  	kvmppc_e500_tlb_uninit(vcpu_e500);
  	kvm_vcpu_uninit(vcpu);
  	kmem_cache_free(kvm_vcpu_cache, vcpu_e500);

Code repeats 3x.  Share please.


--
error compiling committee.c: too many arguments to function

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux