Re: [patch] dynamic nr online cpus
Jes Sorensen <[email protected]>
| Newsgroups | org.kernel.vger.kvm-ia64 |
|---|---|
| Message-ID | <[email protected]> |
Hi Xiantao,
Here's an update version of the online_vcpus patch. I agree with you
that the name online_vcpus is more appropriate and I used your trick
to get to struct kvm, so it's a lot cleaner than the old version.
I renamed VM_BASE to KVM_VM_BASE as it seems a more correct name to me
and has less chance of clashing with something. In addition the
parenthesis I added are required to avoid unexpected results from CPP
when you typecast it to struct kvm *.
Cheers,
Jes
Zhang, Xiantao wrote:
> Hi, Jes
> This patch is okay to me, and still have some minor comments below, and expect them to address in your final patch. Thanks!
>
> 1. For readability, I prefer to use online_vcpus intead of online_cpus
> 2. I don't think it is necessary to save a copy in vcpu's private data, just use the following code to get the kvm pointer and access its non-pointer fileds in vmm module,
> struct kvm *get_kvm() {
> return (struct kvm*) VM_BASE;
> }
>
> After getting kvm pointer, you can use it for vcpu.c's change.
> Xiantao
>
> Jes Sorensen wrote:
>> 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
5000-kvm-ia64-nr-online-vcpu.patch
(text/plain, 3.6 KB)
Account for number of online cpus and use that in loops iterating over the list of vpus instead of scanning the full array unconditionally. This patch is a building block to facilitate allowing to bump up the size of MAX_VCPUS significantly. Signed-off-by: Jes Sorensen <[email protected]> --- arch/ia64/include/asm/kvm_host.h | 10 ++++++---- arch/ia64/kvm/kvm-ia64.c | 12 ++++++++---- arch/ia64/kvm/vcpu.c | 5 ++++- 3 files changed, 18 insertions(+), 9 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 @@ -163,10 +163,10 @@ struct kvm_vcpu_data vcpu_data[KVM_MAX_VCPUS]; }; -#define VCPU_BASE(n) KVM_VM_DATA_BASE + \ - offsetof(struct kvm_vm_data, vcpu_data[n]) -#define VM_BASE KVM_VM_DATA_BASE + \ - offsetof(struct kvm_vm_data, kvm_vm_struct) +#define VCPU_BASE(n) (KVM_VM_DATA_BASE + \ + offsetof(struct kvm_vm_data, vcpu_data[n])) +#define KVM_VM_BASE (KVM_VM_DATA_BASE + \ + offsetof(struct kvm_vm_data, kvm_vm_struct)) #define KVM_MEM_DIRTY_LOG_BASE KVM_VM_DATA_BASE + \ offsetof(struct kvm_vm_data, kvm_mem_dirty_log) @@ -479,6 +479,8 @@ unsigned long metaphysical_rr4; unsigned long vmm_init_rr; + int online_vcpus; + 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_vcpus; 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_vcpus; 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_vcpus = 0; + 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_vcpus; i++) { v = (struct kvm_vcpu *)((char *)vcpu + sizeof(struct kvm_vcpu_data) * i); v->arch.itc_offset = itc_offset; @@ -1320,6 +1322,8 @@ goto fail; } + kvm->arch.online_vcpus++; + return vcpu; fail: return ERR_PTR(r); @@ -1766,7 +1770,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_vcpus; 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 @@ -811,12 +811,15 @@ static void vcpu_set_itc(struct kvm_vcpu *vcpu, u64 val) { struct kvm_vcpu *v; + struct kvm *kvm; int i; long itc_offset = val - ia64_getreg(_IA64_REG_AR_ITC); unsigned long vitv = VCPU(vcpu, itv); + kvm = (struct kvm *)KVM_VM_BASE; + if (vcpu->vcpu_id == 0) { - for (i = 0; i < KVM_MAX_VCPUS; i++) { + for (i = 0; i < kvm->arch.online_vcpus; i++) { v = (struct kvm_vcpu *)((char *)vcpu + sizeof(struct kvm_vcpu_data) * i); VMX(v, itc_offset) = itc_offset;