[nova] How best to provide virtio-based input devices?
melwittt at gmail.com
Thu Nov 19 00:12:05 UTC 2020
On 11/16/20 02:41, Stephen Finucane wrote:
> On Thu, 2020-11-12 at 17:09 -0800, melanie witt wrote:
>> Needless to say, I don't like this idea and prefer we took another
>> and kept 'hw_input_bus' but didn't build on 'hw_pointer_model' and
>> instead "deprecated" it. We can't really ever remove the an image
>> metadata property, since that would be a breaking upgrade, which
>> we'll eventually be left with effectively dead code to maintain
>> forever. However, I don't think that's a big deal.
>> 'hw_pointer_model=usbtablet' is already on a path to obsolescence as
>> the Q35 machine type slowly becomes the default on x86 hosts and the
>> use of non-x86 hosts grows since neither support PS2 and must use a
>> USB-based input device. In addition, I think the extrapolation of
>> 'virtiotablet' to mean also virtio-based keyboard is unclear and
>> a gaping hole w.r.t. requesting USB-based keyboards on non-AArch64
>> hosts (where it's currently added by default), since we don't
>> do this extrapolation and introducing it would be breaking change on
>> x86 hosts (instances would suddenly switch from PS2-based keyboards
>> USB-based ones).
For some reason your email didn't quote my inline replies when you
replied back, so I'm going to label them for clarity.
> If I understand correctly, we do choose the "best fit" keyboard based
> on architecture, independent of the requested hw_pointer_model, today.
> Not quite. libvirt on x86 will automatically add a PS2 mouse and
> keyboard (even if you request something else) because that's what QEMU
> does. On all other platforms (to the best of my knowledge, based on
> Kashyap quizzing a handful of multi-arch libvirt devs), this must be
> done manually. We currently only do this for AArch64, through the non-
> configurable addition of a USB keyboard . There is currently no way
> to request e.g. a USB or virtio keyboard on any architecture.
>  https://github.com/openstack/nova/commit/b92e3bc95fd
Hm, OK, apologies for my lack of familiarity here. So there are really
three things here: tablet, mouse, and keyboard. And the user today can
choose hw_pointer_model as None (leave it to default behavior) or
usbtablet which sets the input.type=tablet and the input.bus=usb. And
then the mouse and keyboard are set to whatever they have to be given
> It feels like it would be simpler to continue doing that and add a
> virtio choice to hw_pointer_model and let the driver pick the "best"
> keyboard to go along with that. Is it your view that having the
>> driver choose a virtio keyboard if hw_pointer_model=virtiotablet is
>> inconsistent with the existing "best fit" keyboard selection
> My concerns are twofold. Firstly, having the value of
> 'hw_pointer_model' influence the keyboard bus is poor UX, since this
> "feature" is not at all apparent from the property name. Secondly,
> 'hw_pointer_model' is a poorly designed property, given it configured
> the bus as well as the model, munging the two.
> To be clear, I agree that having different buses for keyboard and
> pointer makes no sense. There's no reason they shouldn't be the same.
> I'm just saying that configuring the bus for input devices via an
> appropriately named 'hw_input_bus' image metadata property makes much
> more sense that maybe getting one configured magically based on the
> "pointer model" in use.
OK, so the introduction of virtio would be the first time that we would
be able to set all of tablet, mouse, and keyboard to the same bus. What
if they don't want all three input devices, could it cause any
undesirable behavior for them?
And then if they set hw_input_bus=usb for libvirt on x86 they'd get a
USB tablet, a PS2 mouse, and a PS2 keyboard and on AArch64 they'd get a
USB tablet, ? mouse, and USB keyboard.
I dunno, it's all pretty confusing IMHO. My point in my last reply was
that for the libvirt on x86 case, if the user sets hw_input_bus=usb, how
would they know they're really only specifying the tablet? Today they
use hw_pointer_model=usbtablet which makes it clear what they have
control over. I acknowledge that for hw_input_bus=virtio, things all
line up nicely, but for everything else, it doesn't necessarily.
This makes me think it would be clearest and least confusing (IMHO) to
add a new option like dansmith mentioned, hw_pointer_model=virtio. That
way it's not talking only about a tablet but generically just 'virtio'
and then all of tablet, mouse, and keyboard get added with bus=virtio.
> From what I understand, the pointer is the only user selection we can guarantee and the keyboard is architecture dependent.
> Again, not really. There isn't an analog for pointer vs. mouse when it
> comes to keyboards. The keyboard isn't architecture dependent. What is
> architecture dependent is whether you get a keyboard and mouse by
> default (yes on x86, in the form of a PS2 mouse and keyboard, and no
> for everyone else).
>> If we "deprecated" hw_pointer_model and introduced hw_input_bus, how does
>> the user know which thing (pointer or keyboard) they are specifying?
>> If users can't actually choose the keyboard and can only choose the pointer,
> wouldn't presenting a selection of a generic "hw_input_bus" be more confusing
>> than hw_pointer_model?
> They can choose the _bus_ that the keyboard uses. There's an assumption
> here that if you request a graphics device (VNC, SPICE, ...) then you
> will get a keyboard and tablet input devices, because that graphics
> device is unusable otherwise. There is also an assumption (based on
> dansmith's comments about mouse being only used for legacy compat
> reasons) that the user will never want to explicitly request a 'mouse'
> pointer model and should therefore get 'tablet' by default. Based on
> these two assumptions, the only thing remaining is to decide how the
> keyboard and tablet devices will be attached to the guest...achieved
> via a sensibly named 'hw_input_bus' image metadata property. That seems
> reasonable to me.
I hope I'm not woefully wrong here again, but IIUC they can't choose the
bus the mouse and keyboard uses for libvirt on x86, they get PS2
regardless. This is why I feel like hw_input_bus as a replacement for
hw_pointer_model is not clear. It's only guaranteed to be used for the
I'm sorry I'm not seeing how hw_pointer_model=virtio isn't the clearest,
least confusing way to add virtio. (Or maybe
Thanks for taking the time to explain the technical details around this
area of the code. I think I now understand your point of view since the
name of hw_pointer_model doesn't nicely convey the tablet+mouse+keyboard
setting when it comes to virtio. On the flip side of that, I feel like
hw_input_bus=usb when it's only going to be honored for the tablet for
libvirt on x86 seems even less nice.
This is all just MHO. If most other people think that hw_input_bus is
the clearer and more user-friendly way to present this config, then I
will of course accept the consensus.
>> We need to decide what approach to go for before I rework this. If
>> anyone has input, particularly operators that think they'd use this
>> feature, I'd love to hear it so that I can t̶e̶l̶l̶ ̶d̶a̶n̶s̶m̶i̶t̶h̶
>> ̶t̶o̶ ̶s̶h̶o̶v̶e̶ ̶i̶t̶ come to the best possible solution ;-) Feel
>> free to either reply here or on the review .
>>  https://review.opendev.org/#/c/756552/
More information about the openstack-discuss