lkml.org 
[lkml]   [2023]   [Mar]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[Patch v4 06/18] KVM: x86/mmu: Shrink split_shadow_page_cache via MMU shrinker
    From
    Use MMU shrinker to free unused pages in split_shadow_page_cache.
    Refactor the code and make common function to try emptying the page cache.

    Signed-off-by: Vipin Sharma <vipinsh@google.com>
    ---
    arch/x86/kvm/mmu/mmu.c | 34 +++++++++++++++++++++-------------
    1 file changed, 21 insertions(+), 13 deletions(-)

    diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
    index 0ebb8a2eaf47..73a0ac9c11ce 100644
    --- a/arch/x86/kvm/mmu/mmu.c
    +++ b/arch/x86/kvm/mmu/mmu.c
    @@ -6696,13 +6696,24 @@ void kvm_mmu_invalidate_mmio_sptes(struct kvm *kvm, u64 gen)
    }
    }

    +static int mmu_memory_cache_try_empty(struct kvm_mmu_memory_cache *cache,
    + struct mutex *cache_lock)
    +{
    + int freed = 0;
    +
    + if (mutex_trylock(cache_lock)) {
    + freed = cache->nobjs;
    + kvm_mmu_empty_memory_cache(cache);
    + mutex_unlock(cache_lock);
    + }
    + return freed;
    +}
    +
    static unsigned long mmu_shrink_scan(struct shrinker *shrink,
    struct shrink_control *sc)
    {
    struct kvm *kvm, *next_kvm, *first_kvm = NULL;
    - struct kvm_mmu_memory_cache *cache;
    unsigned long i, freed = 0;
    - struct mutex *cache_lock;
    struct kvm_vcpu *vcpu;

    mutex_lock(&kvm_lock);
    @@ -6716,18 +6727,15 @@ static unsigned long mmu_shrink_scan(struct shrinker *shrink,
    list_move_tail(&kvm->vm_list, &vm_list);

    kvm_for_each_vcpu(i, vcpu, kvm) {
    - cache = &vcpu->arch.mmu_shadow_page_cache;
    - cache_lock = &vcpu->arch.mmu_shadow_page_cache_lock;
    - if (mutex_trylock(cache_lock)) {
    - if (cache->nobjs) {
    - freed += cache->nobjs;
    - kvm_mmu_empty_memory_cache(cache);
    - }
    - mutex_unlock(cache_lock);
    - if (freed >= sc->nr_to_scan)
    - goto out;
    - }
    + freed += mmu_memory_cache_try_empty(&vcpu->arch.mmu_shadow_page_cache,
    + &vcpu->arch.mmu_shadow_page_cache_lock);
    + if (freed >= sc->nr_to_scan)
    + goto out;
    }
    + freed += mmu_memory_cache_try_empty(&kvm->arch.split_shadow_page_cache,
    + &kvm->slots_lock);
    + if (freed >= sc->nr_to_scan)
    + goto out;
    }
    out:
    mutex_unlock(&kvm_lock);
    --
    2.40.0.rc0.216.gc4246ad0f0-goog
    \
     
     \ /
      Last update: 2023-03-27 00:46    [W:4.100 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site