[patch] dynamic nr online cpus

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

 



Hi,

Working on allowing larger max vcpus I'd like to put in this patch that
calculates the number of online cpus. It's a building block for allowing
the larger number of max vcpus without crippling performance for the
smaller cases.

Cheers,
Jes

Account for number of online cpus and use that in loops iterating over
the list of vpus. This patch is a building block, in the work to allow
for larger max number of vcpus.

A copy of the number of online cpus is stored in vcpu 0's private data
area to allow the number to be visible from the KVM module.

Signed-off-by: Jes Sorensen <jes@xxxxxxx>

---
 arch/ia64/include/asm/kvm_host.h |    3 +++
 arch/ia64/kvm/kvm-ia64.c         |   20 ++++++++++++++++----
 arch/ia64/kvm/vcpu.c             |    2 +-
 3 files changed, 20 insertions(+), 5 deletions(-)

Index: linux-2.6.git/arch/ia64/include/asm/kvm_host.h
===================================================================
--- linux-2.6.git.orig/arch/ia64/include/asm/kvm_host.h
+++ linux-2.6.git/arch/ia64/include/asm/kvm_host.h
@@ -377,6 +377,7 @@
 	int last_run_cpu;
 	int vmm_tr_slot;
 	int vm_tr_slot;
+	int online_cpus;
 
 #define KVM_MP_STATE_RUNNABLE          0
 #define KVM_MP_STATE_UNINITIALIZED     1
@@ -470,6 +471,8 @@
 	unsigned long	metaphysical_rr4;
 	unsigned long	vmm_init_rr;
 
+	int		online_cpus;
+
 	struct kvm_ioapic *vioapic;
 	struct kvm_vm_stat stat;
 	struct kvm_sal_data rdv_sal_data;
Index: linux-2.6.git/arch/ia64/kvm/kvm-ia64.c
===================================================================
--- linux-2.6.git.orig/arch/ia64/kvm/kvm-ia64.c
+++ linux-2.6.git/arch/ia64/kvm/kvm-ia64.c
@@ -316,7 +316,7 @@
 	union ia64_lid lid;
 	int i;
 
-	for (i = 0; i < KVM_MAX_VCPUS; i++) {
+	for (i = 0; i < kvm->arch.online_cpus; i++) {
 		if (kvm->vcpus[i]) {
 			lid.val = VCPU_LID(kvm->vcpus[i]);
 			if (lid.id == id && lid.eid == eid)
@@ -390,7 +390,7 @@
 
 	call_data.ptc_g_data = p->u.ptc_g_data;
 
-	for (i = 0; i < KVM_MAX_VCPUS; i++) {
+	for (i = 0; i < kvm->arch.online_cpus; i++) {
 		if (!kvm->vcpus[i] || kvm->vcpus[i]->arch.mp_state ==
 						KVM_MP_STATE_UNINITIALIZED ||
 					vcpu == kvm->vcpus[i])
@@ -825,6 +825,8 @@
 		return ERR_PTR(-ENOMEM);
 	kvm_init_vm(kvm);
 
+	kvm->arch.online_cpus = 0; /* xxx hack me harder xxx */
+
 	return kvm;
 
 }
@@ -1186,7 +1188,7 @@
 
 		/*Initialize itc offset for vcpus*/
 		itc_offset = 0UL - ia64_getreg(_IA64_REG_AR_ITC);
-		for (i = 0; i < KVM_MAX_VCPUS; i++) {
+		for (i = 0; i < kvm->arch.online_cpus; i++) {
 			v = (struct kvm_vcpu *)((char *)vcpu +
 					sizeof(struct kvm_vcpu_data) * i);
 			v->arch.itc_offset = itc_offset;
@@ -1320,6 +1322,16 @@
 		goto fail;
 	}
 
+	kvm->arch.online_cpus++;
+	/*
+	 * For vcpu 0, kvm->vcpus hasn't been assigned yet, special case it
+	 */
+	if (!id)
+		vcpu->arch.online_cpus = kvm->arch.online_cpus;
+	else
+		kvm->vcpus[0]->arch.online_cpus = kvm->arch.online_cpus;
+
+	printk(KERN_INFO "arch.online_cpus %i\n", kvm->arch.online_cpus);
 	return vcpu;
 fail:
 	return ERR_PTR(r);
@@ -1766,7 +1778,7 @@
 	struct kvm_vcpu *lvcpu = kvm->vcpus[0];
 	int i;
 
-	for (i = 1; i < KVM_MAX_VCPUS; i++) {
+	for (i = 1; i < kvm->arch.online_cpus; i++) {
 		if (!kvm->vcpus[i])
 			continue;
 		if (lvcpu->arch.xtp > kvm->vcpus[i]->arch.xtp)
Index: linux-2.6.git/arch/ia64/kvm/vcpu.c
===================================================================
--- linux-2.6.git.orig/arch/ia64/kvm/vcpu.c
+++ linux-2.6.git/arch/ia64/kvm/vcpu.c
@@ -816,7 +816,7 @@
 	unsigned long vitv = VCPU(vcpu, itv);
 
 	if (vcpu->vcpu_id == 0) {
-		for (i = 0; i < KVM_MAX_VCPUS; i++) {
+		for (i = 0; i < vcpu->arch.online_cpus; i++) {
 			v = (struct kvm_vcpu *)((char *)vcpu +
 					sizeof(struct kvm_vcpu_data) * i);
 			VMX(v, itc_offset) = itc_offset;

[Index of Archives]     [Linux KVM Devel]     [Linux Virtualization]     [Big List of Linux Books]     [Linux SCSI]     [Yosemite Forum]

  Powered by Linux