lkml.org 
[lkml]   [2011]   [Nov]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v2 2/6] KVM: introduce update_memslots function
    Introduce update_memslots to update slot which will be update to
    kvm->memslots

    Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
    ---
    arch/x86/kvm/x86.c | 2 +-
    include/linux/kvm_host.h | 1 +
    virt/kvm/kvm_main.c | 22 +++++++++++++++-------
    3 files changed, 17 insertions(+), 8 deletions(-)

    diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
    index 9eff4af..56d1a39 100644
    --- a/arch/x86/kvm/x86.c
    +++ b/arch/x86/kvm/x86.c
    @@ -3504,7 +3504,7 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
    goto out;
    memcpy(slots, kvm->memslots, sizeof(struct kvm_memslots));
    slots->memslots[log->slot].dirty_bitmap = dirty_bitmap;
    - slots->generation++;
    + update_memslots(slots, NULL);

    old_slots = kvm->memslots;
    rcu_assign_pointer(kvm->memslots, slots);
    diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
    index a42d50b..bb8728e 100644
    --- a/include/linux/kvm_host.h
    +++ b/include/linux/kvm_host.h
    @@ -319,6 +319,7 @@ void kvm_exit(void);

    void kvm_get_kvm(struct kvm *kvm);
    void kvm_put_kvm(struct kvm *kvm);
    +void update_memslots(struct kvm_memslots *slots, struct kvm_memory_slot *new);

    static inline struct kvm_memslots *kvm_memslots(struct kvm *kvm)
    {
    diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
    index eb55a11..0fb3aeb 100644
    --- a/virt/kvm/kvm_main.c
    +++ b/virt/kvm/kvm_main.c
    @@ -629,6 +629,19 @@ static int kvm_create_dirty_bitmap(struct kvm_memory_slot *memslot)
    }
    #endif /* !CONFIG_S390 */

    +void update_memslots(struct kvm_memslots *slots, struct kvm_memory_slot *new)
    +{
    + if (new) {
    + int id = new->id;
    +
    + slots->memslots[id] = *new;
    + if (id >= slots->nmemslots)
    + slots->nmemslots = id + 1;
    + }
    +
    + slots->generation++;
    +}
    +
    /*
    * Allocate some memory and give it an address in the guest physical address
    * space.
    @@ -779,10 +792,8 @@ skip_lpage:
    if (!slots)
    goto out_free;
    memcpy(slots, kvm->memslots, sizeof(struct kvm_memslots));
    - if (mem->slot >= slots->nmemslots)
    - slots->nmemslots = mem->slot + 1;
    - slots->generation++;
    slots->memslots[mem->slot].flags |= KVM_MEMSLOT_INVALID;
    + update_memslots(slots, NULL);

    old_memslots = kvm->memslots;
    rcu_assign_pointer(kvm->memslots, slots);
    @@ -814,9 +825,6 @@ skip_lpage:
    if (!slots)
    goto out_free;
    memcpy(slots, kvm->memslots, sizeof(struct kvm_memslots));
    - if (mem->slot >= slots->nmemslots)
    - slots->nmemslots = mem->slot + 1;
    - slots->generation++;

    /* actual memory is freed via old in kvm_free_physmem_slot below */
    if (!npages) {
    @@ -826,7 +834,7 @@ skip_lpage:
    new.lpage_info[i] = NULL;
    }

    - slots->memslots[mem->slot] = new;
    + update_memslots(slots, &new);
    old_memslots = kvm->memslots;
    rcu_assign_pointer(kvm->memslots, slots);
    synchronize_srcu_expedited(&kvm->srcu);
    --
    1.7.7.1


    \
     
     \ /
      Last update: 2011-11-18 10:21    [W:0.025 / U:91.036 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site