All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jes Sorensen <jes@sgi.com>
To: kvm-ia64@vger.kernel.org
Subject: [patch] dynamic nr online cpus
Date: Tue, 13 Jan 2009 10:25:02 +0000	[thread overview]
Message-ID: <496C6BFE.6020900@sgi.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 248 bytes --]

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


[-- Attachment #2: 5000-kvm-ia64-nr-online-vcpu.patch --]
[-- Type: text/plain, Size: 3508 bytes --]

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@sgi.com>

---
 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;

             reply	other threads:[~2009-01-13 10:25 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-01-13 10:25 Jes Sorensen [this message]
2009-01-15  9:25 ` [patch] dynamic nr online cpus Zhang, Xiantao
2009-01-21 14:16 ` Jes Sorensen
2009-01-22  1:48 ` Zhang, Xiantao
2009-01-22 14:37 ` Avi Kivity

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=496C6BFE.6020900@sgi.com \
    --to=jes@sgi.com \
    --cc=kvm-ia64@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.