From 886c9d1fc2b3a6c55c96e23e8ec0f5102a7e511d Mon Sep 17 00:00:00 2001 From: Prakruthi Deepak Heragu Date: Mon, 22 Jan 2024 12:10:04 -0800 Subject: [PATCH] ANDROID: arm64: virt: Invalidate tlb once the balloon before reporting/inflating Instead of invalidating the tlb of the guest every page it relinquishes, invalidate once before the host is informed about the free pages. Bug: 315173520 Change-Id: I8450fd552a27dfc791efa15e884982aeedaa3234 Signed-off-by: Prakruthi Deepak Heragu --- android/abi_gki_aarch64.stg | 10 ++++++++++ android/abi_gki_aarch64_virtual_device | 1 + arch/arm64/include/asm/hypervisor.h | 1 + arch/arm64/include/asm/mem_relinquish.h | 1 + arch/arm64/mm/mem_relinquish.c | 7 +++++++ drivers/virtio/virtio_balloon.c | 4 ++++ include/linux/mem_relinquish.h | 1 + 7 files changed, 25 insertions(+) diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index 1a118c993c5d..ac4d5b6a98dc 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -380788,6 +380788,15 @@ elf_symbol { type_id: 0xf68b6f5e full_name: "poll_state_synchronize_srcu" } +elf_symbol { + id: 0x7bf7b7b1 + name: "post_page_relinquish_tlb_inv" + is_defined: true + symbol_type: FUNCTION + crc: 0xcc8be82d + type_id: 0x10985193 + full_name: "post_page_relinquish_tlb_inv" +} elf_symbol { id: 0xd612789c name: "power_supply_am_i_supplied" @@ -407019,6 +407028,7 @@ interface { symbol_id: 0x3020cd17 symbol_id: 0x25c6452e symbol_id: 0x324d8228 + symbol_id: 0x7bf7b7b1 symbol_id: 0xd612789c symbol_id: 0x561323f1 symbol_id: 0x50bfe1d8 diff --git a/android/abi_gki_aarch64_virtual_device b/android/abi_gki_aarch64_virtual_device index 1d728eb18373..8b1b9a58bf64 100644 --- a/android/abi_gki_aarch64_virtual_device +++ b/android/abi_gki_aarch64_virtual_device @@ -1143,6 +1143,7 @@ page_relinquish page_reporting_register page_reporting_unregister + post_page_relinquish_tlb_inv register_oom_notifier register_shrinker __SetPageMovable diff --git a/arch/arm64/include/asm/hypervisor.h b/arch/arm64/include/asm/hypervisor.h index 9ad85b15dab0..bc8c85959ece 100644 --- a/arch/arm64/include/asm/hypervisor.h +++ b/arch/arm64/include/asm/hypervisor.h @@ -16,6 +16,7 @@ void kvm_init_ioremap_services(void); struct hypervisor_ops { #ifdef CONFIG_MEMORY_RELINQUISH void (*page_relinquish)(struct page *page); + void (*post_page_relinquish_tlb_inv)(void); #endif }; diff --git a/arch/arm64/include/asm/mem_relinquish.h b/arch/arm64/include/asm/mem_relinquish.h index ac51786a4a11..5d03ccdbe778 100644 --- a/arch/arm64/include/asm/mem_relinquish.h +++ b/arch/arm64/include/asm/mem_relinquish.h @@ -11,5 +11,6 @@ struct page; bool kvm_has_memrelinquish_services(void); void page_relinquish(struct page *page); +void post_page_relinquish_tlb_inv(void); #endif /* __ASM_MEM_RELINQUISH_H */ diff --git a/arch/arm64/mm/mem_relinquish.c b/arch/arm64/mm/mem_relinquish.c index 08bf966c7fc5..410cdaaec265 100644 --- a/arch/arm64/mm/mem_relinquish.c +++ b/arch/arm64/mm/mem_relinquish.c @@ -69,3 +69,10 @@ void page_relinquish(struct page *page) hyp_ops.page_relinquish(page); } EXPORT_SYMBOL_GPL(page_relinquish); + +void post_page_relinquish_tlb_inv(void) +{ + if (hyp_ops.post_page_relinquish_tlb_inv) + hyp_ops.post_page_relinquish_tlb_inv(); +} +EXPORT_SYMBOL_GPL(post_page_relinquish_tlb_inv); diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c index b5df72e909f9..320e36b5cb69 100644 --- a/drivers/virtio/virtio_balloon.c +++ b/drivers/virtio/virtio_balloon.c @@ -149,6 +149,8 @@ static void tell_host(struct virtio_balloon *vb, struct virtqueue *vq) sg_init_one(&sg, vb->pfns, sizeof(vb->pfns[0]) * vb->num_pfns); + post_page_relinquish_tlb_inv(); + /* We should always be able to add one buffer to an empty queue. */ virtqueue_add_outbuf(vq, &sg, 1, vb, GFP_KERNEL); virtqueue_kick(vq); @@ -177,6 +179,8 @@ static int virtballoon_free_page_report(struct page_reporting_dev_info *pr_dev_i if (WARN_ON_ONCE(err)) return err; + post_page_relinquish_tlb_inv(); + virtqueue_kick(vq); /* When host has read buffer, this completes via balloon_ack */ diff --git a/include/linux/mem_relinquish.h b/include/linux/mem_relinquish.h index b906c4196d11..111bdcbdc944 100644 --- a/include/linux/mem_relinquish.h +++ b/include/linux/mem_relinquish.h @@ -15,6 +15,7 @@ static inline bool kvm_has_memrelinquish_services(void) { return false; } static inline void page_relinquish(struct page *page) { } +static inline void post_page_relinquish_tlb_inv(void) { } #endif /* CONFIG_MEMORY_RELINQUISH */