Hi On Wed, Jul 7, 2021 at 9:35 PM Steve Sistare wrote: > Add a function that returns true if any ram_list block represents > volatile memory. > > Signed-off-by: Steve Sistare > --- > include/exec/memory.h | 8 ++++++++ > softmmu/memory.c | 30 ++++++++++++++++++++++++++++++ > 2 files changed, 38 insertions(+) > > diff --git a/include/exec/memory.h b/include/exec/memory.h > index b116f7c..7ad63f8 100644 > --- a/include/exec/memory.h > +++ b/include/exec/memory.h > @@ -2649,6 +2649,14 @@ bool ram_block_discard_is_disabled(void); > */ > bool ram_block_discard_is_required(void); > > +/** > + * qemu_ram_volatile: return true if any memory regions are writable and > not > + * backed by shared memory. > + * > + * @errp: returned error message identifying the bad region. > + */ > +bool qemu_ram_volatile(Error **errp); > Usually, bool-value functions with an error return true on success. If it deviates from the recommendation, it should at least be documented. Also, we have a preference for using _is_ in the function name for such tests. + > #endif > > #endif > diff --git a/softmmu/memory.c b/softmmu/memory.c > index f016151..e9536bc 100644 > --- a/softmmu/memory.c > +++ b/softmmu/memory.c > @@ -2714,6 +2714,36 @@ void memory_global_dirty_log_stop(void) > memory_global_dirty_log_do_stop(); > } > > +/* > + * Return true if any memory regions are writable and not backed by shared > + * memory. > + */ > Let's not duplicate API comments. +bool qemu_ram_volatile(Error **errp) > +{ > + RAMBlock *block; > + MemoryRegion *mr; > + bool ret = false; > + > + rcu_read_lock(); > RCU_READ_LOCK_GUARD() > + QLIST_FOREACH_RCU(block, &ram_list.blocks, next) { > RAMBLOCK_FOREACH() should do. Or rather use the qemu_ram_foreach_block() helper. + mr = block->mr; > + if (mr && > + memory_region_is_ram(mr) && > + !memory_region_is_ram_device(mr) && > + !memory_region_is_rom(mr) && > + (block->fd == -1 || !qemu_ram_is_shared(block))) { > + > + error_setg(errp, "Memory region %s is volatile", > + memory_region_name(mr)); > + ret = true; > + break; > + } > + } > + > + rcu_read_unlock(); > + return ret; > +} > + > static void listener_add_address_space(MemoryListener *listener, > AddressSpace *as) > { > -- > 1.8.3.1 > > > -- Marc-André Lureau