1. 21 2月, 2017 1 次提交
    • M
      qemu: Fix deadlock across fork() in QEMU driver · e22de286
      Marc Hartmayer 提交于
      The functions in virCommand() after fork() must be careful with regard
      to accessing any mutexes that may have been locked by other threads in
      the parent process. It is possible that another thread in the parent
      process holds the lock for the virQEMUDriver while fork() is called.
      This leads to a deadlock in the child process when
      'virQEMUDriverGetConfig(driver)' is called and therefore the handshake
      never completes between the child and the parent process. Ultimately
      the virDomainObjectPtr will never be unlocked.
      
      It gets much worse if the other thread of the parent process, that
      holds the lock for the virQEMUDriver, tries to lock the already locked
      virDomainObject. This leads to a completely unresponsive libvirtd.
      
      It's possible to reproduce this case with calling 'virsh start XXX'
      and 'virsh managedsave XXX' in a tight loop for multiple domains.
      
      This commit fixes the deadlock in the same way as it is described in
      commit 61b52d2e.
      Signed-off-by: NMarc Hartmayer <mhartmay@linux.vnet.ibm.com>
      Reviewed-by: NBoris Fiuczynski <fiuczy@linux.vnet.ibm.com>
      e22de286
  2. 20 2月, 2017 4 次提交
  3. 15 2月, 2017 2 次提交
    • M
      qemu_conf: Check for namespaces availability more wisely · b57bd206
      Michal Privoznik 提交于
      The bare fact that mnt namespace is available is not enough for
      us to allow/enable qemu namespaces feature. There are other
      requirements: we must copy all the ACL & SELinux labels otherwise
      we might grant access that is administratively forbidden or vice
      versa.
      At the same time, the check for namespace prerequisites is moved
      from domain startup time to qemu.conf parser as it doesn't make
      much sense to allow users to start misconfigured libvirt just to
      find out they can't start a single domain.
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      b57bd206
    • A
      qemu: Call chmod() after mknod() · ee6ec782
      Andrea Bolognani 提交于
      mknod() is affected my the current umask, so we're not
      guaranteed the newly-created device node will have the
      right permissions.
      
      Call chmod(), which is not affected by the current umask,
      immediately afterwards to solve the issue.
      
      Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1421036
      ee6ec782
  4. 13 2月, 2017 1 次提交
  5. 09 2月, 2017 1 次提交
  6. 08 2月, 2017 6 次提交
  7. 07 2月, 2017 5 次提交
  8. 26 1月, 2017 2 次提交
  9. 22 1月, 2017 1 次提交
  10. 20 1月, 2017 1 次提交
    • M
      qemu: set default vhost-user ifname · 57b5e27d
      Michal Privoznik 提交于
      Based on work of Mehdi Abaakouk <sileht@sileht.net>.
      
      When parsing vhost-user interface XML and no ifname is found we
      can try to fill it in in post parse callback. The way this works
      is we try to make up interface name from given socket path and
      then ask openvswitch whether it knows the interface.
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      57b5e27d
  11. 17 1月, 2017 1 次提交
  12. 13 1月, 2017 1 次提交
    • M
      qemu: Copy SELinux labels for namespace too · 93a062c3
      Michal Privoznik 提交于
      When creating new /dev/* for qemu, we do chown() and copy ACLs to
      create the exact copy from the original /dev. I though that
      copying SELinux labels is not necessary as SELinux will chose the
      sane defaults. Surprisingly, it does not leaving namespace with
      the following labels:
      
      crw-rw-rw-. root root system_u:object_r:tmpfs_t:s0     random
      crw-------. root root system_u:object_r:tmpfs_t:s0     rtc0
      drwxrwxrwt. root root system_u:object_r:tmpfs_t:s0     shm
      crw-rw-rw-. root root system_u:object_r:tmpfs_t:s0     urandom
      
      As a result, domain is unable to start:
      
      error: internal error: process exited while connecting to monitor: Error in GnuTLS initialization: Failed to acquire random data.
      qemu-kvm: cannot initialize crypto: Unable to initialize GNUTLS library: Failed to acquire random data.
      
      The solution is to copy the SELinux labels as well.
      Reported-by: NAndrea Bolognani <abologna@redhat.com>
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      93a062c3
  13. 12 1月, 2017 4 次提交
  14. 11 1月, 2017 1 次提交
  15. 10 1月, 2017 4 次提交
  16. 05 1月, 2017 2 次提交
  17. 04 1月, 2017 3 次提交
    • M
      qemuDomainCreateDevice: Be more careful about device path · dd78da09
      Michal Privoznik 提交于
      Again, not something that I'd hit, but there is a chance in
      theory that this might bite us. Currently the way we decide
      whether or not to create /dev entry for a device is by marching
      first four characters of path with "/dev". This might be not
      enough. Just imagine somebody has a disk image stored under
      "/devil/path/to/disk". We ought to be matching against "/dev/".
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      dd78da09
    • M
      qemuDomainAttachDeviceMknodHelper: Don't unlink() so often · ce01a2b1
      Michal Privoznik 提交于
      Not that I'd encounter any bug here, but the code doesn't look
      100% correct. Imagine, somebody is trying to attach a device to a
      domain, and the device's /dev entry already exists in the qemu
      namespace. This is handled gracefully and the control continues
      with setting up ACLs and calling security manager to set up
      labels. Now, if any of these steps fail, control jump on the
      'cleanup' label and unlink() the file straight away. Even when it
      was not us who created the file in the first place. This can be
      possibly dangerous.
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      ce01a2b1
    • M
      qemu: Handle EEXIST gracefully in qemuDomainCreateDevice · 3aae99fe
      Michal Privoznik 提交于
      https://bugzilla.redhat.com/show_bug.cgi?id=1406837
      
      Imagine you have a domain configured in such way that you are
      assigning two PCI devices that fall into the same IOMMU group.
      With mount namespace enabled what happens is that for the first
      PCI device corresponding /dev/vfio/X entry is created and when
      the code tries to do the same for the second mknod() fails as
      /dev/vfio/X already exists:
      
      2016-12-21 14:40:45.648+0000: 24681: error :
      qemuProcessReportLogError:1792 : internal error: Process exited
      prior to exec: libvirt: QEMU Driver error : Failed to make device
      /var/run/libvirt/qemu/windoze.dev//vfio/22: File exists
      
      Worse, by default there are some devices that are created in the
      namespace regardless of domain configuration (e.g. /dev/null,
      /dev/urandom, etc.). If one of them is set as backend for some
      guest device (e.g. rng, chardev, etc.) it's the same story as
      described above.
      
      Weirdly, in attach code this is already handled.
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      3aae99fe