lkml.org 
[lkml]   [2016]   [Jul]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 13/13] KVM: x86: bump KVM_MAX_VCPU_ID to 1023
    Date
    kzalloc was replaced with kvm_kvzalloc to allow non-contiguous areas and
    rcu had to be modified to cope with it.

    The practical limit for KVM_MAX_VCPU_ID right now is INT_MAX, but lower
    value was chosen in case there were bugs. 1023 is sufficient maximum
    APIC ID for 288 VCPUs.

    Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
    ---
    v2: new [Paolo]

    arch/x86/include/asm/kvm_host.h | 1 +
    arch/x86/kvm/lapic.c | 13 ++++++++++---
    arch/x86/kvm/x86.c | 2 +-
    3 files changed, 12 insertions(+), 4 deletions(-)

    diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
    index e362de872139..b771667e8e99 100644
    --- a/arch/x86/include/asm/kvm_host.h
    +++ b/arch/x86/include/asm/kvm_host.h
    @@ -36,6 +36,7 @@

    #define KVM_MAX_VCPUS 288
    #define KVM_SOFT_MAX_VCPUS 240
    +#define KVM_MAX_VCPU_ID 1023
    #define KVM_USER_MEM_SLOTS 509
    /* memory slots that are not exposed to userspace */
    #define KVM_PRIVATE_MEM_SLOTS 3
    diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
    index b47a82bfc8c4..3fcc590aa155 100644
    --- a/arch/x86/kvm/lapic.c
    +++ b/arch/x86/kvm/lapic.c
    @@ -147,6 +147,13 @@ static inline bool kvm_apic_map_get_logical_dest(struct kvm_apic_map *map,
    }
    }

    +static void kvm_apic_map_free(struct rcu_head *rcu)
    +{
    + struct kvm_apic_map *map = container_of(rcu, struct kvm_apic_map, rcu);
    +
    + kvfree(map);
    +}
    +
    static void recalculate_apic_map(struct kvm *kvm)
    {
    struct kvm_apic_map *new, *old = NULL;
    @@ -160,8 +167,8 @@ static void recalculate_apic_map(struct kvm *kvm)
    if (kvm_apic_present(vcpu))
    max_id = max(max_id, kvm_apic_id(vcpu->arch.apic));

    - new = kzalloc(sizeof(struct kvm_apic_map) +
    - sizeof(struct kvm_lapic *) * (max_id + 1), GFP_KERNEL);
    + new = kvm_kvzalloc(sizeof(struct kvm_apic_map) +
    + sizeof(struct kvm_lapic *) * ((u64)max_id + 1));

    if (!new)
    goto out;
    @@ -206,7 +213,7 @@ out:
    mutex_unlock(&kvm->arch.apic_map_lock);

    if (old)
    - kfree_rcu(old, rcu);
    + call_rcu(&old->rcu, kvm_apic_map_free);

    kvm_make_scan_ioapic_request(kvm);
    }
    diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
    index 5d4089dcb3eb..411f786950ab 100644
    --- a/arch/x86/kvm/x86.c
    +++ b/arch/x86/kvm/x86.c
    @@ -7914,7 +7914,7 @@ void kvm_arch_destroy_vm(struct kvm *kvm)
    kfree(kvm->arch.vpic);
    kfree(kvm->arch.vioapic);
    kvm_free_vcpus(kvm);
    - kfree(rcu_dereference_check(kvm->arch.apic_map, 1));
    + kvfree(rcu_dereference_check(kvm->arch.apic_map, 1));
    kvm_mmu_uninit_vm(kvm);
    }

    --
    2.9.0
    \
     
     \ /
      Last update: 2016-07-07 19:21    [W:4.716 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site