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