[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH RFC 10/10] hw/vfio: Add nr of dirty pages to tracepoints
From: |
Joao Martins |
Subject: |
[PATCH RFC 10/10] hw/vfio: Add nr of dirty pages to tracepoints |
Date: |
Thu, 28 Apr 2022 22:13:51 +0100 |
Print the number of dirty pages after calling
cpu_physical_memory_set_lebitmap() on the vfio_get_dirty_bitmap
tracepoint. Additionally, print the number of dirty pages to
capture the unmap case under a new tracepoint called
vfio_set_dirty_pages.
Signed-off-by: Joao Martins <joao.m.martins@oracle.com>
---
hw/vfio/container.c | 12 +++++++++---
hw/vfio/iommufd.c | 10 ++++++----
hw/vfio/trace-events | 3 ++-
3 files changed, 17 insertions(+), 8 deletions(-)
diff --git a/hw/vfio/container.c b/hw/vfio/container.c
index fff8319c0036..b17d3499d9a1 100644
--- a/hw/vfio/container.c
+++ b/hw/vfio/container.c
@@ -146,6 +146,7 @@ static int vfio_dma_unmap_bitmap(VFIOLegacyContainer
*container,
struct vfio_iommu_type1_dma_unmap *unmap;
struct vfio_bitmap *bitmap;
uint64_t pages = REAL_HOST_PAGE_ALIGN(size) / qemu_real_host_page_size;
+ uint64_t dirty;
int ret;
unmap = g_malloc0(sizeof(*unmap) + sizeof(*bitmap));
@@ -181,8 +182,11 @@ static int vfio_dma_unmap_bitmap(VFIOLegacyContainer
*container,
ret = ioctl(container->fd, VFIO_IOMMU_UNMAP_DMA, unmap);
if (!ret) {
+ dirty = total_dirty_pages;
cpu_physical_memory_set_dirty_lebitmap((unsigned long *)bitmap->data,
iotlb->translated_addr, pages);
+ trace_vfio_set_dirty_pages(container->fd, iova, size,
+ total_dirty_pages - dirty);
} else {
error_report("VFIO_UNMAP_DMA with DIRTY_BITMAP : %m");
}
@@ -312,7 +316,7 @@ static int vfio_get_dirty_bitmap(VFIOContainer *bcontainer,
uint64_t iova,
VFIOLegacyContainer, obj);
struct vfio_iommu_type1_dirty_bitmap *dbitmap;
struct vfio_iommu_type1_dirty_bitmap_get *range;
- uint64_t pages;
+ uint64_t pages, dirty;
int ret;
if (!memory_global_dirty_devices()) {
@@ -351,11 +355,13 @@ static int vfio_get_dirty_bitmap(VFIOContainer
*bcontainer, uint64_t iova,
goto err_out;
}
+
+ dirty = total_dirty_pages;
cpu_physical_memory_set_dirty_lebitmap((unsigned long *)range->bitmap.data,
ram_addr, pages);
-
trace_vfio_get_dirty_bitmap(container->fd, range->iova, range->size,
- range->bitmap.size, ram_addr);
+ range->bitmap.size, ram_addr,
+ total_dirty_pages - dirty);
err_out:
g_free(range->bitmap.data);
g_free(dbitmap);
diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c
index 4686cc713aac..461030bb7135 100644
--- a/hw/vfio/iommufd.c
+++ b/hw/vfio/iommufd.c
@@ -77,7 +77,7 @@ static int iommufd_copy(VFIOContainer *src, VFIOContainer
*dst,
static int iommufd_unmap_bitmap(int iommufd, int ioas_id, hwaddr iova,
ram_addr_t size, ram_addr_t translated)
{
- unsigned long *data, pgsize, bitmap_size, pages;
+ unsigned long *data, pgsize, bitmap_size, pages, dirty;
int ret;
pgsize = qemu_real_host_page_size;
@@ -95,9 +95,10 @@ static int iommufd_unmap_bitmap(int iommufd, int ioas_id,
hwaddr iova,
goto err_out;
}
+ dirty = total_dirty_pages;
cpu_physical_memory_set_dirty_lebitmap(data, translated, pages);
- trace_vfio_get_dirty_bitmap(iommufd, iova, size, bitmap_size, translated);
+ trace_vfio_set_dirty_pages(iommufd, iova, size, total_dirty_pages - dirty);
err_out:
g_free(data);
@@ -148,7 +149,7 @@ static int iommufd_get_dirty_bitmap(VFIOContainer
*bcontainer, uint64_t iova,
VFIOIOMMUFDContainer, obj);
int ret;
VFIOIOASHwpt *hwpt;
- unsigned long *data, page_size, bitmap_size, pages;
+ unsigned long *data, page_size, bitmap_size, pages, dirty;
if (!memory_global_dirty_devices()) {
return 0;
@@ -176,10 +177,11 @@ static int iommufd_get_dirty_bitmap(VFIOContainer
*bcontainer, uint64_t iova,
}
}
+ dirty = total_dirty_pages;
cpu_physical_memory_set_dirty_lebitmap(data, ram_addr, pages);
trace_vfio_get_dirty_bitmap(container->iommufd, iova, size, bitmap_size,
- ram_addr);
+ ram_addr, total_dirty_pages - dirty);
err_out:
g_free(data);
diff --git a/hw/vfio/trace-events b/hw/vfio/trace-events
index 51f04b0b80b8..c8d6348469aa 100644
--- a/hw/vfio/trace-events
+++ b/hw/vfio/trace-events
@@ -163,7 +163,8 @@ vfio_load_device_config_state(const char *name) " (%s)"
vfio_load_state(const char *name, uint64_t data) " (%s) data 0x%"PRIx64
vfio_load_state_device_data(const char *name, uint64_t data_offset, uint64_t
data_size) " (%s) Offset 0x%"PRIx64" size 0x%"PRIx64
vfio_load_cleanup(const char *name) " (%s)"
-vfio_get_dirty_bitmap(int fd, uint64_t iova, uint64_t size, uint64_t
bitmap_size, uint64_t start) "container fd=%d, iova=0x%"PRIx64" size=
0x%"PRIx64" bitmap_size=0x%"PRIx64" start=0x%"PRIx64
+vfio_get_dirty_bitmap(int fd, uint64_t iova, uint64_t size, uint64_t
bitmap_size, uint64_t start, uint64_t dirty) "container fd=%d, iova=0x%"PRIx64"
size= 0x%"PRIx64" bitmap_size=0x%"PRIx64" start=0x%"PRIx64" dirty=%"PRIu64
+vfio_set_dirty_pages(int fd, uint64_t iova, uint64_t size, uint64_t nr_pages)
"container fd=%d, iova=0x%"PRIx64" size=0x%"PRIx64" nr_pages=%"PRIu64
vfio_iommu_map_dirty_notify(uint64_t iova_start, uint64_t iova_end) "iommu
dirty @ 0x%"PRIx64" - 0x%"PRIx64
#iommufd.c
--
2.17.2
- [PATCH RFC 04/10] intel_iommu: Second Stage Access Dirty bit support, (continued)
- [PATCH RFC 04/10] intel_iommu: Second Stage Access Dirty bit support, Joao Martins, 2022/04/28
- [PATCH RFC 02/10] amd-iommu: Access/Dirty bit support, Joao Martins, 2022/04/28
- [PATCH RFC 03/10] intel-iommu: Cache PASID entry flags, Joao Martins, 2022/04/28
- [PATCH RFC 05/10] linux-headers: import iommufd.h hwpt extensions, Joao Martins, 2022/04/28
- [PATCH RFC 07/10] vfio/iommufd: Add HWPT_GET_DIRTY_IOVA support, Joao Martins, 2022/04/28
- [PATCH RFC 08/10] vfio/iommufd: Add IOAS_UNMAP_DIRTY support, Joao Martins, 2022/04/28
- [PATCH RFC 06/10] vfio/iommufd: Add HWPT_SET_DIRTY support, Joao Martins, 2022/04/28
- [PATCH RFC 09/10] migration/dirtyrate: Expand dirty_bitmap to be tracked separately for devices, Joao Martins, 2022/04/28
- [PATCH RFC 10/10] hw/vfio: Add nr of dirty pages to tracepoints,
Joao Martins <=