--- arch/arm64/kvm/arm.c | 5 +++++ arch/arm64/kvm/dirty_bit.c | 15 ++++++++++++++- arch/arm64/kvm/mmu.c | 5 ++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index 1737dbe13419..e053edf8387d 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -224,6 +224,8 @@ int kvm_vm_ioctl_enable_cap(struct kvm *kvm, r = -EBUSY; } else { kvm->arch.hdbss_buffer_size = size; + kvm_info("HDBSS buffer size set by userspace to %llu bytes\n", + size); r = 0; } mutex_unlock(&kvm->lock); @@ -252,6 +254,9 @@ void kvm_arch_dirty_ring_size_updated(struct kvm *kvm) return; kvm->arch.hdbss_buffer_size = KVM_ARM_HDBSS_DEFAULT_SIZE; + + kvm_info("HDBSS buffer size auto-configured to %u bytes for dirty-ring mode\n", + KVM_ARM_HDBSS_DEFAULT_SIZE); } /** diff --git a/arch/arm64/kvm/dirty_bit.c b/arch/arm64/kvm/dirty_bit.c index 205b5f7a2805..ae5acfc4fd5b 100644 --- a/arch/arm64/kvm/dirty_bit.c +++ b/arch/arm64/kvm/dirty_bit.c @@ -42,8 +42,11 @@ int kvm_arm_vcpu_alloc_hdbss(struct kvm_vcpu *vcpu) * pushing leftover page contents into the dirty ring as GFNs. */ hdbss_pg = alloc_pages(GFP_KERNEL_ACCOUNT | __GFP_ZERO, buddy_order); - if (!hdbss_pg) + if (!hdbss_pg) { + kvm_err("VCPU%u HDBSS buffer allocation failed (order=%u)\n", + vcpu->vcpu_id, buddy_order); return -ENOMEM; + } vcpu->arch.hdbss = (struct vcpu_hdbss_state) { .hdbss_pg = hdbss_pg, @@ -52,6 +55,9 @@ int kvm_arm_vcpu_alloc_hdbss(struct kvm_vcpu *vcpu) .buddy_order = buddy_order, }; + kvm_info("VCPU%u HDBSS buffer allocated (size=%u bytes, order=%u)\n", + vcpu->vcpu_id, size, buddy_order); + return 0; } @@ -60,6 +66,11 @@ void kvm_arm_vcpu_free_hdbss(struct kvm_vcpu *vcpu) if (!vcpu->arch.hdbss.hdbss_pg) return; + kvm_info("VCPU%u HDBSS buffer freed (size=%u bytes, order=%u)\n", + vcpu->vcpu_id, + PAGE_SIZE << vcpu->arch.hdbss.buddy_order, + vcpu->arch.hdbss.buddy_order); + __free_pages(vcpu->arch.hdbss.hdbss_pg, vcpu->arch.hdbss.buddy_order); vcpu->arch.hdbss.hdbss_pg = NULL; @@ -168,6 +179,8 @@ void kvm_arm_disable_hdbss_global(struct kvm *kvm) kvm->arch.mmu.vtcr &= ~dirty_bits; + kvm_info("HDBSS disabled\n"); + kvm_make_all_cpus_request(kvm, KVM_REQ_RELOAD_STAGE2); kvm_flush_remote_tlbs(kvm); } diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index 42cc35dde736..473de0f0b01b 100644 --- a/arch/arm64/kvm/mmu.c +++ b/arch/arm64/kvm/mmu.c @@ -2662,8 +2662,11 @@ void kvm_arch_update_hw_dirty_mode(struct kvm *kvm) unsigned long cur, target; bool logging = atomic_read(&kvm->nr_memslots_dirty_logging) != 0; - if (logging && kvm_supports_hdbss(kvm)) + if (logging && kvm_supports_hdbss(kvm)) { target = VTCR_EL2_HD | VTCR_EL2_HA | VTCR_EL2_HDBSS; + kvm_info("HDBSS enabled (buffer_size=%u bytes)\n", + kvm_hdbss_buffer_size(kvm)); + } else if (logging || !kvm_supports_hafdbs(kvm)) target = 0; else -- 2.33.0