mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
hw/virtio/virtio-mem: Convert VIRTIO_MEM_HAS_LEGACY_GUESTS to runtime
Check legacy guests support at runtime: instead of evaluating the VIRTIO_MEM_HAS_LEGACY_GUESTS definition at compile time, call target_arch() to detect which target is being run at runtime. Register virtio_mem_legacy_guests_properties[] at runtime. Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> Acked-by: David Hildenbrand <david@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Message-Id: <20250502214551.80401-5-philmd@linaro.org>
This commit is contained in:
+43
-33
@@ -34,13 +34,21 @@
|
||||
|
||||
static const VMStateDescription vmstate_virtio_mem_device_early;
|
||||
|
||||
/*
|
||||
* We only had legacy x86 guests that did not support
|
||||
* VIRTIO_MEM_F_UNPLUGGED_INACCESSIBLE. Other targets don't have legacy guests.
|
||||
*/
|
||||
#if defined(TARGET_X86_64) || defined(TARGET_I386)
|
||||
#define VIRTIO_MEM_HAS_LEGACY_GUESTS
|
||||
#endif
|
||||
static bool virtio_mem_has_legacy_guests(void)
|
||||
{
|
||||
/*
|
||||
* We only had legacy x86 guests that did not support
|
||||
* VIRTIO_MEM_F_UNPLUGGED_INACCESSIBLE. Other targets don't have
|
||||
* legacy guests.
|
||||
*/
|
||||
switch (target_arch()) {
|
||||
case SYS_EMU_TARGET_I386:
|
||||
case SYS_EMU_TARGET_X86_64:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Let's not allow blocks smaller than 1 MiB, for example, to keep the tracking
|
||||
@@ -144,7 +152,6 @@ static uint64_t virtio_mem_default_block_size(RAMBlock *rb)
|
||||
return MAX(page_size, VIRTIO_MEM_MIN_BLOCK_SIZE);
|
||||
}
|
||||
|
||||
#if defined(VIRTIO_MEM_HAS_LEGACY_GUESTS)
|
||||
static bool virtio_mem_has_shared_zeropage(RAMBlock *rb)
|
||||
{
|
||||
/*
|
||||
@@ -155,7 +162,6 @@ static bool virtio_mem_has_shared_zeropage(RAMBlock *rb)
|
||||
return !qemu_ram_is_shared(rb) && qemu_ram_get_fd(rb) < 0 &&
|
||||
qemu_ram_pagesize(rb) == qemu_real_host_page_size();
|
||||
}
|
||||
#endif /* VIRTIO_MEM_HAS_LEGACY_GUESTS */
|
||||
|
||||
/*
|
||||
* Size the usable region bigger than the requested size if possible. Esp.
|
||||
@@ -983,28 +989,28 @@ static void virtio_mem_device_realize(DeviceState *dev, Error **errp)
|
||||
rb = vmem->memdev->mr.ram_block;
|
||||
page_size = qemu_ram_pagesize(rb);
|
||||
|
||||
#if defined(VIRTIO_MEM_HAS_LEGACY_GUESTS)
|
||||
switch (vmem->unplugged_inaccessible) {
|
||||
case ON_OFF_AUTO_AUTO:
|
||||
if (virtio_mem_has_shared_zeropage(rb)) {
|
||||
vmem->unplugged_inaccessible = ON_OFF_AUTO_OFF;
|
||||
} else {
|
||||
vmem->unplugged_inaccessible = ON_OFF_AUTO_ON;
|
||||
if (virtio_mem_has_legacy_guests()) {
|
||||
switch (vmem->unplugged_inaccessible) {
|
||||
case ON_OFF_AUTO_AUTO:
|
||||
if (virtio_mem_has_shared_zeropage(rb)) {
|
||||
vmem->unplugged_inaccessible = ON_OFF_AUTO_OFF;
|
||||
} else {
|
||||
vmem->unplugged_inaccessible = ON_OFF_AUTO_ON;
|
||||
}
|
||||
break;
|
||||
case ON_OFF_AUTO_OFF:
|
||||
if (!virtio_mem_has_shared_zeropage(rb)) {
|
||||
warn_report("'%s' property set to 'off' with a memdev that does"
|
||||
" not support the shared zeropage.",
|
||||
VIRTIO_MEM_UNPLUGGED_INACCESSIBLE_PROP);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case ON_OFF_AUTO_OFF:
|
||||
if (!virtio_mem_has_shared_zeropage(rb)) {
|
||||
warn_report("'%s' property set to 'off' with a memdev that does"
|
||||
" not support the shared zeropage.",
|
||||
VIRTIO_MEM_UNPLUGGED_INACCESSIBLE_PROP);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
} else {
|
||||
vmem->unplugged_inaccessible = ON_OFF_AUTO_ON;
|
||||
}
|
||||
#else /* VIRTIO_MEM_HAS_LEGACY_GUESTS */
|
||||
vmem->unplugged_inaccessible = ON_OFF_AUTO_ON;
|
||||
#endif /* VIRTIO_MEM_HAS_LEGACY_GUESTS */
|
||||
|
||||
if (vmem->dynamic_memslots &&
|
||||
vmem->unplugged_inaccessible != ON_OFF_AUTO_ON) {
|
||||
@@ -1701,16 +1707,17 @@ static const Property virtio_mem_properties[] = {
|
||||
DEFINE_PROP_BOOL(VIRTIO_MEM_PREALLOC_PROP, VirtIOMEM, prealloc, false),
|
||||
DEFINE_PROP_LINK(VIRTIO_MEM_MEMDEV_PROP, VirtIOMEM, memdev,
|
||||
TYPE_MEMORY_BACKEND, HostMemoryBackend *),
|
||||
#if defined(VIRTIO_MEM_HAS_LEGACY_GUESTS)
|
||||
DEFINE_PROP_ON_OFF_AUTO(VIRTIO_MEM_UNPLUGGED_INACCESSIBLE_PROP, VirtIOMEM,
|
||||
unplugged_inaccessible, ON_OFF_AUTO_ON),
|
||||
#endif
|
||||
DEFINE_PROP_BOOL(VIRTIO_MEM_EARLY_MIGRATION_PROP, VirtIOMEM,
|
||||
early_migration, true),
|
||||
DEFINE_PROP_BOOL(VIRTIO_MEM_DYNAMIC_MEMSLOTS_PROP, VirtIOMEM,
|
||||
dynamic_memslots, false),
|
||||
};
|
||||
|
||||
static const Property virtio_mem_legacy_guests_properties[] = {
|
||||
DEFINE_PROP_ON_OFF_AUTO(VIRTIO_MEM_UNPLUGGED_INACCESSIBLE_PROP, VirtIOMEM,
|
||||
unplugged_inaccessible, ON_OFF_AUTO_ON),
|
||||
};
|
||||
|
||||
static uint64_t virtio_mem_rdm_get_min_granularity(const RamDiscardManager *rdm,
|
||||
const MemoryRegion *mr)
|
||||
{
|
||||
@@ -1862,6 +1869,9 @@ static void virtio_mem_class_init(ObjectClass *klass, const void *data)
|
||||
RamDiscardManagerClass *rdmc = RAM_DISCARD_MANAGER_CLASS(klass);
|
||||
|
||||
device_class_set_props(dc, virtio_mem_properties);
|
||||
if (virtio_mem_has_legacy_guests()) {
|
||||
device_class_set_props(dc, virtio_mem_legacy_guests_properties);
|
||||
}
|
||||
dc->vmsd = &vmstate_virtio_mem;
|
||||
|
||||
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
|
||||
|
||||
Reference in New Issue
Block a user