From 88e752a6e4b7aafeb93f2a4bcf9f0838cfacbaf3 Mon Sep 17 00:00:00 2001 From: hanliyang Date: Tue, 9 Sep 2025 09:52:18 +0000 Subject: [PATCH] [Feature]Add a CSV3 ioctl command to request Linux KVM update CSV3 VM's page attribute info ANBZ: #24568 Signed-off-by: hanliyang --- ...Release-CSV-shared-pages-after-unmap.patch | 132 ++++++++++++++++++ qemu-kvm.spec | 6 +- 2 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 1163-target-i386-csv-Release-CSV-shared-pages-after-unmap.patch diff --git a/1163-target-i386-csv-Release-CSV-shared-pages-after-unmap.patch b/1163-target-i386-csv-Release-CSV-shared-pages-after-unmap.patch new file mode 100644 index 0000000..9fd2b9c --- /dev/null +++ b/1163-target-i386-csv-Release-CSV-shared-pages-after-unmap.patch @@ -0,0 +1,132 @@ +From 26ba2e1fd7d39d4bb3ef55029a3264143cdf4d00 Mon Sep 17 00:00:00 2001 +From: yangwencheng +Date: Thu, 2 Nov 2023 04:46:03 -0400 +Subject: [PATCH] target/i386/csv: Release CSV 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 +Signed-off-by: hanliyang +--- + 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 eb069b0f31..8eeba1aa4e 100644 +--- a/linux-headers/linux/kvm.h ++++ b/linux-headers/linux/kvm.h +@@ -1969,6 +1969,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_SET_GUEST_PRIVATE_MEMORY = 0xc8, + +@@ -2017,6 +2018,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; ++}; ++ + struct kvm_csv_batch_list_node { + __u64 cmd_data_addr; + __u64 addr; +diff --git a/target/i386/csv-sysemu-stub.c b/target/i386/csv-sysemu-stub.c +index 66d734f94c..ca6f91cc4e 100644 +--- a/target/i386/csv-sysemu-stub.c ++++ b/target/i386/csv-sysemu-stub.c +@@ -43,6 +43,11 @@ void csv_shared_region_dma_unmap(uint64_t start, uint64_t end) + + } + ++void csv3_shared_region_release(uint64_t gpa, uint32_t num_pages) ++{ ++ ++} ++ + int csv3_set_guest_private_memory(Error **errp) + { + g_assert_not_reached(); +diff --git a/target/i386/csv.c b/target/i386/csv.c +index 12e2cc16be..5cfec8bb20 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 (!csv_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 csv_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 cc02ba83a4..f85c8770e6 100644 +--- a/target/i386/csv.h ++++ b/target/i386/csv.h +@@ -118,5 +118,6 @@ int csv3_queue_outgoing_page(uint8_t *ptr, uint32_t sz, uint64_t addr); + int csv3_save_queued_outgoing_pages(QEMUFile *f, uint64_t *bytes_sent); + + int csv3_set_guest_private_memory(Error **errp); ++void csv3_shared_region_release(uint64_t gpa, uint32_t num_pages); + + #endif +diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c +index fc50731bf9..f6dff95578 100644 +--- a/target/i386/kvm/kvm.c ++++ b/target/i386/kvm/kvm.c +@@ -4792,6 +4792,7 @@ static int kvm_handle_exit_hypercall(X86CPU *cpu, struct kvm_run *run) + if (enc) { + sev_remove_shared_regions_list(gfn_start, gfn_end); + csv_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); + csv_shared_region_dma_map(gpa, gfn_end << TARGET_PAGE_BITS); +-- +2.25.1 + diff --git a/qemu-kvm.spec b/qemu-kvm.spec index 641b9c9..b3135d5 100644 --- a/qemu-kvm.spec +++ b/qemu-kvm.spec @@ -92,7 +92,7 @@ Obsoletes: %1-rhev <= %{epoch}:%{version}-%{release} Summary: QEMU is a machine emulator and virtualizer Name: qemu-kvm Version: 6.2.0 -Release: 53%{?rcrel}%{anolis_release}%{?dist}.4 +Release: 53%{?rcrel}%{anolis_release}%{?dist}.5 # Epoch because we pushed a qemu-1.0 package. AIUI this can't ever be dropped Epoch: 15 License: GPLv2 and GPLv2+ and CC-BY @@ -1080,6 +1080,7 @@ Patch1159: 1159-target-i386-Enable-fdp-excptn-only-and-zero-fcs-fds.patch Patch1160: 1160-target-i386-Construct-CPUID-2-as-stateful-iff-times-.patch Patch1161: 1161-target-i386-Make-invtsc-migratable-when-user-sets-ts.patch Patch1162: 1162-target-i386-cpu-Fix-notes-for-CPU-models.patch +Patch1163: 1163-target-i386-csv-Release-CSV-shared-pages-after-unmap.patch BuildRequires: wget BuildRequires: rpm-build @@ -2318,6 +2319,9 @@ sh %{_sysconfdir}/sysconfig/modules/kvm.modules &> /dev/null || : %endif %changelog +* Tue Sep 09 2025 hanliyang - 6.2.0-53.0.8.5 +- Add a CSV3 ioctl command to request Linux KVM update CSV3 VM's page attribute info + * Wed Aug 27 2025 Jacob Wang - 6.2.0-53.0.8.4 - Adjust limit for virtiofsd minor version - Add loongarch supporti (lixianglai@loongson.cn) -- Gitee