All of lore.kernel.org
 help / color / mirror / Atom feed
* [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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.