All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 6/7] [V3] kvm: qemu: deassign device from guest
@ 2009-02-13  9:49 Han, Weidong
  0 siblings, 0 replies; only message in thread
From: Han, Weidong @ 2009-02-13  9:49 UTC (permalink / raw)
  To: 'Avi Kivity'
  Cc: 'kvm@vger.kernel.org', 'Mark McLoughlin'

[-- Attachment #1: Type: text/plain, Size: 2631 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 |   28 ++++++++++++++++++++++++++--
 qemu/hw/device-assignment.h |    1 +
 2 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/qemu/hw/device-assignment.c b/qemu/hw/device-assignment.c
index 5341ef2..fc89c6f 100644
--- a/qemu/hw/device-assignment.c
+++ b/qemu/hw/device-assignment.c
@@ -549,6 +549,28 @@ 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);
+
+    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 +585,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 +637,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: 0006-kvm-qemu-deassign-device-from-guest.patch --]
[-- Type: application/octet-stream, Size: 2758 bytes --]

From 39ac44a56bb3282fa7a1d3a9000caa3d7c13673e Mon Sep 17 00:00:00 2001
From: Weidong Han <weidong.han@intel.com>
Date: Fri, 13 Feb 2009 17:36:45 +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 |   28 ++++++++++++++++++++++++++--
 qemu/hw/device-assignment.h |    1 +
 2 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/qemu/hw/device-assignment.c b/qemu/hw/device-assignment.c
index 5341ef2..fc89c6f 100644
--- a/qemu/hw/device-assignment.c
+++ b/qemu/hw/device-assignment.c
@@ -549,6 +549,28 @@ 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);
+
+    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 +585,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 +637,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] only message in thread

only message in thread, other threads:[~2009-02-13  9:49 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-02-13  9:49 [PATCH 6/7] [V3] kvm: qemu: deassign device from guest 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.