On Thu, Oct 29, 2026 at 4:57 AM Pierrick Bouvier
<[email protected]> wrote:
>
> On 10/28/2026 12:15 PM, Yonggang Luo wrote:
> > virtio-mem decided in class_init and realize whether x86 guests can
> > leave unplugged memory accessible. Register a second virtio-mem type
> > that adds virtio_mem_legacy_guests_properties and sets
> > VirtIOMEMClass.has_legacy_guests. Select the two with
> > target_base_i386() and target_not_base_i386().
> >
> > Signed-off-by: Yonggang Luo <[email protected]>
> > ---
> >  hw/virtio/virtio-mem.c         | 47 +++++++++++++++++++---------------
> >  include/hw/virtio/virtio-mem.h |  2 ++
> >  2 files changed, 29 insertions(+), 20 deletions(-)
> >
> > diff --git a/hw/virtio/virtio-mem.c b/hw/virtio/virtio-mem.c
> > index 7130ed852d9..bf241a3112b 100644
> > --- a/hw/virtio/virtio-mem.c
> > +++ b/hw/virtio/virtio-mem.c
> > @@ -15,6 +15,7 @@
> >  #include "qemu/cutils.h"
> >  #include "qemu/error-report.h"
> >  #include "qemu/units.h"
> > +#include "qemu/target-info.h"
> >  #include "qemu/target-info-qapi.h"
> >  #include "system/memory.h"
> >  #include "system/numa.h"
> > @@ -35,22 +36,6 @@
> >
> >  static const VMStateDescription vmstate_virtio_mem_device_early;
> >
> > -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
> >   * bitmap small.
> > @@ -859,7 +844,7 @@ static void virtio_mem_device_realize(DeviceState *dev, 
> > Error **errp)
> >      rb = vmem->memdev->mr.ram_block;
> >      page_size = qemu_ram_pagesize(rb);
> >
> > -    if (virtio_mem_has_legacy_guests()) {
> > +    if (VIRTIO_MEM_GET_CLASS(vmem)->has_legacy_guests) {
> >          switch (vmem->unplugged_inaccessible) {
> >          case ON_OFF_AUTO_AUTO:
> >              if (virtio_mem_has_shared_zeropage(rb)) {
> > @@ -1635,9 +1620,6 @@ static void virtio_mem_class_init(ObjectClass *klass, 
> > const void *data)
> >      RamDiscardSourceClass *rdsc = RAM_DISCARD_SOURCE_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);
> > @@ -1660,6 +1642,14 @@ static void virtio_mem_class_init(ObjectClass 
> > *klass, const void *data)
> >      rdsc->is_populated = virtio_mem_rds_is_populated;
> >  }
> >
> > +static void virtio_mem_legacy_class_init(ObjectClass *klass, const void 
> > *data)
> > +{
> > +    virtio_mem_class_init(klass, data);
> > +    device_class_set_props(DEVICE_CLASS(klass),
> > +                           virtio_mem_legacy_guests_properties);
> > +    VIRTIO_MEM_CLASS(klass)->has_legacy_guests = true;
> > +}
> > +
> >  static const TypeInfo virtio_mem_info = {
> >      .name = TYPE_VIRTIO_MEM,
> >      .parent = TYPE_VIRTIO_DEVICE,
> > @@ -1668,6 +1658,22 @@ static const TypeInfo virtio_mem_info = {
> >      .instance_finalize = virtio_mem_instance_finalize,
> >      .class_init = virtio_mem_class_init,
> >      .class_size = sizeof(VirtIOMEMClass),
> > +    .is_available = target_not_base_i386,
> > +    .interfaces = (const InterfaceInfo[]) {
> > +        { TYPE_RAM_DISCARD_SOURCE },
> > +        { }
> > +    },
> > +};
> > +
> > +static const TypeInfo virtio_mem_legacy_info = {
> > +    .name = TYPE_VIRTIO_MEM,
> > +    .parent = TYPE_VIRTIO_DEVICE,
> > +    .instance_size = sizeof(VirtIOMEM),
> > +    .instance_init = virtio_mem_instance_init,
> > +    .instance_finalize = virtio_mem_instance_finalize,
> > +    .class_init = virtio_mem_legacy_class_init,
> > +    .class_size = sizeof(VirtIOMEMClass),
> > +    .is_available = target_base_i386,
> >      .interfaces = (const InterfaceInfo[]) {
> >          { TYPE_RAM_DISCARD_SOURCE },
> >          { }
> > @@ -1677,6 +1683,7 @@ static const TypeInfo virtio_mem_info = {
> >  static void virtio_register_types(void)
> >  {
> >      type_register_static(&virtio_mem_info);
> > +    type_register_static(&virtio_mem_legacy_info);
> >  }
> >
> >  type_init(virtio_register_types)
> > diff --git a/include/hw/virtio/virtio-mem.h b/include/hw/virtio/virtio-mem.h
> > index 5d1d19c6bec..f367959ecb0 100644
> > --- a/include/hw/virtio/virtio-mem.h
> > +++ b/include/hw/virtio/virtio-mem.h
> > @@ -134,6 +134,8 @@ struct VirtIOMEMClass {
> >      VirtioDeviceClass parent_class;
> >
> >      /* public */
> > +    bool has_legacy_guests;
> > +
> >      void (*fill_device_info)(const VirtIOMEM *vmen, VirtioMEMDeviceInfo 
> > *vi);
> >      MemoryRegion *(*get_memory_region)(VirtIOMEM *vmem, Error **errp);
> >      void (*decide_memslots)(VirtIOMEM *vmem, unsigned int limit);
>
> Fine for me, let's see what virtio maintainers think about it.

Ping it, also the V2 version is ready, may I send it now?

>
> Regards,
> Pierrick



-- 
         此致
礼
罗勇刚
Yours
    sincerely,
Yonggang Luo

Reply via email to