- kvm-target-i386-Make-invtsc-migratable-when-user-sets-ts.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-target-i386-Enable-fdp-excptn-only-and-zero-fcs-fds.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-kvm-i386-make-kvm_filter_msr-and-related-definitions.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-kvm-remove-unnecessary-ifdef.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-crypto-Define-macros-for-hash-algorithm-digest-lengt.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-cpu-Drop-the-check-of-phys_bits-in-host_cpu_rea.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-cpu-Extract-a-common-fucntion-to-setup-value-of.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-cpu-Drop-the-variable-smp_cores-and-smp_threads.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-cpu-Drop-cores_per_pkg-in-cpu_x86_cpuid.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-topology-Update-the-comment-of-x86_apicid_from_.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-topology-Introduce-helpers-for-various-topology.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-cpu-Track-a-X86CPUTopoInfo-directly-in-CPUX86St.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-cpu-Hoist-check-of-CPUID_EXT3_TOPOEXT-against-t.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-cpu-Remove-nr_cores-from-struct-CPUState.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-cpu-Set-up-CPUID_HT-in-x86_cpu_expand_features-.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-cpu-Set-and-track-CPUID_EXT3_CMP_LEG-in-env-fea.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-Remove-unused-parameter-uint32_t-bit-in-feature.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-target-i386-Print-CPUID-subleaf-info-for-unsupported.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-target-i386-sev-Reduce-system-specific-declarations.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-physmem-replace-assertion-with-error.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-redhat-target-i386-add-CPUID-and-MSR-bits-from-Clear.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-qom-reverse-order-of-instance_post_init-calls.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-target-i386-Remove-AccelCPUClass-cpu_class_init-need.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-cpu-Consolidate-the-helper-to-get-Host-s-vendor.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-rocker-do-not-pollute-the-namespace.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-linux-headers-Update-to-Linux-v6.14-rc3.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-linux-headers-Update-to-Linux-v6.15-rc3.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-linux-headers-update-from-6.15-kvm-next.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-update-Linux-headers-to-v6.16-rc3.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-update-Linux-headers-to-KVM-tree-master.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-Introduce-tdx-guest-object.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Implement-tdx_kvm_type-for-TDX.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Implement-tdx_kvm_init-to-initialize-TDX-VM.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Get-tdx_capabilities-via-KVM_TDX_CAPABILITI.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Introduce-is_tdx_vm-helper-and-cache-tdx_gu.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-kvm-Introduce-kvm_arch_pre_create_vcpu.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Initialize-TDX-before-creating-TD-vcpus.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Add-property-sept-ve-disable-for-tdx-guest-.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Make-sept_ve_disable-set-by-default.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Wire-CPU-features-up-with-attributes-of-TD-.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Validate-TD-attributes.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Support-user-configurable-mrconfigid-mrowne.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Set-APIC-bus-rate-to-match-with-what-TDX-mo.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Implement-user-specified-tsc-frequency.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-load-TDVF-for-TD-guest.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdvf-Introduce-function-to-parse-TDVF-metadata.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Parse-TDVF-metadata-for-TDX-VM.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Don-t-initialize-pc.rom-for-TDX-VMs.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Track-mem_ptr-for-each-firmware-entry-of-TD.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Track-RAM-entries-for-TDX-VM.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-headers-Add-definitions-from-UEFI-spec-for-volumes-r.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Setup-the-TD-HOB-list.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Add-TDVF-memory-via-KVM_TDX_INIT_MEM_REGION.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Call-KVM_TDX_INIT_VCPU-to-initialize-TDX-vc.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Finalize-TDX-VM.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Enable-user-exit-on-KVM_HC_MAP_GPA_RANGE.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Handle-KVM_SYSTEM_EVENT_TDX_FATAL.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Wire-TDX_REPORT_FATAL_ERROR-with-GuestPanic.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-kvm-Check-KVM_CAP_MAX_VCPUS-at-vm-level.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-cpu-introduce-x86_confidential_guest_cpu_instan.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-implement-tdx_cpu_instance_init.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-cpu-Introduce-enable_cpuid_0x1f-to-force-exposi.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Force-exposing-CPUID-0x1f.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Set-kvm_readonly_mem_enabled-to-false-for-T.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Disable-SMM-for-TDX-VMs.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Disable-PIC-for-TDX-VMs.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Set-and-check-kernel_irqchip-mode-for-TDX.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Don-t-synchronize-guest-tsc-for-TDs.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Only-configure-MSR_IA32_UCODE_REV-in-kvm_in.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-apic-Skip-kvm_apic_put-for-TDX.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-cpu-Don-t-set-vcpu_dirty-when-guest_state_protected.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-cgs-Rename-mask_cpuid_features-to-adjust_cpuid_.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Implement-adjust_cpuid_features-for-TDX.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Add-TDX-fixed1-bits-to-supported-CPUIDs.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Add-supported-CPUID-bits-related-to-TD-Attr.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Add-supported-CPUID-bits-relates-to-XFAM.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Add-XFD-to-supported-bit-of-TDX.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Define-supported-KVM-features-for-TDX.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-cgs-Introduce-x86_confidential_guest_check_feat.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Fetch-and-validate-CPUID-of-TD-guest.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Don-t-treat-SYSCALL-as-unavailable.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Make-invtsc-default-on.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Validate-phys_bits-against-host-value.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-docs-Add-TDX-documentation.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Fix-build-on-32-bit-host.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdvf-Fix-build-on-32-bit-host.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-cpu-Move-adjustment-of-CPUID_EXT_PDCM-before-fe.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Error-and-exit-when-named-cpu-model-is-requ.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-cpu-Rename-enable_cpuid_0x1f-to-force_cpuid_0x1.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Fix-the-typo-of-the-comment-of-struct-TdxGu.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Clarify-the-error-message-of-mrconfigid-mro.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-handle-TDG.VP.VMCALL-GetTdVmCallInfo.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-handle-TDG.VP.VMCALL-GetQuote.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-target-i386-move-max_features-to-class.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-target-i386-nvmm-whpx-add-accel-CPU-class-that-sets-.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-target-i386-allow-reordering-max_x86_cpu_initfn-vs-a.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-target-i386-move-accel_cpu_instance_init-to-.instanc.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-target-i386-merge-host_cpu_instance_init-and-host_cp.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Remove-enumeration-of-GetQuote-in-tdx_handl.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Set-value-of-GetTdVmCallInfo-based-on-capab.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-handle-TDVMCALL_SETUP_EVENT_NOTIFY_INTERRUP.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Fix-the-report-of-gpa-in-QAPI.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Remove-task-watch-only-when-it-s-valid.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Don-t-mask-off-CPUID_EXT_PDCM.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-cpu-Move-x86_ext_save_areas-initialization-to-..patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-target-i386-tdx-fix-locking-for-interrupt-injection.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-cpu-Cleanup-host_cpu_max_instance_init.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-i386-tdx-Remove-the-redundant-qemu_mutex_init-tdx-lo.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-redhat-enable-CONFIG_TDX.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-redhat-allow-5-level-paging-for-TDX-VMs.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-memory-Export-a-helper-to-get-intersection-of-a-Memo.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-memory-Change-memory_region_set_ram_discard_manager-.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-memory-Unify-the-definiton-of-ReplayRamPopulate-and-.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-ram-block-attributes-Introduce-RamBlockAttributes-to.patch [RHEL-15710 RHEL-20798 RHEL-49728] - kvm-physmem-Support-coordinated-discarding-of-RAM-with-g.patch [RHEL-15710 RHEL-20798 RHEL-49728] - Resolves: RHEL-15710 ([Intel 9.7 FEAT] TDX: QEMU Support) - Resolves: RHEL-20798 ([Intel 9.6 FEAT] TDX: host: Virt-QEMU: Add safe device pass-through for TD) - Resolves: RHEL-49728 ([Intel 9.7 FEAT] Virt-QEMU: TDX: Allow to configure apic bus clock)
278 lines
12 KiB
Diff
278 lines
12 KiB
Diff
From a0a6a0d1131461f2695f28a673f410bbb33262ef Mon Sep 17 00:00:00 2001
|
|
From: Paolo Bonzini <pbonzini@redhat.com>
|
|
Date: Fri, 18 Jul 2025 18:11:28 +0200
|
|
Subject: [PATCH 113/115] memory: Unify the definiton of ReplayRamPopulate()
|
|
and ReplayRamDiscard()
|
|
|
|
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
|
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
|
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
|
RH-Acked-by: Yash Mankad <None>
|
|
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
|
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
|
RH-Commit: [113/115] 8ad320473d66f2956d701a4625f815d2fcd8ae4b (bonzini/rhel-qemu-kvm)
|
|
|
|
Update ReplayRamDiscard() function to return the result and unify the
|
|
ReplayRamPopulate() and ReplayRamDiscard() to ReplayRamDiscardState() at
|
|
the same time due to their identical definitions. This unification
|
|
simplifies related structures, such as VirtIOMEMReplayData, which makes
|
|
it cleaner.
|
|
|
|
Reviewed-by: David Hildenbrand <david@redhat.com>
|
|
Reviewed-by: Pankaj Gupta <pankaj.gupta@amd.com>
|
|
Reviewed-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
|
Signed-off-by: Chenyi Qiang <chenyi.qiang@intel.com>
|
|
Link: https://lore.kernel.org/r/20250612082747.51539-4-chenyi.qiang@intel.com
|
|
Signed-off-by: Peter Xu <peterx@redhat.com>
|
|
(cherry picked from commit 2205b8466733f8c6e3306c964f31c5a7cac69dfa)
|
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
---
|
|
hw/virtio/virtio-mem.c | 21 ++++++------
|
|
include/exec/memory.h | 74 ++++++++++++++++++++++++++++++++----------
|
|
migration/ram.c | 5 +--
|
|
system/memory.c | 12 +++----
|
|
4 files changed, 76 insertions(+), 36 deletions(-)
|
|
|
|
diff --git a/hw/virtio/virtio-mem.c b/hw/virtio/virtio-mem.c
|
|
index 6284539243..32af43852a 100644
|
|
--- a/hw/virtio/virtio-mem.c
|
|
+++ b/hw/virtio/virtio-mem.c
|
|
@@ -1736,7 +1736,7 @@ static bool virtio_mem_rdm_is_populated(const RamDiscardManager *rdm,
|
|
}
|
|
|
|
struct VirtIOMEMReplayData {
|
|
- void *fn;
|
|
+ ReplayRamDiscardState fn;
|
|
void *opaque;
|
|
};
|
|
|
|
@@ -1744,12 +1744,12 @@ static int virtio_mem_rdm_replay_populated_cb(MemoryRegionSection *s, void *arg)
|
|
{
|
|
struct VirtIOMEMReplayData *data = arg;
|
|
|
|
- return ((ReplayRamPopulate)data->fn)(s, data->opaque);
|
|
+ return data->fn(s, data->opaque);
|
|
}
|
|
|
|
static int virtio_mem_rdm_replay_populated(const RamDiscardManager *rdm,
|
|
MemoryRegionSection *s,
|
|
- ReplayRamPopulate replay_fn,
|
|
+ ReplayRamDiscardState replay_fn,
|
|
void *opaque)
|
|
{
|
|
const VirtIOMEM *vmem = VIRTIO_MEM(rdm);
|
|
@@ -1768,14 +1768,13 @@ static int virtio_mem_rdm_replay_discarded_cb(MemoryRegionSection *s,
|
|
{
|
|
struct VirtIOMEMReplayData *data = arg;
|
|
|
|
- ((ReplayRamDiscard)data->fn)(s, data->opaque);
|
|
- return 0;
|
|
+ return data->fn(s, data->opaque);
|
|
}
|
|
|
|
-static void virtio_mem_rdm_replay_discarded(const RamDiscardManager *rdm,
|
|
- MemoryRegionSection *s,
|
|
- ReplayRamDiscard replay_fn,
|
|
- void *opaque)
|
|
+static int virtio_mem_rdm_replay_discarded(const RamDiscardManager *rdm,
|
|
+ MemoryRegionSection *s,
|
|
+ ReplayRamDiscardState replay_fn,
|
|
+ void *opaque)
|
|
{
|
|
const VirtIOMEM *vmem = VIRTIO_MEM(rdm);
|
|
struct VirtIOMEMReplayData data = {
|
|
@@ -1784,8 +1783,8 @@ static void virtio_mem_rdm_replay_discarded(const RamDiscardManager *rdm,
|
|
};
|
|
|
|
g_assert(s->mr == &vmem->memdev->mr);
|
|
- virtio_mem_for_each_unplugged_section(vmem, s, &data,
|
|
- virtio_mem_rdm_replay_discarded_cb);
|
|
+ return virtio_mem_for_each_unplugged_section(vmem, s, &data,
|
|
+ virtio_mem_rdm_replay_discarded_cb);
|
|
}
|
|
|
|
static void virtio_mem_rdm_register_listener(RamDiscardManager *rdm,
|
|
diff --git a/include/exec/memory.h b/include/exec/memory.h
|
|
index 7cfbe203f4..563353eab6 100644
|
|
--- a/include/exec/memory.h
|
|
+++ b/include/exec/memory.h
|
|
@@ -566,8 +566,20 @@ static inline void ram_discard_listener_init(RamDiscardListener *rdl,
|
|
rdl->double_discard_supported = double_discard_supported;
|
|
}
|
|
|
|
-typedef int (*ReplayRamPopulate)(MemoryRegionSection *section, void *opaque);
|
|
-typedef void (*ReplayRamDiscard)(MemoryRegionSection *section, void *opaque);
|
|
+/**
|
|
+ * typedef ReplayRamDiscardState:
|
|
+ *
|
|
+ * The callback handler for #RamDiscardManagerClass.replay_populated/
|
|
+ * #RamDiscardManagerClass.replay_discarded to invoke on populated/discarded
|
|
+ * parts.
|
|
+ *
|
|
+ * @section: the #MemoryRegionSection of populated/discarded part
|
|
+ * @opaque: pointer to forward to the callback
|
|
+ *
|
|
+ * Returns 0 on success, or a negative error if failed.
|
|
+ */
|
|
+typedef int (*ReplayRamDiscardState)(MemoryRegionSection *section,
|
|
+ void *opaque);
|
|
|
|
/*
|
|
* RamDiscardManagerClass:
|
|
@@ -641,36 +653,38 @@ struct RamDiscardManagerClass {
|
|
/**
|
|
* @replay_populated:
|
|
*
|
|
- * Call the #ReplayRamPopulate callback for all populated parts within the
|
|
- * #MemoryRegionSection via the #RamDiscardManager.
|
|
+ * Call the #ReplayRamDiscardState callback for all populated parts within
|
|
+ * the #MemoryRegionSection via the #RamDiscardManager.
|
|
*
|
|
* In case any call fails, no further calls are made.
|
|
*
|
|
* @rdm: the #RamDiscardManager
|
|
* @section: the #MemoryRegionSection
|
|
- * @replay_fn: the #ReplayRamPopulate callback
|
|
+ * @replay_fn: the #ReplayRamDiscardState callback
|
|
* @opaque: pointer to forward to the callback
|
|
*
|
|
* Returns 0 on success, or a negative error if any notification failed.
|
|
*/
|
|
int (*replay_populated)(const RamDiscardManager *rdm,
|
|
MemoryRegionSection *section,
|
|
- ReplayRamPopulate replay_fn, void *opaque);
|
|
+ ReplayRamDiscardState replay_fn, void *opaque);
|
|
|
|
/**
|
|
* @replay_discarded:
|
|
*
|
|
- * Call the #ReplayRamDiscard callback for all discarded parts within the
|
|
- * #MemoryRegionSection via the #RamDiscardManager.
|
|
+ * Call the #ReplayRamDiscardState callback for all discarded parts within
|
|
+ * the #MemoryRegionSection via the #RamDiscardManager.
|
|
*
|
|
* @rdm: the #RamDiscardManager
|
|
* @section: the #MemoryRegionSection
|
|
- * @replay_fn: the #ReplayRamDiscard callback
|
|
+ * @replay_fn: the #ReplayRamDiscardState callback
|
|
* @opaque: pointer to forward to the callback
|
|
+ *
|
|
+ * Returns 0 on success, or a negative error if any notification failed.
|
|
*/
|
|
- void (*replay_discarded)(const RamDiscardManager *rdm,
|
|
- MemoryRegionSection *section,
|
|
- ReplayRamDiscard replay_fn, void *opaque);
|
|
+ int (*replay_discarded)(const RamDiscardManager *rdm,
|
|
+ MemoryRegionSection *section,
|
|
+ ReplayRamDiscardState replay_fn, void *opaque);
|
|
|
|
/**
|
|
* @register_listener:
|
|
@@ -711,15 +725,41 @@ uint64_t ram_discard_manager_get_min_granularity(const RamDiscardManager *rdm,
|
|
bool ram_discard_manager_is_populated(const RamDiscardManager *rdm,
|
|
const MemoryRegionSection *section);
|
|
|
|
+/**
|
|
+ * ram_discard_manager_replay_populated:
|
|
+ *
|
|
+ * A wrapper to call the #RamDiscardManagerClass.replay_populated callback
|
|
+ * of the #RamDiscardManager.
|
|
+ *
|
|
+ * @rdm: the #RamDiscardManager
|
|
+ * @section: the #MemoryRegionSection
|
|
+ * @replay_fn: the #ReplayRamDiscardState callback
|
|
+ * @opaque: pointer to forward to the callback
|
|
+ *
|
|
+ * Returns 0 on success, or a negative error if any notification failed.
|
|
+ */
|
|
int ram_discard_manager_replay_populated(const RamDiscardManager *rdm,
|
|
MemoryRegionSection *section,
|
|
- ReplayRamPopulate replay_fn,
|
|
+ ReplayRamDiscardState replay_fn,
|
|
void *opaque);
|
|
|
|
-void ram_discard_manager_replay_discarded(const RamDiscardManager *rdm,
|
|
- MemoryRegionSection *section,
|
|
- ReplayRamDiscard replay_fn,
|
|
- void *opaque);
|
|
+/**
|
|
+ * ram_discard_manager_replay_discarded:
|
|
+ *
|
|
+ * A wrapper to call the #RamDiscardManagerClass.replay_discarded callback
|
|
+ * of the #RamDiscardManager.
|
|
+ *
|
|
+ * @rdm: the #RamDiscardManager
|
|
+ * @section: the #MemoryRegionSection
|
|
+ * @replay_fn: the #ReplayRamDiscardState callback
|
|
+ * @opaque: pointer to forward to the callback
|
|
+ *
|
|
+ * Returns 0 on success, or a negative error if any notification failed.
|
|
+ */
|
|
+int ram_discard_manager_replay_discarded(const RamDiscardManager *rdm,
|
|
+ MemoryRegionSection *section,
|
|
+ ReplayRamDiscardState replay_fn,
|
|
+ void *opaque);
|
|
|
|
void ram_discard_manager_register_listener(RamDiscardManager *rdm,
|
|
RamDiscardListener *rdl,
|
|
diff --git a/migration/ram.c b/migration/ram.c
|
|
index 0803f85b8a..aaeea04546 100644
|
|
--- a/migration/ram.c
|
|
+++ b/migration/ram.c
|
|
@@ -874,8 +874,8 @@ static inline bool migration_bitmap_clear_dirty(RAMState *rs,
|
|
return ret;
|
|
}
|
|
|
|
-static void dirty_bitmap_clear_section(MemoryRegionSection *section,
|
|
- void *opaque)
|
|
+static int dirty_bitmap_clear_section(MemoryRegionSection *section,
|
|
+ void *opaque)
|
|
{
|
|
const hwaddr offset = section->offset_within_region;
|
|
const hwaddr size = int128_get64(section->size);
|
|
@@ -894,6 +894,7 @@ static void dirty_bitmap_clear_section(MemoryRegionSection *section,
|
|
}
|
|
*cleared_bits += bitmap_count_one_with_offset(rb->bmap, start, npages);
|
|
bitmap_clear(rb->bmap, start, npages);
|
|
+ return 0;
|
|
}
|
|
|
|
/*
|
|
diff --git a/system/memory.c b/system/memory.c
|
|
index 35011f731e..8c36ab17b6 100644
|
|
--- a/system/memory.c
|
|
+++ b/system/memory.c
|
|
@@ -2115,7 +2115,7 @@ bool ram_discard_manager_is_populated(const RamDiscardManager *rdm,
|
|
|
|
int ram_discard_manager_replay_populated(const RamDiscardManager *rdm,
|
|
MemoryRegionSection *section,
|
|
- ReplayRamPopulate replay_fn,
|
|
+ ReplayRamDiscardState replay_fn,
|
|
void *opaque)
|
|
{
|
|
RamDiscardManagerClass *rdmc = RAM_DISCARD_MANAGER_GET_CLASS(rdm);
|
|
@@ -2124,15 +2124,15 @@ int ram_discard_manager_replay_populated(const RamDiscardManager *rdm,
|
|
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)
|
|
+int ram_discard_manager_replay_discarded(const RamDiscardManager *rdm,
|
|
+ MemoryRegionSection *section,
|
|
+ ReplayRamDiscardState 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);
|
|
+ return rdmc->replay_discarded(rdm, section, replay_fn, opaque);
|
|
}
|
|
|
|
void ram_discard_manager_register_listener(RamDiscardManager *rdm,
|
|
--
|
|
2.50.1
|
|
|