diff mbox series

[v3,1/2] exec/ram_addr: return nr of dirty pages in cpu_physical_memory_set_dirty_lebitmap()

Message ID 20230529121114.5038-2-joao.m.martins@oracle.com (mailing list archive)
State New, archived
Headers show
Series hw/vfio: Improve vfio_get_dirty_bitmap() tracepoint | expand

Commit Message

Joao Martins May 29, 2023, 12:11 p.m. UTC
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>
---
 include/exec/ram_addr.h | 28 ++++++++++++++++++++++------
 1 file changed, 22 insertions(+), 6 deletions(-)

Comments

Avihai Horon May 30, 2023, 8:37 a.m. UTC | #1
On 29/05/2023 15:11, Joao Martins wrote:
> External email: Use caution opening links or attachments
>
Nit, s/nr/number in the subject.

> 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>
> ---
>   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
>
Joao Martins May 30, 2023, 8:48 a.m. UTC | #2
On 30/05/2023 09:37, Avihai Horon wrote:
> 
> On 29/05/2023 15:11, Joao Martins wrote:
>> External email: Use caution opening links or attachments
>>
> Nit, s/nr/number in the subject.
> 

Fixed (this was instinctly just trying to fit 80 columns)

>> 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>
>> ---
>>   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
>>
Philippe Mathieu-Daudé May 30, 2023, 12:44 p.m. UTC | #3
On 29/5/23 14:11, Joao Martins wrote:
> 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>
> ---
>   include/exec/ram_addr.h | 28 ++++++++++++++++++++++------
>   1 file changed, 22 insertions(+), 6 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
diff mbox series

Patch

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 */