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.mart...@oracle.com>
>> Reviewed-by: Peter Xu <pet...@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
>>