memory: Introduce replay_discarded callback for RamDiscardManager
Introduce replay_discarded callback similar to our existing replay_populated callback, to be used my migration code to never migrate discarded memory. Acked-by: Peter Xu <peterx@redhat.com> Signed-off-by: David Hildenbrand <david@redhat.com> Reviewed-by: Juan Quintela <quintela@redhat.com> Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
parent
b7bc6b1828
commit
adaf9d92f8
|
@ -550,6 +550,7 @@ static inline void ram_discard_listener_init(RamDiscardListener *rdl,
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef int (*ReplayRamPopulate)(MemoryRegionSection *section, void *opaque);
|
typedef int (*ReplayRamPopulate)(MemoryRegionSection *section, void *opaque);
|
||||||
|
typedef void (*ReplayRamDiscard)(MemoryRegionSection *section, void *opaque);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* RamDiscardManagerClass:
|
* RamDiscardManagerClass:
|
||||||
|
@ -638,6 +639,21 @@ struct RamDiscardManagerClass {
|
||||||
MemoryRegionSection *section,
|
MemoryRegionSection *section,
|
||||||
ReplayRamPopulate replay_fn, void *opaque);
|
ReplayRamPopulate replay_fn, void *opaque);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @replay_discarded:
|
||||||
|
*
|
||||||
|
* Call the #ReplayRamDiscard callback for all discarded parts within the
|
||||||
|
* #MemoryRegionSection via the #RamDiscardManager.
|
||||||
|
*
|
||||||
|
* @rdm: the #RamDiscardManager
|
||||||
|
* @section: the #MemoryRegionSection
|
||||||
|
* @replay_fn: the #ReplayRamDiscard callback
|
||||||
|
* @opaque: pointer to forward to the callback
|
||||||
|
*/
|
||||||
|
void (*replay_discarded)(const RamDiscardManager *rdm,
|
||||||
|
MemoryRegionSection *section,
|
||||||
|
ReplayRamDiscard replay_fn, void *opaque);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @register_listener:
|
* @register_listener:
|
||||||
*
|
*
|
||||||
|
@ -682,6 +698,11 @@ int ram_discard_manager_replay_populated(const RamDiscardManager *rdm,
|
||||||
ReplayRamPopulate replay_fn,
|
ReplayRamPopulate replay_fn,
|
||||||
void *opaque);
|
void *opaque);
|
||||||
|
|
||||||
|
void ram_discard_manager_replay_discarded(const RamDiscardManager *rdm,
|
||||||
|
MemoryRegionSection *section,
|
||||||
|
ReplayRamDiscard replay_fn,
|
||||||
|
void *opaque);
|
||||||
|
|
||||||
void ram_discard_manager_register_listener(RamDiscardManager *rdm,
|
void ram_discard_manager_register_listener(RamDiscardManager *rdm,
|
||||||
RamDiscardListener *rdl,
|
RamDiscardListener *rdl,
|
||||||
MemoryRegionSection *section);
|
MemoryRegionSection *section);
|
||||||
|
|
|
@ -2081,6 +2081,17 @@ int ram_discard_manager_replay_populated(const RamDiscardManager *rdm,
|
||||||
return rdmc->replay_populated(rdm, section, replay_fn, opaque);
|
return rdmc->replay_populated(rdm, section, replay_fn, opaque);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ram_discard_manager_replay_discarded(const RamDiscardManager *rdm,
|
||||||
|
MemoryRegionSection *section,
|
||||||
|
ReplayRamDiscard replay_fn,
|
||||||
|
void *opaque)
|
||||||
|
{
|
||||||
|
RamDiscardManagerClass *rdmc = RAM_DISCARD_MANAGER_GET_CLASS(rdm);
|
||||||
|
|
||||||
|
g_assert(rdmc->replay_discarded);
|
||||||
|
rdmc->replay_discarded(rdm, section, replay_fn, opaque);
|
||||||
|
}
|
||||||
|
|
||||||
void ram_discard_manager_register_listener(RamDiscardManager *rdm,
|
void ram_discard_manager_register_listener(RamDiscardManager *rdm,
|
||||||
RamDiscardListener *rdl,
|
RamDiscardListener *rdl,
|
||||||
MemoryRegionSection *section)
|
MemoryRegionSection *section)
|
||||||
|
|
Loading…
Reference in New Issue