* [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.