From 975470474584d07876c42689973a572c488fc418 Mon Sep 17 00:00:00 2001 From: hanliyang Date: Thu, 25 Dec 2025 21:23:54 +0800 Subject: [PATCH] Fix P2P in CSV3 VM, fix dma mapping update for CSV3 VM - Add vfio listener for CSV3 VM's mmio range. - Ensure the iommu page table for the entire notified GPA range are handled. Hygon-SIG: commit none hygon Fix P2P in CSV3 VM, fix dma mapping update for CSV3 VM Signed-off-by: hanliyang --- ...o-Fix-CSV3-mapping-device-mmio-issue.patch | 155 ++++++++++++++++++ ...Remove-all-nodes-within-dma-unmappin.patch | 35 ++++ qemu.spec | 10 +- 3 files changed, 199 insertions(+), 1 deletion(-) create mode 100644 1169-vfio-Fix-CSV3-mapping-device-mmio-issue.patch create mode 100644 1170-target-i386-csv-Remove-all-nodes-within-dma-unmappin.patch diff --git a/1169-vfio-Fix-CSV3-mapping-device-mmio-issue.patch b/1169-vfio-Fix-CSV3-mapping-device-mmio-issue.patch new file mode 100644 index 0000000..87694f9 --- /dev/null +++ b/1169-vfio-Fix-CSV3-mapping-device-mmio-issue.patch @@ -0,0 +1,155 @@ +From 0022618b656efb16ab1a2dc6c308a363c227da0c Mon Sep 17 00:00:00 2001 +From: yangwencheng +Date: Thu, 13 Nov 2025 12:56:54 +0000 +Subject: [PATCH 1/2] vfio: Fix CSV3 mapping device mmio issue + +To resolve double memory on CSV3 platform, patch +"vfio: Only map shared region for CSV virtual machine" +only setup mapping for shared pages, but device's mmio region is not +mapped on iommu page table, thus device P2P is inavalable. + +The patch fixes the issue, the memory region for mmio has ram_device set +to true, so we can filter out the mmio region, then setup mapping for +the mmio region. + +Hygon-SIG: commit none hygon csv: vfio: Fix CSV3 mapping device mmio issue + +Signed-off-by: yangwencheng +Signed-off-by: Zhiguang Ni +Signed-off-by: hanliyang +--- + hw/vfio/common.c | 60 +++++++++++++++++++++++++++++++++++ + hw/vfio/container.c | 8 ++++- + include/hw/vfio/vfio-common.h | 4 +++ + 3 files changed, 71 insertions(+), 1 deletion(-) + +diff --git a/hw/vfio/common.c b/hw/vfio/common.c +index a5dfc2d27..bcc777aae 100644 +--- a/hw/vfio/common.c ++++ b/hw/vfio/common.c +@@ -807,6 +807,66 @@ static void vfio_listener_region_del(MemoryListener *listener, + vfio_container_del_section_window(container, section); + } + ++static void csv3_vfio_ram_listener_region_add(MemoryListener *listener, ++ MemoryRegionSection *section) ++{ ++ VFIOContainer *container; ++ ++ if (!kvm_csv3_enabled()) ++ return; ++ ++ container = container_of(listener, VFIOContainer, csv3_ram_listener); ++ vfio_listener_region_add(&container->listener, section); ++} ++ ++static void csv3_vfio_ram_listener_region_del(MemoryListener *listener, ++ MemoryRegionSection *section) ++{ ++ VFIOContainer *container; ++ ++ if (!kvm_csv3_enabled()) ++ return; ++ ++ container = container_of(listener, VFIOContainer, csv3_ram_listener); ++ vfio_listener_region_del(&container->listener, section); ++} ++ ++static void csv3_vfio_mmio_listener_region_add(MemoryListener *listener, ++ MemoryRegionSection *section) ++{ ++ VFIOContainer *container; ++ ++ if (!kvm_csv3_enabled() || !memory_region_is_ram_device(section->mr)) ++ return; ++ ++ container = container_of(listener, VFIOContainer, csv3_mmio_listener); ++ vfio_listener_region_add(&container->listener, section); ++} ++ ++static void csv3_vfio_mmio_listener_region_del(MemoryListener *listener, ++ MemoryRegionSection *section) ++{ ++ VFIOContainer *container; ++ ++ if (!kvm_csv3_enabled() || !memory_region_is_ram_device(section->mr)) ++ return; ++ ++ container = container_of(listener, VFIOContainer, csv3_mmio_listener); ++ vfio_listener_region_del(&container->listener, section); ++} ++ ++const MemoryListener csv3_vfio_ram_listener = { ++ .name = "csv3-vfio-ram", ++ .region_add = csv3_vfio_ram_listener_region_add, ++ .region_del = csv3_vfio_ram_listener_region_del, ++}; ++ ++const MemoryListener csv3_vfio_mmio_listener = { ++ .name = "csv3-vfio-mmio", ++ .region_add = csv3_vfio_mmio_listener_region_add, ++ .region_del = csv3_vfio_mmio_listener_region_del, ++}; ++ + typedef struct VFIODirtyRanges { + hwaddr min32; + hwaddr max32; +diff --git a/hw/vfio/container.c b/hw/vfio/container.c +index 0d6e6b428..710c7e75e 100644 +--- a/hw/vfio/container.c ++++ b/hw/vfio/container.c +@@ -641,8 +641,12 @@ static int vfio_connect_container(VFIOGroup *group, AddressSpace *as, + container->listener = vfio_memory_listener; + + if (kvm_csv3_enabled()) { +- shared_memory_listener_register(&container->listener, ++ container->csv3_ram_listener = csv3_vfio_ram_listener; ++ container->csv3_mmio_listener = csv3_vfio_mmio_listener; ++ shared_memory_listener_register(&container->csv3_ram_listener, + container->space->as); ++ memory_listener_register(&container->csv3_mmio_listener, ++ container->space->as); + } else { + memory_listener_register(&container->listener, container->space->as); + } +@@ -663,6 +667,7 @@ listener_release_exit: + vfio_kvm_device_del_group(group); + if (kvm_csv3_enabled()) { + shared_memory_listener_unregister(); ++ memory_listener_unregister(&container->csv3_mmio_listener); + } else { + memory_listener_unregister(&container->listener); + } +@@ -701,6 +706,7 @@ static void vfio_disconnect_container(VFIOGroup *group) + if (QLIST_EMPTY(&container->group_list)) { + if (kvm_csv3_enabled()) { + shared_memory_listener_unregister(); ++ memory_listener_unregister(&container->csv3_mmio_listener); + } else { + memory_listener_unregister(&container->listener); + } +diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h +index a4a22accb..229d3616f 100644 +--- a/include/hw/vfio/vfio-common.h ++++ b/include/hw/vfio/vfio-common.h +@@ -84,6 +84,8 @@ typedef struct VFIOContainer { + VFIOAddressSpace *space; + int fd; /* /dev/vfio/vfio, empowered by the attached groups */ + MemoryListener listener; ++ MemoryListener csv3_ram_listener; ++ MemoryListener csv3_mmio_listener; + MemoryListener prereg_listener; + unsigned iommu_type; + Error *error; +@@ -261,6 +263,8 @@ extern VFIOGroupList vfio_group_list; + extern VFIODeviceList vfio_device_list; + + extern const MemoryListener vfio_memory_listener; ++extern const MemoryListener csv3_vfio_ram_listener; ++extern const MemoryListener csv3_vfio_mmio_listener; + extern int vfio_kvm_device_fd; + + bool vfio_mig_active(void); +-- +2.43.7 + diff --git a/1170-target-i386-csv-Remove-all-nodes-within-dma-unmappin.patch b/1170-target-i386-csv-Remove-all-nodes-within-dma-unmappin.patch new file mode 100644 index 0000000..095df18 --- /dev/null +++ b/1170-target-i386-csv-Remove-all-nodes-within-dma-unmappin.patch @@ -0,0 +1,35 @@ +From 01ae9989bf4d60dacae27b6d8421abe489c451e9 Mon Sep 17 00:00:00 2001 +From: Zhiguang Ni +Date: Mon, 22 Dec 2025 11:31:48 +0000 +Subject: [PATCH 2/2] target/i386: csv: Remove all nodes within dma unmapping + addr range + +If [start, end] covers many dma nodes range, we should remove all of them +from the list. Currently only remove the first node met the condition, +thus would casue the rest nodes not be removed, their dma mapping are +left. + +Hygon-SIG: commit none hygon target/i386: csv: Remove all nodes within dma unmapping addr range + +Signed-off-by: yangwencheng +Signed-off-by: Zhiguang Ni +Signed-off-by: hanliyang +--- + target/i386/csv.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/target/i386/csv.c b/target/i386/csv.c +index 025393948..bdb45e2a9 100644 +--- a/target/i386/csv.c ++++ b/target/i386/csv.c +@@ -536,7 +536,6 @@ void csv3_shared_region_dma_unmap(uint64_t start, uint64_t end) + QTAILQ_REMOVE(&s->dma_map_regions_list, pos, list); + g_free(pos); + } +- break; + } + if ((start + size) <= curr_end) { + break; +-- +2.43.7 + diff --git a/qemu.spec b/qemu.spec index 3a961a1..654f607 100644 --- a/qemu.spec +++ b/qemu.spec @@ -136,7 +136,7 @@ Summary: QEMU is a FAST! processor emulator Name: qemu Version: 8.2.2 -Release: 41%{?dist} +Release: 42%{?dist} License: GPLv2 and BSD and MIT and CC-BY URL: http://www.qemu.org/ Source0: https://download.qemu.org/%{name}-%{version}.tar.xz @@ -498,6 +498,10 @@ Patch1167: 1167-target-i386-csv-Enhance-get-release-logic-for-shared.patch # Fix CSV3 shared memory handling to avoid boot slowdown Patch1168: 1168-target-i386-csv-Directly-skip-the-GPA-range-if-it-do.patch +# Fix P2P in CSV3 VM, fix dma mapping update for CSV3 VM +Patch1169: 1169-vfio-Fix-CSV3-mapping-device-mmio-issue.patch +Patch1170: 1170-target-i386-csv-Remove-all-nodes-within-dma-unmappin.patch + BuildRequires: meson >= %{meson_version} BuildRequires: zlib-devel BuildRequires: glib2-devel @@ -2203,6 +2207,10 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \ %changelog +* Thu Dec 25 2025 hanliyang - 8.2.2-42 +- [Type] bugfix +- [DESC] Fix P2P in CSV3 VM, fix dma mapping update for CSV3 VM + * Wed Dec 24 2025 hanliyang - 8.2.2-41 - [Type] bugfix - [DESC] Fix CSV3 shared memory handling to avoid boot slowdown -- Gitee