diff options
author | Igor Mammedov <imammedo@redhat.com> | 2014-12-01 12:29:26 -0500 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2014-12-04 09:29:11 -0500 |
commit | 0e60b0799fedc495a5c57dbd669de3c10d72edd2 (patch) | |
tree | 3417687e0dc1104d47100368bead30faacad6c4b /virt | |
parent | d4ae84a02bc65cec29608bc417a969fc2ec75449 (diff) |
kvm: change memslot sorting rule from size to GFN
it will allow to use binary search for GFN -> memslot
lookups, reducing lookup cost with large slots amount.
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'virt')
-rw-r--r-- | virt/kvm/kvm_main.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 278ed65cc9c5..162817f853ec 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
@@ -666,10 +666,10 @@ static int kvm_create_dirty_bitmap(struct kvm_memory_slot *memslot) | |||
666 | } | 666 | } |
667 | 667 | ||
668 | /* | 668 | /* |
669 | * Insert memslot and re-sort memslots based on their size, | 669 | * Insert memslot and re-sort memslots based on their GFN, |
670 | * so the larger slots will get better fit. Sorting algorithm | 670 | * so binary search could be used to lookup GFN. |
671 | * takes advantage of having initially sorted array and | 671 | * Sorting algorithm takes advantage of having initially |
672 | * known changed memslot position. | 672 | * sorted array and known changed memslot position. |
673 | */ | 673 | */ |
674 | static void update_memslots(struct kvm_memslots *slots, | 674 | static void update_memslots(struct kvm_memslots *slots, |
675 | struct kvm_memory_slot *new) | 675 | struct kvm_memory_slot *new) |
@@ -679,14 +679,19 @@ static void update_memslots(struct kvm_memslots *slots, | |||
679 | struct kvm_memory_slot *mslots = slots->memslots; | 679 | struct kvm_memory_slot *mslots = slots->memslots; |
680 | 680 | ||
681 | WARN_ON(mslots[i].id != id); | 681 | WARN_ON(mslots[i].id != id); |
682 | if (!new->npages) | ||
683 | new->base_gfn = 0; | ||
684 | |||
682 | while (i < KVM_MEM_SLOTS_NUM - 1 && | 685 | while (i < KVM_MEM_SLOTS_NUM - 1 && |
683 | new->npages < mslots[i + 1].npages) { | 686 | new->base_gfn <= mslots[i + 1].base_gfn) { |
687 | if (!mslots[i + 1].npages) | ||
688 | break; | ||
684 | mslots[i] = mslots[i + 1]; | 689 | mslots[i] = mslots[i + 1]; |
685 | slots->id_to_index[mslots[i].id] = i; | 690 | slots->id_to_index[mslots[i].id] = i; |
686 | i++; | 691 | i++; |
687 | } | 692 | } |
688 | while (i > 0 && | 693 | while (i > 0 && |
689 | new->npages > mslots[i - 1].npages) { | 694 | new->base_gfn > mslots[i - 1].base_gfn) { |
690 | mslots[i] = mslots[i - 1]; | 695 | mslots[i] = mslots[i - 1]; |
691 | slots->id_to_index[mslots[i].id] = i; | 696 | slots->id_to_index[mslots[i].id] = i; |
692 | i--; | 697 | i--; |