aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/ia64/include/asm/kvm_host.h10
-rw-r--r--arch/ia64/kvm/kvm-ia64.c12
-rw-r--r--arch/ia64/kvm/vcpu.c5
3 files changed, 18 insertions, 9 deletions
diff --git a/arch/ia64/include/asm/kvm_host.h b/arch/ia64/include/asm/kvm_host.h
index 46f8b0eb5684..4542651e6acb 100644
--- a/arch/ia64/include/asm/kvm_host.h
+++ b/arch/ia64/include/asm/kvm_host.h
@@ -157,10 +157,10 @@ struct kvm_vm_data {
157 struct kvm_vcpu_data vcpu_data[KVM_MAX_VCPUS]; 157 struct kvm_vcpu_data vcpu_data[KVM_MAX_VCPUS];
158}; 158};
159 159
160#define VCPU_BASE(n) KVM_VM_DATA_BASE + \ 160#define VCPU_BASE(n) (KVM_VM_DATA_BASE + \
161 offsetof(struct kvm_vm_data, vcpu_data[n]) 161 offsetof(struct kvm_vm_data, vcpu_data[n]))
162#define VM_BASE KVM_VM_DATA_BASE + \ 162#define KVM_VM_BASE (KVM_VM_DATA_BASE + \
163 offsetof(struct kvm_vm_data, kvm_vm_struct) 163 offsetof(struct kvm_vm_data, kvm_vm_struct))
164#define KVM_MEM_DIRTY_LOG_BASE KVM_VM_DATA_BASE + \ 164#define KVM_MEM_DIRTY_LOG_BASE KVM_VM_DATA_BASE + \
165 offsetof(struct kvm_vm_data, kvm_mem_dirty_log) 165 offsetof(struct kvm_vm_data, kvm_mem_dirty_log)
166 166
@@ -464,6 +464,8 @@ struct kvm_arch {
464 unsigned long metaphysical_rr4; 464 unsigned long metaphysical_rr4;
465 unsigned long vmm_init_rr; 465 unsigned long vmm_init_rr;
466 466
467 int online_vcpus;
468
467 struct kvm_ioapic *vioapic; 469 struct kvm_ioapic *vioapic;
468 struct kvm_vm_stat stat; 470 struct kvm_vm_stat stat;
469 struct kvm_sal_data rdv_sal_data; 471 struct kvm_sal_data rdv_sal_data;
diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c
index dbf527a57341..9c77e3939e97 100644
--- a/arch/ia64/kvm/kvm-ia64.c
+++ b/arch/ia64/kvm/kvm-ia64.c
@@ -314,7 +314,7 @@ static struct kvm_vcpu *lid_to_vcpu(struct kvm *kvm, unsigned long id,
314 union ia64_lid lid; 314 union ia64_lid lid;
315 int i; 315 int i;
316 316
317 for (i = 0; i < KVM_MAX_VCPUS; i++) { 317 for (i = 0; i < kvm->arch.online_vcpus; i++) {
318 if (kvm->vcpus[i]) { 318 if (kvm->vcpus[i]) {
319 lid.val = VCPU_LID(kvm->vcpus[i]); 319 lid.val = VCPU_LID(kvm->vcpus[i]);
320 if (lid.id == id && lid.eid == eid) 320 if (lid.id == id && lid.eid == eid)
@@ -388,7 +388,7 @@ static int handle_global_purge(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
388 388
389 call_data.ptc_g_data = p->u.ptc_g_data; 389 call_data.ptc_g_data = p->u.ptc_g_data;
390 390
391 for (i = 0; i < KVM_MAX_VCPUS; i++) { 391 for (i = 0; i < kvm->arch.online_vcpus; i++) {
392 if (!kvm->vcpus[i] || kvm->vcpus[i]->arch.mp_state == 392 if (!kvm->vcpus[i] || kvm->vcpus[i]->arch.mp_state ==
393 KVM_MP_STATE_UNINITIALIZED || 393 KVM_MP_STATE_UNINITIALIZED ||
394 vcpu == kvm->vcpus[i]) 394 vcpu == kvm->vcpus[i])
@@ -788,6 +788,8 @@ struct kvm *kvm_arch_create_vm(void)
788 return ERR_PTR(-ENOMEM); 788 return ERR_PTR(-ENOMEM);
789 kvm_init_vm(kvm); 789 kvm_init_vm(kvm);
790 790
791 kvm->arch.online_vcpus = 0;
792
791 return kvm; 793 return kvm;
792 794
793} 795}
@@ -1154,7 +1156,7 @@ int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu)
1154 1156
1155 /*Initialize itc offset for vcpus*/ 1157 /*Initialize itc offset for vcpus*/
1156 itc_offset = 0UL - ia64_getreg(_IA64_REG_AR_ITC); 1158 itc_offset = 0UL - ia64_getreg(_IA64_REG_AR_ITC);
1157 for (i = 0; i < KVM_MAX_VCPUS; i++) { 1159 for (i = 0; i < kvm->arch.online_vcpus; i++) {
1158 v = (struct kvm_vcpu *)((char *)vcpu + 1160 v = (struct kvm_vcpu *)((char *)vcpu +
1159 sizeof(struct kvm_vcpu_data) * i); 1161 sizeof(struct kvm_vcpu_data) * i);
1160 v->arch.itc_offset = itc_offset; 1162 v->arch.itc_offset = itc_offset;
@@ -1288,6 +1290,8 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm,
1288 goto fail; 1290 goto fail;
1289 } 1291 }
1290 1292
1293 kvm->arch.online_vcpus++;
1294
1291 return vcpu; 1295 return vcpu;
1292fail: 1296fail:
1293 return ERR_PTR(r); 1297 return ERR_PTR(r);
@@ -1828,7 +1832,7 @@ struct kvm_vcpu *kvm_get_lowest_prio_vcpu(struct kvm *kvm, u8 vector,
1828 struct kvm_vcpu *lvcpu = kvm->vcpus[0]; 1832 struct kvm_vcpu *lvcpu = kvm->vcpus[0];
1829 int i; 1833 int i;
1830 1834
1831 for (i = 1; i < KVM_MAX_VCPUS; i++) { 1835 for (i = 1; i < kvm->arch.online_vcpus; i++) {
1832 if (!kvm->vcpus[i]) 1836 if (!kvm->vcpus[i])
1833 continue; 1837 continue;
1834 if (lvcpu->arch.xtp > kvm->vcpus[i]->arch.xtp) 1838 if (lvcpu->arch.xtp > kvm->vcpus[i]->arch.xtp)
diff --git a/arch/ia64/kvm/vcpu.c b/arch/ia64/kvm/vcpu.c
index 4d8be4c252fa..d4d280505878 100644
--- a/arch/ia64/kvm/vcpu.c
+++ b/arch/ia64/kvm/vcpu.c
@@ -807,12 +807,15 @@ static inline void vcpu_set_itm(struct kvm_vcpu *vcpu, u64 val);
807static void vcpu_set_itc(struct kvm_vcpu *vcpu, u64 val) 807static void vcpu_set_itc(struct kvm_vcpu *vcpu, u64 val)
808{ 808{
809 struct kvm_vcpu *v; 809 struct kvm_vcpu *v;
810 struct kvm *kvm;
810 int i; 811 int i;
811 long itc_offset = val - ia64_getreg(_IA64_REG_AR_ITC); 812 long itc_offset = val - ia64_getreg(_IA64_REG_AR_ITC);
812 unsigned long vitv = VCPU(vcpu, itv); 813 unsigned long vitv = VCPU(vcpu, itv);
813 814
815 kvm = (struct kvm *)KVM_VM_BASE;
816
814 if (vcpu->vcpu_id == 0) { 817 if (vcpu->vcpu_id == 0) {
815 for (i = 0; i < KVM_MAX_VCPUS; i++) { 818 for (i = 0; i < kvm->arch.online_vcpus; i++) {
816 v = (struct kvm_vcpu *)((char *)vcpu + 819 v = (struct kvm_vcpu *)((char *)vcpu +
817 sizeof(struct kvm_vcpu_data) * i); 820 sizeof(struct kvm_vcpu_data) * i);
818 VMX(v, itc_offset) = itc_offset; 821 VMX(v, itc_offset) = itc_offset;