* [PATCH v4 0/2] hw/vfio: Improve vfio_get_dirty_bitmap() tracepoint @ 2023-05-30 18:05 Joao Martins 2023-05-30 18:05 ` [PATCH v4 1/2] exec/ram_addr: return number of dirty pages in cpu_physical_memory_set_dirty_lebitmap() Joao Martins ` (2 more replies) 0 siblings, 3 replies; 7+ messages in thread From: Joao Martins @ 2023-05-30 18:05 UTC (permalink / raw) To: qemu-devel Cc: Alex Williamson, Cedric Le Goater, Paolo Bonzini, Peter Xu, David Hildenbrand, Philippe Mathieu-Daude, Avihai Horon, Joao Martins Hey, This tiny series changes the tracepoint to include the number of dirty pages via the vfio_get_dirty_bitmap. I find it useful for observability in general to understand the number of dirty pages in an IOVA range. With dirty tracking supported by device or IOMMU it's specially relevant data to include in the tracepoint. First patch changes the return value to be the number of dirty pages in the helper function setting dirty bits and the second patch expands the VFIO tracepoint to include the dirty pages. Thanks, Joao Changes since v3[3]: * s/nr/number in patches subject line (Avihai) * s/cpu_physical_memory_set_lebitmap()/cpu_physical_memory_set_dirty_lebitmap() (Avihai) * Add Reviewed-by's from Phillipe and Cedric Changes since v2[2]: * Add a comment explaining the difference of retval between cpu_physical_memory_set_dirty_lebitmap() and cpu_physical_memory_sync_dirty_bitmap() (Peter Xu) * Add Peter's Reviewed-by; * Rename dirty variable into dirty_pages (Philippe Mathieu-Daude) Changes since v1[1]: * Make the nr of dirty pages a retval similar to sync variant of helper in patch 1 (Cedric) * Stash number of bits set in bitmap quad in a variable and reuse in GLOBAL_DIRTY_RATE in patch 1 * Drop init to 0 given that we always initialize the @dirty used in the tracepoint [1] https://lore.kernel.org/qemu-devel/20230523151217.46427-1-joao.m.martins@oracle.com/ [2] https://lore.kernel.org/qemu-devel/20230525114321.71066-1-joao.m.martins@oracle.com/ [3] https://lore.kernel.org/qemu-devel/20230529121114.5038-1-joao.m.martins@oracle.com/ Joao Martins (2): exec/ram_addr: return number of dirty pages in cpu_physical_memory_set_dirty_lebitmap() hw/vfio: Add number of dirty pages to vfio_get_dirty_bitmap tracepoint hw/vfio/common.c | 7 ++++--- hw/vfio/trace-events | 2 +- include/exec/ram_addr.h | 28 ++++++++++++++++++++++------ 3 files changed, 27 insertions(+), 10 deletions(-) -- 2.39.3 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v4 1/2] exec/ram_addr: return number of dirty pages in cpu_physical_memory_set_dirty_lebitmap() 2023-05-30 18:05 [PATCH v4 0/2] hw/vfio: Improve vfio_get_dirty_bitmap() tracepoint Joao Martins @ 2023-05-30 18:05 ` Joao Martins 2023-05-30 18:05 ` [PATCH v4 2/2] hw/vfio: Add number of dirty pages to vfio_get_dirty_bitmap tracepoint Joao Martins 2023-06-13 9:34 ` [PATCH v4 0/2] hw/vfio: Improve vfio_get_dirty_bitmap() tracepoint Philippe Mathieu-Daudé 2 siblings, 0 replies; 7+ messages in thread From: Joao Martins @ 2023-05-30 18:05 UTC (permalink / raw) To: qemu-devel Cc: Alex Williamson, Cedric Le Goater, Paolo Bonzini, Peter Xu, David Hildenbrand, Philippe Mathieu-Daude, Avihai Horon, Joao Martins In preparation for including the number of dirty pages in the vfio_get_dirty_bitmap() tracepoint, return the number of dirty pages in cpu_physical_memory_set_dirty_lebitmap() similar to cpu_physical_memory_sync_dirty_bitmap(). To avoid counting twice when GLOBAL_DIRTY_RATE is enabled, stash the number of bits set per bitmap quad in a variable (@nbits) and reuse it there. Signed-off-by: Joao Martins <joao.m.martins@oracle.com> Reviewed-by: Peter Xu <peterx@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> --- include/exec/ram_addr.h | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/include/exec/ram_addr.h b/include/exec/ram_addr.h index 90a82692904f..9f2e3893f562 100644 --- a/include/exec/ram_addr.h +++ b/include/exec/ram_addr.h @@ -334,14 +334,23 @@ static inline void cpu_physical_memory_set_dirty_range(ram_addr_t start, } #if !defined(_WIN32) -static inline void cpu_physical_memory_set_dirty_lebitmap(unsigned long *bitmap, - ram_addr_t start, - ram_addr_t pages) + +/* + * Contrary to cpu_physical_memory_sync_dirty_bitmap() this function returns + * the number of dirty pages in @bitmap passed as argument. On the other hand, + * cpu_physical_memory_sync_dirty_bitmap() returns newly dirtied pages that + * weren't set in the global migration bitmap. + */ +static inline +uint64_t cpu_physical_memory_set_dirty_lebitmap(unsigned long *bitmap, + ram_addr_t start, + ram_addr_t pages) { unsigned long i, j; - unsigned long page_number, c; + unsigned long page_number, c, nbits; hwaddr addr; ram_addr_t ram_addr; + uint64_t num_dirty = 0; unsigned long len = (pages + HOST_LONG_BITS - 1) / HOST_LONG_BITS; unsigned long hpratio = qemu_real_host_page_size() / TARGET_PAGE_SIZE; unsigned long page = BIT_WORD(start >> TARGET_PAGE_BITS); @@ -369,6 +378,7 @@ static inline void cpu_physical_memory_set_dirty_lebitmap(unsigned long *bitmap, if (bitmap[k]) { unsigned long temp = leul_to_cpu(bitmap[k]); + nbits = ctpopl(temp); qatomic_or(&blocks[DIRTY_MEMORY_VGA][idx][offset], temp); if (global_dirty_tracking) { @@ -377,10 +387,12 @@ static inline void cpu_physical_memory_set_dirty_lebitmap(unsigned long *bitmap, temp); if (unlikely( global_dirty_tracking & GLOBAL_DIRTY_DIRTY_RATE)) { - total_dirty_pages += ctpopl(temp); + total_dirty_pages += nbits; } } + num_dirty += nbits; + if (tcg_enabled()) { qatomic_or(&blocks[DIRTY_MEMORY_CODE][idx][offset], temp); @@ -409,9 +421,11 @@ static inline void cpu_physical_memory_set_dirty_lebitmap(unsigned long *bitmap, for (i = 0; i < len; i++) { if (bitmap[i] != 0) { c = leul_to_cpu(bitmap[i]); + nbits = ctpopl(c); if (unlikely(global_dirty_tracking & GLOBAL_DIRTY_DIRTY_RATE)) { - total_dirty_pages += ctpopl(c); + total_dirty_pages += nbits; } + num_dirty += nbits; do { j = ctzl(c); c &= ~(1ul << j); @@ -424,6 +438,8 @@ static inline void cpu_physical_memory_set_dirty_lebitmap(unsigned long *bitmap, } } } + + return num_dirty; } #endif /* not _WIN32 */ -- 2.39.3 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v4 2/2] hw/vfio: Add number of dirty pages to vfio_get_dirty_bitmap tracepoint 2023-05-30 18:05 [PATCH v4 0/2] hw/vfio: Improve vfio_get_dirty_bitmap() tracepoint Joao Martins 2023-05-30 18:05 ` [PATCH v4 1/2] exec/ram_addr: return number of dirty pages in cpu_physical_memory_set_dirty_lebitmap() Joao Martins @ 2023-05-30 18:05 ` Joao Martins 2023-06-05 22:58 ` Alex Williamson 2023-06-13 9:34 ` [PATCH v4 0/2] hw/vfio: Improve vfio_get_dirty_bitmap() tracepoint Philippe Mathieu-Daudé 2 siblings, 1 reply; 7+ messages in thread From: Joao Martins @ 2023-05-30 18:05 UTC (permalink / raw) To: qemu-devel Cc: Alex Williamson, Cedric Le Goater, Paolo Bonzini, Peter Xu, David Hildenbrand, Philippe Mathieu-Daude, Avihai Horon, Joao Martins Include the number of dirty pages on the vfio_get_dirty_bitmap tracepoint. These are fetched from the newly added return value in cpu_physical_memory_set_dirty_lebitmap(). Signed-off-by: Joao Martins <joao.m.martins@oracle.com> Reviewed-by: Cédric Le Goater <clg@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> --- hw/vfio/common.c | 7 ++++--- hw/vfio/trace-events | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/hw/vfio/common.c b/hw/vfio/common.c index 78358ede2764..fa8fd949b1cf 100644 --- a/hw/vfio/common.c +++ b/hw/vfio/common.c @@ -1747,6 +1747,7 @@ static int vfio_get_dirty_bitmap(VFIOContainer *container, uint64_t iova, { bool all_device_dirty_tracking = vfio_devices_all_device_dirty_tracking(container); + uint64_t dirty_pages; VFIOBitmap vbmap; int ret; @@ -1772,11 +1773,11 @@ static int vfio_get_dirty_bitmap(VFIOContainer *container, uint64_t iova, goto out; } - cpu_physical_memory_set_dirty_lebitmap(vbmap.bitmap, ram_addr, - vbmap.pages); + dirty_pages = cpu_physical_memory_set_dirty_lebitmap(vbmap.bitmap, ram_addr, + vbmap.pages); trace_vfio_get_dirty_bitmap(container->fd, iova, size, vbmap.size, - ram_addr); + ram_addr, dirty_pages); out: g_free(vbmap.bitmap); diff --git a/hw/vfio/trace-events b/hw/vfio/trace-events index 646e42fd27f9..cfb60c354de3 100644 --- a/hw/vfio/trace-events +++ b/hw/vfio/trace-events @@ -120,7 +120,7 @@ vfio_region_sparse_mmap_header(const char *name, int index, int nr_areas) "Devic vfio_region_sparse_mmap_entry(int i, unsigned long start, unsigned long end) "sparse entry %d [0x%lx - 0x%lx]" vfio_get_dev_region(const char *name, int index, uint32_t type, uint32_t subtype) "%s index %d, %08x/%08x" vfio_dma_unmap_overflow_workaround(void) "" -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_pages) "container fd=%d, iova=0x%"PRIx64" size= 0x%"PRIx64" bitmap_size=0x%"PRIx64" start=0x%"PRIx64" dirty_pages=%"PRIu64 vfio_iommu_map_dirty_notify(uint64_t iova_start, uint64_t iova_end) "iommu dirty @ 0x%"PRIx64" - 0x%"PRIx64 # platform.c -- 2.39.3 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v4 2/2] hw/vfio: Add number of dirty pages to vfio_get_dirty_bitmap tracepoint 2023-05-30 18:05 ` [PATCH v4 2/2] hw/vfio: Add number of dirty pages to vfio_get_dirty_bitmap tracepoint Joao Martins @ 2023-06-05 22:58 ` Alex Williamson 0 siblings, 0 replies; 7+ messages in thread From: Alex Williamson @ 2023-06-05 22:58 UTC (permalink / raw) To: Joao Martins Cc: qemu-devel, Cedric Le Goater, Paolo Bonzini, Peter Xu, David Hildenbrand, Philippe Mathieu-Daude, Avihai Horon On Tue, 30 May 2023 19:05:56 +0100 Joao Martins <joao.m.martins@oracle.com> wrote: > Include the number of dirty pages on the vfio_get_dirty_bitmap tracepoint. > These are fetched from the newly added return value in > cpu_physical_memory_set_dirty_lebitmap(). > > Signed-off-by: Joao Martins <joao.m.martins@oracle.com> > Reviewed-by: Cédric Le Goater <clg@redhat.com> > Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> > --- > hw/vfio/common.c | 7 ++++--- > hw/vfio/trace-events | 2 +- > 2 files changed, 5 insertions(+), 4 deletions(-) Acked-by: Alex Williamson <alex.williamson@redhat.com> > diff --git a/hw/vfio/common.c b/hw/vfio/common.c > index 78358ede2764..fa8fd949b1cf 100644 > --- a/hw/vfio/common.c > +++ b/hw/vfio/common.c > @@ -1747,6 +1747,7 @@ static int vfio_get_dirty_bitmap(VFIOContainer *container, uint64_t iova, > { > bool all_device_dirty_tracking = > vfio_devices_all_device_dirty_tracking(container); > + uint64_t dirty_pages; > VFIOBitmap vbmap; > int ret; > > @@ -1772,11 +1773,11 @@ static int vfio_get_dirty_bitmap(VFIOContainer *container, uint64_t iova, > goto out; > } > > - cpu_physical_memory_set_dirty_lebitmap(vbmap.bitmap, ram_addr, > - vbmap.pages); > + dirty_pages = cpu_physical_memory_set_dirty_lebitmap(vbmap.bitmap, ram_addr, > + vbmap.pages); > > trace_vfio_get_dirty_bitmap(container->fd, iova, size, vbmap.size, > - ram_addr); > + ram_addr, dirty_pages); > out: > g_free(vbmap.bitmap); > > diff --git a/hw/vfio/trace-events b/hw/vfio/trace-events > index 646e42fd27f9..cfb60c354de3 100644 > --- a/hw/vfio/trace-events > +++ b/hw/vfio/trace-events > @@ -120,7 +120,7 @@ vfio_region_sparse_mmap_header(const char *name, int index, int nr_areas) "Devic > vfio_region_sparse_mmap_entry(int i, unsigned long start, unsigned long end) "sparse entry %d [0x%lx - 0x%lx]" > vfio_get_dev_region(const char *name, int index, uint32_t type, uint32_t subtype) "%s index %d, %08x/%08x" > vfio_dma_unmap_overflow_workaround(void) "" > -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_pages) "container fd=%d, iova=0x%"PRIx64" size= 0x%"PRIx64" bitmap_size=0x%"PRIx64" start=0x%"PRIx64" dirty_pages=%"PRIu64 > vfio_iommu_map_dirty_notify(uint64_t iova_start, uint64_t iova_end) "iommu dirty @ 0x%"PRIx64" - 0x%"PRIx64 > > # platform.c ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v4 0/2] hw/vfio: Improve vfio_get_dirty_bitmap() tracepoint 2023-05-30 18:05 [PATCH v4 0/2] hw/vfio: Improve vfio_get_dirty_bitmap() tracepoint Joao Martins 2023-05-30 18:05 ` [PATCH v4 1/2] exec/ram_addr: return number of dirty pages in cpu_physical_memory_set_dirty_lebitmap() Joao Martins 2023-05-30 18:05 ` [PATCH v4 2/2] hw/vfio: Add number of dirty pages to vfio_get_dirty_bitmap tracepoint Joao Martins @ 2023-06-13 9:34 ` Philippe Mathieu-Daudé 2023-06-13 9:37 ` Cédric Le Goater 2 siblings, 1 reply; 7+ messages in thread From: Philippe Mathieu-Daudé @ 2023-06-13 9:34 UTC (permalink / raw) To: Joao Martins, qemu-devel Cc: Alex Williamson, Cedric Le Goater, Paolo Bonzini, Peter Xu, David Hildenbrand, Avihai Horon On 30/5/23 20:05, Joao Martins wrote: > Joao Martins (2): > exec/ram_addr: return number of dirty pages in > cpu_physical_memory_set_dirty_lebitmap() > hw/vfio: Add number of dirty pages to vfio_get_dirty_bitmap tracepoint Queued, thanks. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v4 0/2] hw/vfio: Improve vfio_get_dirty_bitmap() tracepoint 2023-06-13 9:34 ` [PATCH v4 0/2] hw/vfio: Improve vfio_get_dirty_bitmap() tracepoint Philippe Mathieu-Daudé @ 2023-06-13 9:37 ` Cédric Le Goater 2023-06-13 9:45 ` Philippe Mathieu-Daudé 0 siblings, 1 reply; 7+ messages in thread From: Cédric Le Goater @ 2023-06-13 9:37 UTC (permalink / raw) To: Philippe Mathieu-Daudé, Joao Martins, qemu-devel Cc: Alex Williamson, Paolo Bonzini, Peter Xu, David Hildenbrand, Avihai Horon On 6/13/23 11:34, Philippe Mathieu-Daudé wrote: > On 30/5/23 20:05, Joao Martins wrote: > >> Joao Martins (2): >> exec/ram_addr: return number of dirty pages in >> cpu_physical_memory_set_dirty_lebitmap() >> hw/vfio: Add number of dirty pages to vfio_get_dirty_bitmap tracepoint > > Queued, thanks. > I had taken it into my vfio-next branch. As you wish. Thanks, C. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v4 0/2] hw/vfio: Improve vfio_get_dirty_bitmap() tracepoint 2023-06-13 9:37 ` Cédric Le Goater @ 2023-06-13 9:45 ` Philippe Mathieu-Daudé 0 siblings, 0 replies; 7+ messages in thread From: Philippe Mathieu-Daudé @ 2023-06-13 9:45 UTC (permalink / raw) To: Cédric Le Goater, Joao Martins, qemu-devel Cc: Alex Williamson, Paolo Bonzini, Peter Xu, David Hildenbrand, Avihai Horon On 13/6/23 11:37, Cédric Le Goater wrote: > On 6/13/23 11:34, Philippe Mathieu-Daudé wrote: >> On 30/5/23 20:05, Joao Martins wrote: >> >>> Joao Martins (2): >>> exec/ram_addr: return number of dirty pages in >>> cpu_physical_memory_set_dirty_lebitmap() >>> hw/vfio: Add number of dirty pages to vfio_get_dirty_bitmap >>> tracepoint >> >> Queued, thanks. >> > > I had taken it into my vfio-next branch. As you wish. Oh I just sent my PR :/ I can drop them if the PR fails. I didn't understood Alex ack'ing the series meant you'd take the series (I try to look for exec/memory patches). ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2023-06-13 11:45 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-05-30 18:05 [PATCH v4 0/2] hw/vfio: Improve vfio_get_dirty_bitmap() tracepoint Joao Martins 2023-05-30 18:05 ` [PATCH v4 1/2] exec/ram_addr: return number of dirty pages in cpu_physical_memory_set_dirty_lebitmap() Joao Martins 2023-05-30 18:05 ` [PATCH v4 2/2] hw/vfio: Add number of dirty pages to vfio_get_dirty_bitmap tracepoint Joao Martins 2023-06-05 22:58 ` Alex Williamson 2023-06-13 9:34 ` [PATCH v4 0/2] hw/vfio: Improve vfio_get_dirty_bitmap() tracepoint Philippe Mathieu-Daudé 2023-06-13 9:37 ` Cédric Le Goater 2023-06-13 9:45 ` Philippe Mathieu-Daudé
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).