qemu/include/exec
David Hildenbrand 21ce2fb8f3 softmmu/physmem: fix memory leak in dirty_memory_extend()
As reported by Peter, we might be leaking memory when removing the
highest RAMBlock (in the weird ram_addr_t space), and adding a new one.

We will fail to realize that we already allocated bitmaps for more
dirty memory blocks, and effectively discard the pointers to them.

Fix it by getting rid of last_ram_page() and by remembering the number
of dirty memory blocks that have been allocated already.

While at it, let's use "unsigned int" for the number of blocks, which
should be sufficient until we reach ~32 exabytes.

Looks like this leak was introduced as we switched from using a single
bitmap_zero_extend() to allocating multiple bitmaps:
bitmap_zero_extend() relies on g_renew() which should have taken care of
this.

Resolves: https://lkml.kernel.org/r/CAFEAcA-k7a+VObGAfCFNygQNfCKL=AfX6A4kScq=VSSK0peqPg@mail.gmail.com
Reported-by: Peter Maydell <peter.maydell@linaro.org>
Fixes: 5b82b703b6 ("memory: RCU ram_list.dirty_memory[] for safe RAM hotplug")
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Peter Xu <peterx@redhat.com>
Tested-by: Peter Maydell <peter.maydell@linaro.org>
Cc: qemu-stable@nongnu.org
Cc: Stefan Hajnoczi <stefanha@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Peter Xu <peterx@redhat.com>
Cc: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: David Hildenbrand <david@redhat.com>
Link: https://lore.kernel.org/r/20240828090743.128647-1-david@redhat.com
Signed-off-by: Peter Xu <peterx@redhat.com>
(cherry picked from commit b84f06c2be)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
(Mjt: context fix due to lack of
 v9.0.0-rc4-49-g15f7a80c49cb "RAMBlock: Add support of KVM private guest memfd")
2024-09-12 09:20:33 +03:00
..
user Fixed incorrect LLONG alignment for openrisc and cris 2023-09-11 10:53:50 +03:00
address-spaces.h Clean up header guards that don't match their file name 2016-07-12 16:19:16 +02:00
confidential-guest-support.h confidential guest support: Introduce cgs "ready" flag 2021-02-08 16:57:38 +11:00
cpu-all.h accel/tcg: Simplify page_get/alloc_target_data 2022-10-26 11:11:28 +10:00
cpu-common.h exec/cpu-common: add qemu_ram_get_fd() 2022-10-26 14:56:42 -04:00
cpu-defs.h accel/tcg: Introduce TARGET_TB_PCREL 2022-10-04 12:13:16 -07:00
cpu_ldst.h Replace TARGET_WORDS_BIGENDIAN 2022-04-06 10:50:37 +02:00
cputlb.h overall/alpha tcg cpus|hppa: Fix Lesser GPL version number 2020-11-15 16:43:54 +01:00
exec-all.h accel/tcg: Revert mapping of PCREL translation block to multiple virtual addresses 2024-01-25 19:14:18 +03:00
gdbstub.h gdbstub: Adjust gdb_syscall_complete_cb declaration 2022-06-28 04:35:52 +05:30
gen-icount.h accel/tcg: introduce CF_NOIRQ 2021-11-29 15:12:37 +00:00
helper-gen.h tracing: excise the tcg related from tracetool 2022-02-09 12:08:42 +00:00
helper-head.h compiler.h: replace QEMU_NORETURN with G_NORETURN 2022-04-21 17:03:51 +04:00
helper-proto.h tracing: remove the trace-tcg includes from the build 2022-02-09 12:08:42 +00:00
helper-tcg.h tracing: remove the trace-tcg includes from the build 2022-02-09 12:08:42 +00:00
hwaddr.h move MemMapEntry 2020-09-30 11:29:56 +02:00
ioport.h nomaintainer: Fix Lesser GPL version number 2020-11-15 17:04:40 +01:00
log.h include/exec/log: Do not reference QemuLogFile directly 2022-04-20 10:51:11 -07:00
memattrs.h softmmu/physmem: Introduce MemTxAttrs::memory field and MEMTX_ACCESS_ERROR 2022-03-21 10:10:58 +01:00
memop.h Replace TARGET_WORDS_BIGENDIAN 2022-04-06 10:50:37 +02:00
memopidx.h Normalize header guard symbol definition 2022-05-11 16:50:26 +02:00
memory-internal.h cputlb: Merge and move memory_notdirty_write_{prepare,complete} 2019-09-25 10:44:29 -07:00
memory.h memory: prevent dma-reentracy issues 2023-09-11 10:53:50 +03:00
memory_ldst.h.inc exec/memory_ldst: Use correct type sizes 2021-05-26 08:35:51 -07:00
memory_ldst_cached.h.inc exec/memory_ldst_cached: Use correct type size 2021-05-26 08:35:51 -07:00
memory_ldst_phys.h.inc exec/memory_ldst_phys: Use correct type sizes 2021-05-26 08:35:51 -07:00
page-vary.h include: move target page bits declaration to page-vary.h 2022-04-06 14:31:43 +02:00
plugin-gen.h accel/tcg: Use DisasContextBase in plugin_gen_tb_start 2022-10-03 20:53:31 -07:00
poison.h disas: Remove libvixl disassembler 2022-07-05 10:15:49 +02:00
ram_addr.h migration: Use non-atomic ops for clear log bitmap 2022-11-21 11:58:10 +01:00
ramblock.h migration: Use non-atomic ops for clear log bitmap 2022-11-21 11:58:10 +01:00
ramlist.h softmmu/physmem: fix memory leak in dirty_memory_extend() 2024-09-12 09:20:33 +03:00
target_page.h migration: Make savevm.c target independent 2017-05-18 19:21:00 +02:00
translate-all.h accel/tcg: Rename tb_invalidate_phys_page_range and drop end parameter 2022-10-26 11:11:28 +10:00
translator.h target/s390x: fake instruction loading when handling 'ex' 2022-10-31 20:37:59 +00:00