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]>

> +}