On Tue, 2026-01-20 at 08:43 +0000, Daniel P. Berrangé wrote:
> On Mon, Jan 19, 2026 at 04:43:21AM -0500, Michael S. Tsirkin wrote:
> > On Mon, Jan 19, 2026 at 09:38:41AM +0000, Daniel P. Berrangé wrote:
> > > On Mon, Jan 19, 2026 at 04:27:51AM +0100, Filip Hejsek wrote:
> > > > Implement the part of the virtio spec that allows to notify the virtio
> > > > driver about terminal resizes. The virtio spec contains two methods to
> > > > achieve that:
> > > > 
> > > > For legacy drivers, we have only one port and we put the terminal size
> > > > in the config space and inject the config changed interrupt.
> > > > 
> > > > For multiport devices, we use the control virtqueue to send a packet
> > > > containing the terminal size. Note that old versions of the Linux kernel
> > > > used an incorrect order for the fields (rows then cols instead of cols
> > > > then rows), until it was fixed by commit 
> > > > 5326ab737a47278dbd16ed3ee7380b26c7056ddd.
> > > > 
> > > > As a result, when using a Linux kernel older than 6.15, the number of 
> > > > rows
> > > > and columns will be swapped.
> > > > 
> > > > Based on a patch originally written by Szymon Lukasz 
> > > > <[email protected]>,
> > > > but partially rewritten to fix various corner cases.
> > > > 
> > > > Signed-off-by: Szymon Lukasz <[email protected]>
> > > > Signed-off-by: Filip Hejsek <[email protected]>
> > > > ---
> > > >  hw/char/trace-events              |  1 +
> > > >  hw/char/virtio-serial-bus.c       | 76 
> > > > +++++++++++++++++++++++++++++++++++++--
> > > >  hw/core/machine.c                 |  4 ++-
> > > >  include/hw/virtio/virtio-serial.h |  5 +++
> > > >  4 files changed, 83 insertions(+), 3 deletions(-)
> > > > 
> > > 
> > > > @@ -1158,6 +1228,8 @@ static const Property virtio_serial_properties[] 
> > > > = {
> > > >                                                    31),
> > > >      DEFINE_PROP_BIT64("emergency-write", VirtIOSerial, host_features,
> > > >                        VIRTIO_CONSOLE_F_EMERG_WRITE, true),
> > > > +    DEFINE_PROP_BIT64("console-size", VirtIOSerial, host_features,
> > > > +                      VIRTIO_CONSOLE_F_SIZE, true),
> > > >  };
> > > 
> > > Given the horrible mess with the kernel intentionally changing its
> > > behaviour after 15 years, I don't think we can we set this to be
> > > enabled by default.
> > > 
> > > The recent behaviour change is never going to be backported to enough
> > > stable distros that we can rely on the new behaviour, and thanks to
> > > the change we can't rely on the old behaviour either. We're doomed no
> > > matter what ordernig we use.
> > > 
> > > Thus, IMHO, this has to stay set to false indefinitely.
> > 
> > Not sure. But what we can do is add another flag to detect new kernels.
> > I'll try to think of a good name but suggestions are welcome.
> 
> How can we detect the kernel ? There's no feature flag that can be
> negotiated or detected to report the changed kernel behaviour
> AFAICS. We have no visibility of kernel version, and even if we did,
> the possibility of backports would make that unreliable too. The
> inability to auto-detect anything is what makes the kernel behaviour
> change so awful.
> 
> We can add a nother qemu flag "console-size-inverted" to flip QEMU
> between the 2 behaviours, but that still won't let us be able to
> enable 'console-size' by default without guaranteed regressions.
> The 'console-size-inverted' flag would merely flip the breakage
> between different groups of guest OS.

We could add a new virtio feature flag, and by default only enable
resizing when the guest supports this new flag. Kernels that support
the flag would work by default, and kernels that have the correct order
but don't yet support the flag would require manually enabling the
feature.

In any case, we will probably need to add some documentation for the
property. I'm trying to find a good place for it, but it seems that the
virtconsole and virtio-serial-bus devices are not actually documented
anywhere at all. They should probably be documented in the man page,
right?

> 
> > > >  static void virtio_serial_class_init(ObjectClass *klass, const void 
> > > > *data)
> > > > diff --git a/hw/core/machine.c b/hw/core/machine.c
> > > > index 6411e68856..50554b8900 100644
> > > > --- a/hw/core/machine.c
> > > > +++ b/hw/core/machine.c
> > > > @@ -38,7 +38,9 @@
> > > >  #include "hw/acpi/generic_event_device.h"
> > > >  #include "qemu/audio.h"
> > > >  
> > > > -GlobalProperty hw_compat_10_2[] = {};
> > > > +GlobalProperty hw_compat_10_2[] = {
> > > > +    { "virtio-serial-device", "console-size", "off" },
> > > > +};
> > > >  const size_t hw_compat_10_2_len = G_N_ELEMENTS(hw_compat_10_2);
> > > >  
> > > >  GlobalProperty hw_compat_10_1[] = {
> 
> With regards,
> Daniel

Reply via email to