Re: [libvirt] [RFC] On present using dummy hostdev usb device

2019-09-02 Thread Roman Kagan
On Fri, Aug 30, 2019 at 04:19:23PM +0100, Daniel P. Berrangé wrote:
> On Fri, Aug 30, 2019 at 05:08:52PM +0200, Michal Privoznik wrote:
> > On 8/30/19 2:30 PM, Roman Kagan wrote:
> > > On Fri, Aug 30, 2019 at 10:09:06AM +0100, Daniel P. Berrangé wrote:
> > > > On Fri, Aug 30, 2019 at 08:44:03AM +, Nikolay Shirokovskiy wrote:
> > > > > Hi, all!
> > > > > 
> > > > >We use an interesting approach when starting/migrating/etc domain 
> > > > > with usb
> > > > > hostdev with startupPolicy=optional. We add qemu usb-host device with
> > > > > missing hostaddr/hostbus parameters (dummy device). I guess there are
> > > > > 2 reasons why we do it. First without dummy device migration will 
> > > > > fail as
> > > > > described in [1]. Second is an interesting property of dummy device 
> > > > > that
> > > > > qemu starts to monitor for attaching of usb devices and binds the 
> > > > > first
> > > > > attached to node to the dummy device. So one can start a domain with
> > > > > missing hostdev and attach it later or migrate a domain then detach
> > > > > hostdev on source and attach it on destination. But as qemu binds the
> > > > > first attached device this is not reliable, to say the least. And 
> > > > > after
> > > > > all this does not work if domain uses distinct mount namespace which
> > > > > is default.
> > > > 
> > > > Even without mount namespaces, it should fail as QEMU is running  
> > > > non-root
> > > > and libvirt won't have granted access to any host USB devices in /dev, 
> > > > and
> > > > also SELinux policy will forbid this.
> > > 
> > > Right, but the case with mount namespaces is particularly problematic:
> > > if the device open fails due to missing device node, libusb removes the
> > > device from its internal device list.  This results in the following
> > > scenario:
> > > 
> > > - libvirt adds a dummy usb-host device to QEMU in place of a missing
> > >device
> > > 
> > > - QEMU (via libusb) installs a watch for udev add events
> > > 
> > > - the physical device is plugged into the host
> > > 
> > > - QEMU detects the addition of the device and, since the dummy device
> > >matches everything, tries to open it
> > > 
> > > - by this time libvirt may have not created a device node in QEMU's
> > >mount namespace, so the open fails due to missing device node, and
> > >libusb removes the device from its internal list
> > > 
> > > - libvirt removes the dummy usb-host device and adds the actual usb-host
> > >device
> > > 
> > > - QEMU fails to open it because it's no longer seen by libusb
> > 
> > There is a bug filed against libusb exactly for this:
> > 
> > https://bugzilla.redhat.com/show_bug.cgi?id=1595525
> > 
> > BTW: you don't have to migrate, it's sufficient to start a domain with a
> > missing USB and startupPolicy='optional' and then physically plug it into
> > the host and then try to hotplug it into the domain.
> 
> AFAIR, the startupPolicy=optional was never really intended to allow
> for the device to be dynamically added after startup. It was only
> trying drop the device if it didn't exist at startup.
> 
> If we do want a way to dynamically add after startup, then libvirt itself
> would have to monitor the USB devices on the host, and then perform QMP
> commands to hot-add to QEMU.

This is actually what Nikolay was trying to achieve with his patchset
(https://www.redhat.com/archives/libvir-list/2019-August/msg01413.html).
Is this a NAK to it, with a suggestion that it's the upper layer's
responsibility?

Thanks,
Roman.

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [RFC] On present using dummy hostdev usb device

2019-08-30 Thread Roman Kagan
On Fri, Aug 30, 2019 at 10:09:06AM +0100, Daniel P. Berrangé wrote:
> On Fri, Aug 30, 2019 at 08:44:03AM +, Nikolay Shirokovskiy wrote:
> > Hi, all!
> > 
> >   We use an interesting approach when starting/migrating/etc domain with usb
> > hostdev with startupPolicy=optional. We add qemu usb-host device with
> > missing hostaddr/hostbus parameters (dummy device). I guess there are
> > 2 reasons why we do it. First without dummy device migration will fail as
> > described in [1]. Second is an interesting property of dummy device that
> > qemu starts to monitor for attaching of usb devices and binds the first
> > attached to node to the dummy device. So one can start a domain with
> > missing hostdev and attach it later or migrate a domain then detach
> > hostdev on source and attach it on destination. But as qemu binds the
> > first attached device this is not reliable, to say the least. And after
> > all this does not work if domain uses distinct mount namespace which
> > is default.
> 
> Even without mount namespaces, it should fail as QEMU is running  non-root
> and libvirt won't have granted access to any host USB devices in /dev, and
> also SELinux policy will forbid this.

Right, but the case with mount namespaces is particularly problematic:
if the device open fails due to missing device node, libusb removes the
device from its internal device list.  This results in the following
scenario:

- libvirt adds a dummy usb-host device to QEMU in place of a missing
  device

- QEMU (via libusb) installs a watch for udev add events

- the physical device is plugged into the host

- QEMU detects the addition of the device and, since the dummy device
  matches everything, tries to open it

- by this time libvirt may have not created a device node in QEMU's
  mount namespace, so the open fails due to missing device node, and
  libusb removes the device from its internal list

- libvirt removes the dummy usb-host device and adds the actual usb-host
  device

- QEMU fails to open it because it's no longer seen by libusb

IOW a usb-host device with missing=true can't (reliably, because
sometimes libvirt is quick enough to create the device node before QEMU
gives up opening it) turn into a working one without QEMU restart.

> >   So I question does it make sense to use dummy device at all? In case of
> > migration/resume from suspend/revert to snapshot we can either fix qemu to
> > ignore incoming missing hostdev data or add dummy device temporarily. The
> > latter solution is worse as it brings dummy device behaviour even for a 
> > short
> > period of time. However having a temporary dummy device is neccessary step
> > towards the time when all supported versions of qemu do the mentioned 
> > ignoring.
> > As to handling attaching of missing hostdev device to node it should be 
> > done in
> > libvirt which can do necessary mount namespace actions. (Actually I 
> > developing
> > such patches right now but some peculiarities of dummy device bring me 
> > here).
> 
> The problems around host USB device passthrough are conceptually similar
> to the problems of hots PCI device passthrough.
> 
> In both cases we cannot assume the device present on the source device
> exists on the target device in the same way.
> 
> In both cases, even if the device does exist on the target, we cannot
> serialize the state of the host device across the migration.

Right.

> For PCI devices we simply refuse to initiate the migration if any host
> PCI devices are attached. The mgmt app has to hot-unplug all devices
> before migration, and hot-plug new devices after migration if desired.
> 
> I'm inclined to suggest that same approach of hotunplug + hotplug either
> side of migration is the only viable option for host USB devices too.
> 
> As such any mgmt app could do this dance today without any changes in
> libvirt.

Are you trying to say that the mgmt app should just refrain from
creating usb-host devices with missing=true?

> If we turned host USB devices into a migration blocker though, that
> could be considered a significant change of behaviour for mgmt apps,
> even though this dummy USB device is effectively useless due to our
> security policies.

I'm afraid the issue is a bit more severe: the dummy device isn't just
useless, it stands in the way of the real device later on.

Thanks,
Roman.

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH 0/3] conf: qemu: support new Hyper-V enlightenments

2018-08-13 Thread Roman Kagan
On Thu, Aug 09, 2018 at 03:14:18PM +0200, Vitaly Kuznetsov wrote:
> Several new Hyper-V enlightenments were recently added to Qemu:
> - hv-frequencies
> - hv-reenlightenment
> - hv-tlbflush
> 
> Support these in libvirt.
> 
> Vitaly Kuznetsov (3):
>   conf: qemu: add support for Hyper-V frequency MSRs
>   conf: qemu: add support for Hyper-V reenlightenment notifications
>   conf: qemu: add support for Hyper-V PV TLB flush
> 
>  docs/formatdomain.html.in   | 21 +
>  docs/schemas/domaincommon.rng   | 15 +++
>  src/conf/domain_conf.c  | 14 +-
>  src/conf/domain_conf.h  |  3 +++
>  src/cpu/cpu_x86.c   |  9 +
>  src/cpu/cpu_x86_data.h  |  3 +++
>  src/qemu/qemu_command.c |  3 +++
>  src/qemu/qemu_parse_command.c   |  3 +++
>  src/qemu/qemu_process.c |  3 +++
>  tests/qemuxml2argvdata/hyperv-off.xml   |  3 +++
>  tests/qemuxml2argvdata/hyperv.args  |  3 ++-
>  tests/qemuxml2argvdata/hyperv.xml   |  3 +++
>  tests/qemuxml2xmloutdata/hyperv-off.xml |  3 +++
>  tests/qemuxml2xmloutdata/hyperv.xml |  3 +++
>  14 files changed, 87 insertions(+), 2 deletions(-)

Bringing this to the attention of our libvirt guru...

Roman.

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list