All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 5/6] kvm: qemu: deassign device from guest
@ 2009-02-13  6:58 Han, Weidong
  2009-02-13  8:14 ` Mark McLoughlin
  0 siblings, 1 reply; 3+ messages in thread
From: Han, Weidong @ 2009-02-13  6:58 UTC (permalink / raw)
  To: 'Avi Kivity'
  Cc: 'kvm@vger.kernel.org', 'Mark McLoughlin'

[-- Attachment #1: Type: text/plain, Size: 3033 bytes --]

free_assigned_device just frees device from qemu, it should also
deassign the device from guest when guest exits or hot remove
a device.

Acked-by: Mark McLoughlin <markmc@redhat.com>
Signed-off-by: Weidong Han <weidong.han@intel.com>
---
 qemu/hw/device-assignment.c |   39 +++++++++++++++++++++++++++++++++++++--
 qemu/hw/device-assignment.h |    1 +
 2 files changed, 38 insertions(+), 2 deletions(-)

diff --git a/qemu/hw/device-assignment.c b/qemu/hw/device-assignment.c
index 5341ef2..7240d1e 100644
--- a/qemu/hw/device-assignment.c
+++ b/qemu/hw/device-assignment.c
@@ -549,6 +549,39 @@ static int assign_irq(AssignedDevInfo *adev)
     return r;
 }
 
+static void deassign_device(AssignedDevInfo *adev)
+{
+    struct kvm_assigned_pci_dev assigned_dev_data;
+    AssignedDevice *dev = adev->assigned_dev;
+    int r;
+
+    memset(&assigned_dev_data, 0, sizeof(assigned_dev_data));
+    assigned_dev_data.assigned_dev_id  =
+	calc_assigned_dev_id(dev->h_busnr, dev->h_devfn);
+    assigned_dev_data.busnr = dev->h_busnr;
+    assigned_dev_data.devfn = dev->h_devfn;
+
+#ifdef KVM_CAP_IOMMU
+    /* We always enable the IOMMU if present
+     * (or when not disabled on the command line)
+     */
+    r = kvm_check_extension(kvm_context, KVM_CAP_IOMMU);
+    if (r && !adev->disable_iommu)
+	assigned_dev_data.flags |= KVM_DEV_ASSIGN_ENABLE_IOMMU;
+#endif
+
+    r = kvm_deassign_pci_device(kvm_context, &assigned_dev_data);
+    if (r < 0)
+	fprintf(stderr, "Failed to deassign device \"%s\" : %s\n",
+                adev->name, strerror(-r));
+}
+
+void remove_assigned_device(AssignedDevInfo *adev)
+{
+    deassign_device(adev);
+    free_assigned_device(adev);
+}
+
 /* The pci config space got updated. Check if irq numbers have changed
  * for our devices
  */
@@ -563,7 +596,7 @@ void assigned_dev_update_irqs()
 
         r = assign_irq(adev);
         if (r < 0)
-            free_assigned_device(adev);
+            remove_assigned_device(adev);
 
         adev = next;
     }
@@ -615,10 +648,12 @@ struct PCIDevice *init_assigned_device(AssignedDevInfo *adev, PCIBus *bus)
     /* assign device to guest */
     r = assign_device(adev);
     if (r < 0)
-        goto out;
+        goto assigned_out;
 
     return &dev->dev;
 
+assigned_out:
+    deassign_device(adev);
 out:
     free_assigned_device(adev);
     return NULL;
diff --git a/qemu/hw/device-assignment.h b/qemu/hw/device-assignment.h
index 6a9b9fa..84f3f32 100644
--- a/qemu/hw/device-assignment.h
+++ b/qemu/hw/device-assignment.h
@@ -97,6 +97,7 @@ struct AssignedDevInfo {
 PCIDevice *init_assigned_device(AssignedDevInfo *adev, PCIBus *bus);
 AssignedDevInfo *add_assigned_device(const char *arg);
 void add_assigned_devices(PCIBus *bus, const char **devices, int n_devices);
+void remove_assigned_device(AssignedDevInfo *adev);
 ram_addr_t assigned_dev_load_option_roms(ram_addr_t rom_base_offset);
 void assigned_dev_update_irqs(void);
 
-- 
1.6.0.4

[-- Attachment #2: 0005-kvm-qemu-deassign-device-from-guest.patch --]
[-- Type: application/octet-stream, Size: 3149 bytes --]

From c152714c44b414253c080b0d2a6f1575c38fbdca Mon Sep 17 00:00:00 2001
From: Weidong Han <weidong.han@intel.com>
Date: Fri, 13 Feb 2009 13:43:07 +0800
Subject: [PATCH] kvm: qemu: deassign device from guest

free_assigned_device just frees device from qemu, it should also
deassign the device from guest when guest exits or hot remove
a device.

Acked-by: Mark McLoughlin <markmc@redhat.com>
Signed-off-by: Weidong Han <weidong.han@intel.com>
---
 qemu/hw/device-assignment.c |   39 +++++++++++++++++++++++++++++++++++++--
 qemu/hw/device-assignment.h |    1 +
 2 files changed, 38 insertions(+), 2 deletions(-)

diff --git a/qemu/hw/device-assignment.c b/qemu/hw/device-assignment.c
index 5341ef2..7240d1e 100644
--- a/qemu/hw/device-assignment.c
+++ b/qemu/hw/device-assignment.c
@@ -549,6 +549,39 @@ static int assign_irq(AssignedDevInfo *adev)
     return r;
 }
 
+static void deassign_device(AssignedDevInfo *adev)
+{
+    struct kvm_assigned_pci_dev assigned_dev_data;
+    AssignedDevice *dev = adev->assigned_dev;
+    int r;
+
+    memset(&assigned_dev_data, 0, sizeof(assigned_dev_data));
+    assigned_dev_data.assigned_dev_id  =
+	calc_assigned_dev_id(dev->h_busnr, dev->h_devfn);
+    assigned_dev_data.busnr = dev->h_busnr;
+    assigned_dev_data.devfn = dev->h_devfn;
+
+#ifdef KVM_CAP_IOMMU
+    /* We always enable the IOMMU if present
+     * (or when not disabled on the command line)
+     */
+    r = kvm_check_extension(kvm_context, KVM_CAP_IOMMU);
+    if (r && !adev->disable_iommu)
+	assigned_dev_data.flags |= KVM_DEV_ASSIGN_ENABLE_IOMMU;
+#endif
+
+    r = kvm_deassign_pci_device(kvm_context, &assigned_dev_data);
+    if (r < 0)
+	fprintf(stderr, "Failed to deassign device \"%s\" : %s\n",
+                adev->name, strerror(-r));
+}
+
+void remove_assigned_device(AssignedDevInfo *adev)
+{
+    deassign_device(adev);
+    free_assigned_device(adev);
+}
+
 /* The pci config space got updated. Check if irq numbers have changed
  * for our devices
  */
@@ -563,7 +596,7 @@ void assigned_dev_update_irqs()
 
         r = assign_irq(adev);
         if (r < 0)
-            free_assigned_device(adev);
+            remove_assigned_device(adev);
 
         adev = next;
     }
@@ -615,10 +648,12 @@ struct PCIDevice *init_assigned_device(AssignedDevInfo *adev, PCIBus *bus)
     /* assign device to guest */
     r = assign_device(adev);
     if (r < 0)
-        goto out;
+        goto assigned_out;
 
     return &dev->dev;
 
+assigned_out:
+    deassign_device(adev);
 out:
     free_assigned_device(adev);
     return NULL;
diff --git a/qemu/hw/device-assignment.h b/qemu/hw/device-assignment.h
index 6a9b9fa..84f3f32 100644
--- a/qemu/hw/device-assignment.h
+++ b/qemu/hw/device-assignment.h
@@ -97,6 +97,7 @@ struct AssignedDevInfo {
 PCIDevice *init_assigned_device(AssignedDevInfo *adev, PCIBus *bus);
 AssignedDevInfo *add_assigned_device(const char *arg);
 void add_assigned_devices(PCIBus *bus, const char **devices, int n_devices);
+void remove_assigned_device(AssignedDevInfo *adev);
 ram_addr_t assigned_dev_load_option_roms(ram_addr_t rom_base_offset);
 void assigned_dev_update_irqs(void);
 
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH 5/6] kvm: qemu: deassign device from guest
  2009-02-13  6:58 [PATCH 5/6] kvm: qemu: deassign device from guest Han, Weidong
@ 2009-02-13  8:14 ` Mark McLoughlin
  2009-02-13  9:20   ` Han, Weidong
  0 siblings, 1 reply; 3+ messages in thread
From: Mark McLoughlin @ 2009-02-13  8:14 UTC (permalink / raw)
  To: Han, Weidong; +Cc: 'Avi Kivity', 'kvm@vger.kernel.org'

On Fri, 2009-02-13 at 14:58 +0800, Han, Weidong wrote:
> +static void deassign_device(AssignedDevInfo *adev)
> +{
> +    struct kvm_assigned_pci_dev assigned_dev_data;
> +    AssignedDevice *dev = adev->assigned_dev;
> +    int r;
> +
> +    memset(&assigned_dev_data, 0, sizeof(assigned_dev_data));
> +    assigned_dev_data.assigned_dev_id  =
> +       calc_assigned_dev_id(dev->h_busnr, dev->h_devfn);

>From here:

> +    assigned_dev_data.busnr = dev->h_busnr;
> +    assigned_dev_data.devfn = dev->h_devfn;
> +
> +#ifdef KVM_CAP_IOMMU
> +    /* We always enable the IOMMU if present
> +     * (or when not disabled on the command line)
> +     */
> +    r = kvm_check_extension(kvm_context, KVM_CAP_IOMMU);
> +    if (r && !adev->disable_iommu)
> +       assigned_dev_data.flags |= KVM_DEV_ASSIGN_ENABLE_IOMMU;
> +#endif

to here.

As, I said, these lines should not be needed and the ioctl should be
fixed like so:

-       if (assigned_dev->flags & KVM_DEV_ASSIGN_ENABLE_IOMMU)
+       if (match->flags & KVM_DEV_ASSIGN_ENABLE_IOMMU)
                kvm_deassign_device(kvm, match);

Cheers,
Mark.


^ permalink raw reply	[flat|nested] 3+ messages in thread

* RE: [PATCH 5/6] kvm: qemu: deassign device from guest
  2009-02-13  8:14 ` Mark McLoughlin
@ 2009-02-13  9:20   ` Han, Weidong
  0 siblings, 0 replies; 3+ messages in thread
From: Han, Weidong @ 2009-02-13  9:20 UTC (permalink / raw)
  To: 'Mark McLoughlin'
  Cc: 'Avi Kivity', 'kvm@vger.kernel.org'

Mark McLoughlin wrote:
> On Fri, 2009-02-13 at 14:58 +0800, Han, Weidong wrote:
>> +static void deassign_device(AssignedDevInfo *adev) +{
>> +    struct kvm_assigned_pci_dev assigned_dev_data;
>> +    AssignedDevice *dev = adev->assigned_dev;
>> +    int r;
>> +
>> +    memset(&assigned_dev_data, 0, sizeof(assigned_dev_data));
>> +    assigned_dev_data.assigned_dev_id  =
>> +       calc_assigned_dev_id(dev->h_busnr, dev->h_devfn);
> 
>> From here:
> 
>> +    assigned_dev_data.busnr = dev->h_busnr;
>> +    assigned_dev_data.devfn = dev->h_devfn;
>> +
>> +#ifdef KVM_CAP_IOMMU
>> +    /* We always enable the IOMMU if present
>> +     * (or when not disabled on the command line)
>> +     */
>> +    r = kvm_check_extension(kvm_context, KVM_CAP_IOMMU);
>> +    if (r && !adev->disable_iommu)
>> +       assigned_dev_data.flags |= KVM_DEV_ASSIGN_ENABLE_IOMMU;
>> +#endif
> 
> to here.
> 
> As, I said, these lines should not be needed and the ioctl should be
> fixed like so:
> 
> -       if (assigned_dev->flags & KVM_DEV_ASSIGN_ENABLE_IOMMU)
> +       if (match->flags & KVM_DEV_ASSIGN_ENABLE_IOMMU)
>                 kvm_deassign_device(kvm, match);
> 

I ignored this comment, will update it.

Regards,
Weidong

> Cheers,
> Mark.


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2009-02-13  9:22 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-02-13  6:58 [PATCH 5/6] kvm: qemu: deassign device from guest Han, Weidong
2009-02-13  8:14 ` Mark McLoughlin
2009-02-13  9:20   ` Han, Weidong

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.