From 48ae9346f1fdc71f51bb49f6f3de9612825b0887 Mon Sep 17 00:00:00 2001 From: eastmoutain <14304864+eastmoutain@user.noreply.gitee.com> Date: Thu, 20 Jun 2024 20:50:35 +0800 Subject: [PATCH] target/i386: csv: Release CSV3 shared pages after unmappig DMA The shared pages are created for Device DMA access, release them once DMA mapping is removed. Signed-off-by: yangwencheng --- ...Release-CSV3-shared-pages-after-unma.patch | 130 ++++++++++++++++++ qemu.spec | 7 +- 2 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 1053-target-i386-csv-Release-CSV3-shared-pages-after-unma.patch diff --git a/1053-target-i386-csv-Release-CSV3-shared-pages-after-unma.patch b/1053-target-i386-csv-Release-CSV3-shared-pages-after-unma.patch new file mode 100644 index 0000000..c5370a3 --- /dev/null +++ b/1053-target-i386-csv-Release-CSV3-shared-pages-after-unma.patch @@ -0,0 +1,130 @@ +From c112d0e1711e11f20bbde37c8af806f9cee8e336 Mon Sep 17 00:00:00 2001 +From: eastmoutain <14304864+eastmoutain@user.noreply.gitee.com> +Date: Mon, 20 May 2024 21:12:23 +0800 +Subject: [PATCH] target/i386: csv: Release CSV3 shared pages after unmapping + DMA + +The shared pages are created for Device DMA access, release them +once DMA mapping is removed. + +Signed-off-by: yangwencheng +--- + linux-headers/linux/kvm.h | 9 +++++++++ + target/i386/csv-sysemu-stub.c | 5 +++++ + target/i386/csv.c | 34 ++++++++++++++++++++++++++++++++++ + target/i386/csv.h | 1 + + target/i386/kvm/kvm.c | 1 + + 5 files changed, 50 insertions(+) + +diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h +index f67a7dde1..36da75b92 100644 +--- a/linux-headers/linux/kvm.h ++++ b/linux-headers/linux/kvm.h +@@ -2076,6 +2076,7 @@ enum csv3_cmd_id { + KVM_CSV3_SEND_ENCRYPT_CONTEXT, + KVM_CSV3_RECEIVE_ENCRYPT_DATA, + KVM_CSV3_RECEIVE_ENCRYPT_CONTEXT, ++ KVM_CSV3_HANDLE_MEMORY, + + KVM_CSV3_NR_MAX, + }; +@@ -2122,6 +2123,14 @@ struct kvm_csv3_receive_encrypt_context { + __u32 trans_len; + }; + ++#define KVM_CSV3_RELEASE_SHARED_MEMORY (0x0001) ++ ++struct kvm_csv3_handle_memory { ++ __u64 gpa; ++ __u32 num_pages; ++ __u32 opcode; ++}; ++ + #define KVM_DEV_ASSIGN_ENABLE_IOMMU (1 << 0) + #define KVM_DEV_ASSIGN_PCI_2_3 (1 << 1) + #define KVM_DEV_ASSIGN_MASK_INTX (1 << 2) +diff --git a/target/i386/csv-sysemu-stub.c b/target/i386/csv-sysemu-stub.c +index db22c299a..f3224a015 100644 +--- a/target/i386/csv-sysemu-stub.c ++++ b/target/i386/csv-sysemu-stub.c +@@ -39,3 +39,8 @@ void csv3_shared_region_dma_unmap(uint64_t start, uint64_t end) + { + + } ++ ++void csv3_shared_region_relese(uint64_t gpa, uint32_t num_pages) ++{ ++ ++} +diff --git a/target/i386/csv.c b/target/i386/csv.c +index 0593f9b19..a869cc2a7 100644 +--- a/target/i386/csv.c ++++ b/target/i386/csv.c +@@ -268,6 +268,40 @@ end: + return ret; + } + ++void csv3_shared_region_release(uint64_t gpa, uint32_t num_pages) ++{ ++ struct kvm_csv3_handle_memory mem = { 0 }; ++ MemoryRegion *mr = NULL; ++ void *hva; ++ int ret; ++ ++ if (!csv3_enabled()) ++ return; ++ ++ if (!gpa || !num_pages) ++ return; ++ ++ mem.gpa = (__u64)gpa; ++ mem.num_pages = (__u32)num_pages; ++ mem.opcode = (__u32)KVM_CSV3_RELEASE_SHARED_MEMORY; ++ ++ /* unpin the pages */ ++ ret = csv3_ioctl(KVM_CSV3_HANDLE_MEMORY, &mem, NULL); ++ if (ret <= 0) { ++ if (ret < 0) ++ error_report("%s: CSV3 unpin failed ret %d", __func__, ret); ++ return; ++ } ++ ++ /* drop the pages */ ++ hva = gpa2hva(&mr, gpa, num_pages << TARGET_PAGE_BITS, NULL); ++ if (hva) { ++ ret = madvise(hva, num_pages << TARGET_PAGE_BITS, MADV_DONTNEED); ++ if (ret) ++ error_report("%s: madvise failed %d", __func__, ret); ++ } ++} ++ + void csv3_shared_region_dma_unmap(uint64_t start, uint64_t end) + { + MemoryRegionSection section; +diff --git a/target/i386/csv.h b/target/i386/csv.h +index e5e05d006..a32588ab9 100644 +--- a/target/i386/csv.h ++++ b/target/i386/csv.h +@@ -122,6 +122,7 @@ int csv3_load_data(uint64_t gpa, uint8_t *ptr, uint64_t len, Error **errp); + + int csv3_shared_region_dma_map(uint64_t start, uint64_t end); + void csv3_shared_region_dma_unmap(uint64_t start, uint64_t end); ++void csv3_shared_region_release(uint64_t gpa, uint32_t num_pages); + int csv3_load_incoming_page(QEMUFile *f, uint8_t *ptr); + int csv3_load_incoming_context(QEMUFile *f); + int csv3_queue_outgoing_page(uint8_t *ptr, uint32_t sz, uint64_t addr); +diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c +index 925f4f804..fdceecc84 100644 +--- a/target/i386/kvm/kvm.c ++++ b/target/i386/kvm/kvm.c +@@ -5027,6 +5027,7 @@ static int kvm_handle_exit_hypercall(X86CPU *cpu, struct kvm_run *run) + if (enc) { + sev_remove_shared_regions_list(gfn_start, gfn_end); + csv3_shared_region_dma_unmap(gpa, gfn_end << TARGET_PAGE_BITS); ++ csv3_shared_region_release(gpa, npages); + } else { + sev_add_shared_regions_list(gfn_start, gfn_end); + csv3_shared_region_dma_map(gpa, gfn_end << TARGET_PAGE_BITS); +-- +2.39.3 + diff --git a/qemu.spec b/qemu.spec index 513a37c..ce4a4b5 100644 --- a/qemu.spec +++ b/qemu.spec @@ -1,4 +1,4 @@ -%define anolis_release 16 +%define anolis_release 17 %bcond_with check @@ -356,6 +356,7 @@ Patch1049: 1049-target-i386-Add-Hygon-Dhyana-v3-CPU-model.patch Patch1050: 1050-target-i386-Add-new-Hygon-Dharma-CPU-model.patch Patch1051: 1051-vfio-Add-vfio-based-mediated-hct-support.patch Patch1052: 1052-hw-net-virtio-net-Update-event-idx-if-guest-has-made.patch +Patch1053: 1053-target-i386-csv-Release-CSV3-shared-pages-after-unma.patch ExclusiveArch: x86_64 aarch64 loongarch64 @@ -1919,6 +1920,10 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \ %endif %changelog +* Mon Jun 20 2024 Wencheng Yang - 2:8.2.0-17 +- Patch1053: 1053-target-i386-csv-Release-CSV3-shared-pages-after-unma.patch + (Release CSV3 shared pages after unmapping DMA) + * Mon Jun 17 2024 Wencheng Yang - 2:8.2.0-16 - Patch1052: 1052-hw-net-virtio-net-Update-event-idx-if-guest-has-made.patch (Update virtio-net event idx after double check) -- Gitee