Re: [PATCH v5 02/12] system/memory: move RamDiscardManager to separate compilation unit
Philippe Mathieu-Daudé <[email protected]> Thu, 18 Jun 2026 22:46:09 +0200
| Newsgroups | org.nongnu.qemu-rust,org.kernel.vger.kvm,org.nongnu.qemu-devel |
|---|---|
| Message-ID | <[email protected]> |
On 4/6/26 15:43, Marc-André Lureau wrote: > Extract RamDiscardManager and RamDiscardSource from system/memory.c into > dedicated a unit. > > This reduces coupling and allows code that only needs the > RamDiscardManager interface to avoid pulling in all of memory.h > dependencies. > > rust-sys bindings are no longer generated for RamDiscardSourceClass at > this point, thus we drop the unneeded InterfaceClass use. > > Reviewed-by: Peter Xu <[email protected]> > Acked-by: David Hildenbrand <[email protected]> > Signed-off-by: Marc-André Lureau <[email protected]> > --- > MAINTAINERS | 2 + > include/system/memory.h | 280 +-------------------------------- > include/system/ram-discard-manager.h | 297 +++++++++++++++++++++++++++++++++++ > system/memory.c | 221 -------------------------- > system/ram-discard-manager.c | 240 ++++++++++++++++++++++++++++ > rust/bindings/system-sys/lib.rs | 2 +- > system/meson.build | 1 + > 7 files changed, 542 insertions(+), 501 deletions(-) > diff --git a/include/system/ram-discard-manager.h b/include/system/ram-discard-manager.h > new file mode 100644 > index 00000000000..da55658169f > --- /dev/null > +++ b/include/system/ram-discard-manager.h > @@ -0,0 +1,297 @@ > +/* SPDX-License-Identifier: GPL-2.0-or-later */ > +/* > + * RAM Discard Manager > + * > + * Copyright Red Hat, Inc. 2026 > + */ > + > +#ifndef RAM_DISCARD_MANAGER_H > +#define RAM_DISCARD_MANAGER_H > + > +#include "qemu/typedefs.h" Not needed, already provided in sources by "qemu/osdep.h". > +#include "qom/object.h" > +#include "qemu/queue.h" > + > +#define TYPE_RAM_DISCARD_MANAGER "ram-discard-manager" > +typedef struct RamDiscardManagerClass RamDiscardManagerClass; > +typedef struct RamDiscardManager RamDiscardManager; > +DECLARE_OBJ_CHECKERS(RamDiscardManager, RamDiscardManagerClass, > + RAM_DISCARD_MANAGER, TYPE_RAM_DISCARD_MANAGER); > + > +#define TYPE_RAM_DISCARD_SOURCE "ram-discard-source" > +typedef struct RamDiscardSourceClass RamDiscardSourceClass; > +typedef struct RamDiscardSource RamDiscardSource; > +DECLARE_OBJ_CHECKERS(RamDiscardSource, RamDiscardSourceClass, > + RAM_DISCARD_SOURCE, TYPE_RAM_DISCARD_SOURCE); > + > +typedef struct RamDiscardListener RamDiscardListener; > +typedef int (*NotifyRamPopulate)(RamDiscardListener *rdl, > + MemoryRegionSection *section); > +typedef void (*NotifyRamDiscard)(RamDiscardListener *rdl, > + MemoryRegionSection *section); > + > +struct RamDiscardListener { > + /* > + * @notify_populate: > + * > + * Notification that previously discarded memory is about to get populated. > + * Listeners are able to object. If any listener objects, already > + * successfully notified listeners are notified about a discard again. > + * > + * @rdl: the #RamDiscardListener getting notified > + * @section: the #MemoryRegionSection to get populated. The section > + * is aligned within the memory region to the minimum granularity > + * unless it would exceed the registered section. > + * > + * Returns 0 on success. If the notification is rejected by the listener, > + * an error is returned. > + */ > + NotifyRamPopulate notify_populate; > + > + /* > + * @notify_discard: > + * > + * Notification that previously populated memory was discarded successfully > + * and listeners should drop all references to such memory and prevent > + * new population (e.g., unmap). > + * > + * @rdl: the #RamDiscardListener getting notified > + * @section: the #MemoryRegionSection to get discarded. The section > + * is aligned within the memory region to the minimum granularity > + * unless it would exceed the registered section. > + */ > + NotifyRamDiscard notify_discard; > + > + MemoryRegionSection *section; > + QLIST_ENTRY(RamDiscardListener) next; > +}; > + > +static inline void ram_discard_listener_init(RamDiscardListener *rdl, > + NotifyRamPopulate populate_fn, > + NotifyRamDiscard discard_fn) > +{ > + rdl->notify_populate = populate_fn; > + rdl->notify_discard = discard_fn; Pre-existing, this initializer doesn't justify inlining in header. Otherwise, Reviewed-by: Philippe Mathieu-Daudé <[email protected]> > +}