KVM: s390: cleanup cpuid handling
authorDavid Hildenbrand <dahi@linux.vnet.ibm.com>
Mon, 4 Apr 2016 12:27:51 +0000 (14:27 +0200)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Mon, 9 May 2016 11:33:57 +0000 (13:33 +0200)
We only have one cpuid for all VCPUs, so let's directly use the one in the
cpu model. Also always store it directly as u64, no need for struct cpuid.

Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
arch/s390/include/asm/kvm_host.h
arch/s390/kvm/kvm-s390.c
arch/s390/kvm/priv.c

index 6da41fab70fbe951c957d1b5542101d22980839b..9282ccf1d1366b7340fd213473eab006830713d5 100644 (file)
@@ -544,10 +544,6 @@ struct kvm_vcpu_arch {
        struct kvm_s390_local_interrupt local_int;
        struct hrtimer    ckc_timer;
        struct kvm_s390_pgm_info pgm;
-       union  {
-               struct cpuid    cpu_id;
-               u64             stidp_data;
-       };
        struct gmap *gmap;
        struct kvm_guestdbg_info_arch guestdbg;
        unsigned long pfault_token;
@@ -605,7 +601,7 @@ struct kvm_s390_cpu_model {
        __u64 fac_mask[S390_ARCH_FAC_LIST_SIZE_U64];
        /* facility list requested by guest (in dma page) */
        __u64 *fac_list;
-       struct cpuid cpu_id;
+       u64 cpuid;
        unsigned short ibc;
 };
 
index e1e375c8010cc2d20414cf4f8f336a0e1062d866..0d2f24210198078c4276a5e8b0f030fb97c600b6 100644 (file)
@@ -652,8 +652,7 @@ static int kvm_s390_set_processor(struct kvm *kvm, struct kvm_device_attr *attr)
        }
        if (!copy_from_user(proc, (void __user *)attr->addr,
                            sizeof(*proc))) {
-               memcpy(&kvm->arch.model.cpu_id, &proc->cpuid,
-                      sizeof(struct cpuid));
+               kvm->arch.model.cpuid = proc->cpuid;
                kvm->arch.model.ibc = proc->ibc;
                memcpy(kvm->arch.model.fac_list, proc->fac_list,
                       S390_ARCH_FAC_LIST_SIZE_BYTE);
@@ -687,7 +686,7 @@ static int kvm_s390_get_processor(struct kvm *kvm, struct kvm_device_attr *attr)
                ret = -ENOMEM;
                goto out;
        }
-       memcpy(&proc->cpuid, &kvm->arch.model.cpu_id, sizeof(struct cpuid));
+       proc->cpuid = kvm->arch.model.cpuid;
        proc->ibc = kvm->arch.model.ibc;
        memcpy(&proc->fac_list, kvm->arch.model.fac_list,
               S390_ARCH_FAC_LIST_SIZE_BYTE);
@@ -1081,10 +1080,13 @@ static void kvm_s390_set_crycb_format(struct kvm *kvm)
                kvm->arch.crypto.crycbd |= CRYCB_FORMAT1;
 }
 
-static void kvm_s390_get_cpu_id(struct cpuid *cpu_id)
+static u64 kvm_s390_get_initial_cpuid(void)
 {
-       get_cpu_id(cpu_id);
-       cpu_id->version = 0xff;
+       struct cpuid cpuid;
+
+       get_cpu_id(&cpuid);
+       cpuid.version = 0xff;
+       return *((u64 *) &cpuid);
 }
 
 static void kvm_s390_crypto_init(struct kvm *kvm)
@@ -1175,7 +1177,7 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
        memcpy(kvm->arch.model.fac_list, kvm->arch.model.fac_mask,
               S390_ARCH_FAC_LIST_SIZE_BYTE);
 
-       kvm_s390_get_cpu_id(&kvm->arch.model.cpu_id);
+       kvm->arch.model.cpuid = kvm_s390_get_initial_cpuid();
        kvm->arch.model.ibc = sclp.ibc & 0x0fff;
 
        kvm_s390_crypto_init(kvm);
@@ -1624,7 +1626,6 @@ static void kvm_s390_vcpu_setup_model(struct kvm_vcpu *vcpu)
 {
        struct kvm_s390_cpu_model *model = &vcpu->kvm->arch.model;
 
-       vcpu->arch.cpu_id = model->cpu_id;
        vcpu->arch.sie_block->ibc = model->ibc;
        if (test_kvm_facility(vcpu->kvm, 7))
                vcpu->arch.sie_block->fac = (u32)(u64) model->fac_list;
index 313747917574ed0bad6254f260d99fe916bedc7f..95916fa7c670be54c7e5c63008024a7d6289ea31 100644 (file)
@@ -439,7 +439,7 @@ static int handle_lpswe(struct kvm_vcpu *vcpu)
 
 static int handle_stidp(struct kvm_vcpu *vcpu)
 {
-       u64 stidp_data = vcpu->arch.stidp_data;
+       u64 stidp_data = vcpu->kvm->arch.model.cpuid;
        u64 operand2;
        int rc;
        ar_t ar;