1. 08 3月, 2019 20 次提交
  2. 07 3月, 2019 4 次提交
    • A
      Introduce new "no_guest_reset" parameter for usb-host device · ba4c735b
      Alexander Kappner 提交于
      With certain USB devices passed through via usb-host, a guest attempting to
      reset a usb-host device can trigger a reset loop that renders the USB device
      unusable. In my use case, the device was an iPhone XR that was passed through to
      a Mac OS X Mojave guest. Upon connecting the device, the following happens:
      
      1) Guest recognizes new device, sends reset to emulated USB host
      2) QEMU's USB host sends reset to host kernel
      3) Host kernel resets device
      4) After reset, host kernel determines that some part of the device descriptor
      has changed ("device firmware changed" in dmesg), so host kernel decides to
      re-enumerate the device.
      5) Re-enumeration causes QEMU to disconnect and reconnect the device in the
      guest.
      6) goto 1)
      
      Here's from the host kernel (note the "device firmware changed" lines")
      
      [3677704.473050] usb 1-1.3: new high-speed USB device number 53 using ehci-pci
      [3677704.555594] usb 1-1.3: New USB device found, idVendor=05ac, idProduct=12a8, bcdDevice=11.08
      [3677704.555599] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
      [3677704.555602] usb 1-1.3: Product: iPhone
      [3677704.555605] usb 1-1.3: Manufacturer: Apple Inc.
      [3677704.555607] usb 1-1.3: SerialNumber: [[removed]]
      [3677709.401040] usb 1-1.3: reset high-speed USB device number 53 using ehci-pci
      [3677709.479486] usb 1-1.3: device firmware changed
      [3677709.479842] usb 1-1.3: USB disconnect, device number 53
      [3677709.546039] usb 1-1.3: new high-speed USB device number 54 using ehci-pci
      [3677709.627471] usb 1-1.3: New USB device found, idVendor=05ac, idProduct=12a8, bcdDevice=11.08
      [3677709.627476] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
      [3677709.627479] usb 1-1.3: Product: iPhone
      [3677709.627481] usb 1-1.3: Manufacturer: Apple Inc.
      [3677709.627483] usb 1-1.3: SerialNumber: [[removed]]
      [3677762.320044] usb 1-1.3: reset high-speed USB device number 54 using ehci-pci
      [3677762.615630] usb 1-1.3: USB disconnect, device number 54
      [3677762.787043] usb 1-1.3: new high-speed USB device number 55 using ehci-pci
      [3677762.869016] usb 1-1.3: New USB device found, idVendor=05ac, idProduct=12a8, bcdDevice=11.08
      [3677762.869024] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
      [3677762.869028] usb 1-1.3: Product: iPhone
      [3677762.869032] usb 1-1.3: Manufacturer: Apple Inc.
      [3677762.869035] usb 1-1.3: SerialNumber: [[removed]]
      [3677815.662036] usb 1-1.3: reset high-speed USB device number 55 using ehci-pci
      
      Here's from QEMU:
      
      libusb: error [_get_usbfs_fd] libusb couldn't open USB device /dev/bus/usb/005/022: No such file or directory
      libusb: error [udev_hotplug_event] ignoring udev action bind
      libusb: error [udev_hotplug_event] ignoring udev action bind
      libusb: error [_open_sysfs_attr] open /sys/bus/usb/devices/5-1/bConfigurationValue failed ret=-1 errno=2
      libusb: error [_get_usbfs_fd] File doesn't exist, wait 10 ms and try again
      
      libusb: error [_get_usbfs_fd] libusb couldn't open USB device /dev/bus/usb/005/024: No such file or directory
      libusb: error [udev_hotplug_event] ignoring udev action bind
      libusb: error [udev_hotplug_event] ignoring udev action bind
      libusb: error [_open_sysfs_attr] open /sys/bus/usb/devices/5-1/bConfigurationValue failed ret=-1 errno=2
      libusb: error [_get_usbfs_fd] File doesn't exist, wait 10 ms and try again
      
      libusb: error [_get_usbfs_fd] libusb couldn't open USB device /dev/bus/usb/005/026: No such file or directory
      
      The result of this is that the device remains permanently unusable in the guest.
      The same problem has been previously reported for an iPad:
      https://stackoverflow.com/questions/52617634/how-do-i-get-qemu-usb-passthrough-to-work-for-ipad-iphone
      
      This problem can be elegantly solved by interrupting step 2) above. Instead of
      passing through the reset, QEMU simply ignores it. To allow this to be
      configured on a per-device level,  a new parameter "no_guest_reset" is
      introduced for the usb-host device. I can confirm that the configuration
      described above (iPhone XS + Mojave guest) works flawlessly with
      no_guest_reset=True specified.
      
      Working command line for my scenario:
      device_add usb-host,vendorid=0x05ac,productid=0x12a8,no_guest_reset=True,id=iphone
      
      Best regards
      Alexander
      Signed-off-by: NAlexander Kappner <agk@godking.net>
      Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
      Message-id: 20190128140027.9448-1-kraxel@redhat.com
      
      [ kraxel: rename parameter to "guest-reset" ]
      Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
      ba4c735b
    • B
      usb-mtp: prevent null dereference while deleting objects · 7ddf8374
      Bandan Das 提交于
      Spotted by Coverity: CID 1399144
      Signed-off-by: NBandan Das <bsd@redhat.com>
      Message-id: 20190306210409.14842-4-bsd@redhat.com
      Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
      7ddf8374
    • B
      usb-mtp: fix some usb_mtp_write_data return paths · 298ac63c
      Bandan Das 提交于
      During a write, free up the "path" before getting more data.
      Also, while we at it, remove the confusing usage of d->fd for
      storing mkdir status
      
      Spotted by Coverity: CID 1398642
      Signed-off-by: NBandan Das <bsd@redhat.com>
      Message-id: 20190306210409.14842-3-bsd@redhat.com
      Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
      298ac63c
    • B
      usb-mtp: return incomplete transfer on a lstat failure · c5ead51f
      Bandan Das 提交于
      MTP writes objects in small chunks and at the end gets the
      real file size to update the object metadata. If this fails for
      any reason, return an INCOMPLETE_TRANSFER to the initiator
      
      Spotted by Coverity: CID 1398651
      Signed-off-by: NBandan Das <bsd@redhat.com>
      Message-id: 20190306210409.14842-2-bsd@redhat.com
      Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
      c5ead51f
  3. 06 3月, 2019 9 次提交
    • D
      qdev: Provide qdev_get_bus_hotplug_handler() · 14405c27
      David Hildenbrand 提交于
      Let's use a wrapper instead of looking it up manually. This function can
      than be reused when we explicitly want to have the bus hotplug handler
      (e.g. when the bus hotplug handler was overwritten by the machine
      hotplug handler).
      Reviewed-by: NIgor Mammedov <imammedo@redhat.com>
      Signed-off-by: NDavid Hildenbrand <david@redhat.com>
      Message-Id: <20190228122849.4296-4-david@redhat.com>
      Signed-off-by: NEduardo Habkost <ehabkost@redhat.com>
      14405c27
    • I
      qdev: Let machine hotplug handler to override bus hotplug handler · 17cc0128
      Igor Mammedov 提交于
      it will allow to return another hotplug handler than the default
      one for a specific bus based device type. Which is needed to handle
      non trivial plug/unplug sequences that need the access to resources
      configured outside of bus where device is attached.
      
      That will allow for returned hotplug handler to orchestrate wiring
      in arbitrary order, by chaining other hotplug handlers when
      it's needed.
      
      PS:
      It could be used for hybrid virtio-mem and virtio-pmem devices
      where it will return machine as hotplug handler which will do
      necessary wiring at machine level and then pass control down
      the chain to bus specific hotplug handler.
      
      Example of top level hotplug handler override and custom plug sequence:
      
        some_machine_get_hotplug_handler(machine){
            if (object_dynamic_cast(OBJECT(dev), TYPE_SOME_BUS_DEVICE)) {
                return HOTPLUG_HANDLER(machine);
            }
            return NULL;
        }
      
        some_machine_device_plug(hotplug_dev, dev) {
            if (object_dynamic_cast(OBJECT(dev), TYPE_SOME_BUS_DEVICE)) {
                /* do machine specific initialization */
                some_machine_init_special_device(dev)
      
                /* pass control to bus specific handler */
                hotplug_handler_plug(dev->parent_bus->hotplug_handler, dev)
            }
        }
      Reviewed-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NIgor Mammedov <imammedo@redhat.com>
      Signed-off-by: NDavid Hildenbrand <david@redhat.com>
      Message-Id: <20190228122849.4296-3-david@redhat.com>
      Signed-off-by: NEduardo Habkost <ehabkost@redhat.com>
      17cc0128
    • D
      qdev: Let the hotplug_handler_unplug() caller delete the device · 07578b0a
      David Hildenbrand 提交于
      When unplugging a device, at one point the device will be destroyed
      via object_unparent(). This will, one the one hand, unrealize the
      removed device hierarchy, and on the other hand, destroy/free the
      device hierarchy.
      
      When chaining hotplug handlers, we want to overwrite a bus hotplug
      handler by the machine hotplug handler, to be able to perform
      some part of the plug/unplug and to forward the calls to the bus hotplug
      handler.
      
      For now, the bus hotplug handler would trigger an object_unparent(), not
      allowing us to perform some unplug action on a device after we forwarded
      the call to the bus hotplug handler. The device would be gone at that
      point.
      
      machine_unplug_handler(dev)
          /* eventually do unplug stuff */
          bus_unplug_handler(dev)
          /* dev is gone, we can't do more unplug stuff */
      
      So move the object_unparent() to the original caller of the unplug. For
      now, keep the unrealize() at the original places of the
      object_unparent(). For implicitly chained hotplug handlers (e.g. pc
      code calling acpi hotplug handlers), the object_unparent() has to be
      done by the outermost caller. So when calling hotplug_handler_unplug()
      from inside an unplug handler, nothing is to be done.
      
      hotplug_handler_unplug(dev) -> calls machine_unplug_handler()
          machine_unplug_handler(dev) {
              /* eventually do unplug stuff */
              bus_unplug_handler(dev) -> calls unrealize(dev)
              /* we can do more unplug stuff but device already unrealized */
          }
      object_unparent(dev)
      
      In the long run, every unplug action should be factored out of the
      unrealize() function into the unplug handler (especially for PCI). Then
      we can get rid of the additonal unrealize() calls and object_unparent()
      will properly unrealize the device hierarchy after the device has been
      unplugged.
      
      hotplug_handler_unplug(dev) -> calls machine_unplug_handler()
          machine_unplug_handler(dev) {
              /* eventually do unplug stuff */
              bus_unplug_handler(dev) -> only unplugs, does not unrealize
              /* we can do more unplug stuff */
          }
      object_unparent(dev) -> will unrealize
      
      The original approach was suggested by Igor Mammedov for the PCI
      part, but I extended it to all hotplug handlers. I consider this one
      step into the right direction.
      
      To summarize:
      - object_unparent() on synchronous unplugs is done by common code
      -- "Caller of hotplug_handler_unplug"
      - object_unparent() on asynchronous unplugs ("unplug requests") has to
        be done manually
      -- "Caller of hotplug_handler_unplug"
      Reviewed-by: NIgor Mammedov <imammedo@redhat.com>
      Acked-by: NCornelia Huck <cohuck@redhat.com>
      Signed-off-by: NDavid Hildenbrand <david@redhat.com>
      Message-Id: <20190228122849.4296-2-david@redhat.com>
      Reviewed-by: NGreg Kurz <groug@kaod.org>
      Signed-off-by: NEduardo Habkost <ehabkost@redhat.com>
      07578b0a
    • T
      qdev/core: fix qbus_is_full() · 12b2e9f3
      Tony Krowiak 提交于
      The qbus_is_full(BusState *bus) function (qdev_monitor.c) compares the max_index
      value of the BusState structure with the max_dev value of the BusClass structure
      to determine whether the maximum number of children has been reached for the
      bus. The problem is, the max_index field of the BusState structure does not
      necessarily reflect the number of devices that have been plugged into
      the bus.
      
      Whenever a child device is plugged into the bus, the bus's max_index value is
      assigned to the child device and then incremented. If the child is subsequently
      unplugged, the value of the max_index does not change and no longer reflects the
      number of children.
      
      When the bus's max_index value reaches the maximum number of devices
      allowed for the bus (i.e., the max_dev field in the BusClass structure),
      attempts to plug another device will be rejected claiming that the bus is
      full -- even if the bus is actually empty.
      
      To resolve the problem, a new 'num_children' field is being added to the
      BusState structure to keep track of the number of children plugged into the
      bus. It will be incremented when a child is plugged, and decremented when a
      child is unplugged.
      Signed-off-by: NTony Krowiak <akrowiak@linux.ibm.com>
      Reviewed-by: Pierre Morel<pmorel@linux.ibm.com>
      Reviewed-by: NHalil Pasic <pasic@linux.ibm.com>
      Message-Id: <1545062250-7573-1-git-send-email-akrowiak@linux.ibm.com>
      Reviewed-by: NIgor Mammedov <imammedo@redhat.com>
      Signed-off-by: NEduardo Habkost <ehabkost@redhat.com>
      12b2e9f3
    • W
      virtio-balloon: VIRTIO_BALLOON_F_FREE_PAGE_HINT · c13c4153
      Wei Wang 提交于
      The new feature enables the virtio-balloon device to receive hints of
      guest free pages from the free page vq.
      
      A notifier is registered to the migration precopy notifier chain. The
      notifier calls free_page_start after the migration thread syncs the dirty
      bitmap, so that the free page optimization starts to clear bits of free
      pages from the bitmap. It calls the free_page_stop before the migration
      thread syncs the bitmap, which is the end of the current round of ram
      save. The free_page_stop is also called to stop the optimization in the
      case when there is an error occurred in the process of ram saving.
      
      Note: balloon will report pages which were free at the time of this call.
      As the reporting happens asynchronously, dirty bit logging must be
      enabled before this free_page_start call is made. Guest reporting must be
      disabled before the migration dirty bitmap is synchronized.
      Signed-off-by: NWei Wang <wei.w.wang@intel.com>
      CC: Michael S. Tsirkin <mst@redhat.com>
      CC: Dr. David Alan Gilbert <dgilbert@redhat.com>
      CC: Juan Quintela <quintela@redhat.com>
      CC: Peter Xu <peterx@redhat.com>
      Message-Id: <1544516693-5395-8-git-send-email-wei.w.wang@intel.com>
      Reviewed-by: NMichael S. Tsirkin <mst@redhat.com>
      Signed-off-by: NDr. David Alan Gilbert <dgilbert@redhat.com>
        dgilbert: Dropped kernel header update, fixed up CMD_ID_* name change
      c13c4153
    • S
      block/pflash_cfi02: Fix memory leak and potential use-after-free · d80cf1eb
      Stephen Checkoway 提交于
      Don't dynamically allocate the pflash's timer. But do use timer_del in
      an unrealize function to make sure that the timer can't fire after the
      pflash_t has been freed.
      Signed-off-by: NStephen Checkoway <stephen.checkoway@oberlin.edu>
      Reviewed-by: NPhilippe Mathieu-Daudé <philmd@redhat.com>
      Reviewed-by: NWei Yang <richardw.yang@linux.intel.com>
      Message-Id: <20190219153727.62279-1-stephen.checkoway@oberlin.edu>
      Signed-off-by: NLaurent Vivier <laurent@vivier.eu>
      d80cf1eb
    • W
      hw/acpi: remove unnecessary variable acpi_table_builtin · 7d9b68ac
      Wei Yang 提交于
      acpi_table_builtin is now always false, it is not necessary to check it
      again.
      
      This patch just removes it.
      Signed-off-by: NWei Yang <richardw.yang@linux.intel.com>
      Reviewed-by: NPhilippe Mathieu-Daudé <philmd@redhat.com>
      Tested-by: NPhilippe Mathieu-Daudé <philmd@redhat.com>
      Reviewed-by: NIgor Mammedov <imammedo@redhat.com>
      Message-Id: <20190214084939.20640-4-richardw.yang@linux.intel.com>
      Signed-off-by: NLaurent Vivier <laurent@vivier.eu>
      7d9b68ac
    • W
      hw/acpi: remove unused function acpi_table_add_builtin() · 120fc4eb
      Wei Yang 提交于
      Function acpi_table_add_builtin() is not used anymore.
      
      Remove the definition and declaration.
      Signed-off-by: NWei Yang <richardw.yang@linux.intel.com>
      Reviewed-by: NPhilippe Mathieu-Daudé <philmd@redhat.com>
      Tested-by: NPhilippe Mathieu-Daudé <philmd@redhat.com>
      Reviewed-by: NIgor Mammedov <imammedo@redhat.com>
      Message-Id: <20190214084939.20640-3-richardw.yang@linux.intel.com>
      Signed-off-by: NLaurent Vivier <laurent@vivier.eu>
      120fc4eb
    • W
      hw/i386/pc.c: remove unused function pc_acpi_init() · 49e5ef07
      Wei Yang 提交于
      Function pc_acpi_init() is not used anymore.
      
      Remove the definition and declaration.
      Signed-off-by: NWei Yang <richardw.yang@linux.intel.com>
      Reviewed-by: NPhilippe Mathieu-Daudé <philmd@redhat.com>
      Tested-by: NPhilippe Mathieu-Daudé <philmd@redhat.com>
      Reviewed-by: NIgor Mammedov <imammedo@redhat.com>
      Reviewed-by: NThomas Huth <thuth@redhat.com>
      Message-Id: <20190214084939.20640-2-richardw.yang@linux.intel.com>
      Signed-off-by: NLaurent Vivier <laurent@vivier.eu>
      49e5ef07
  4. 05 3月, 2019 7 次提交