From: Amit Shah <[EMAIL PROTECTED]>
This patch adds support for hot-plugging host PCI devices into
guests
[muli: various small fixes for review comments]
Signed-off-by: Amit Shah <[EMAIL PROTECTED]>
Signed-off-by: Muli Ben-Yehuda <[EMAIL PROTECTED]>
---
qemu/hw/device-hotplug.c | 37 +++++++++++++++++++++++++++++++++++++
qemu/monitor.c | 2 +-
2 files changed, 38 insertions(+), 1 deletions(-)
diff --git a/qemu/hw/device-hotplug.c b/qemu/hw/device-hotplug.c
index 8e2bc35..ba1b161 100644
--- a/qemu/hw/device-hotplug.c
+++ b/qemu/hw/device-hotplug.c
@@ -6,6 +6,8 @@
#include "pc.h"
#include "console.h"
#include "block_int.h"
+#include "device-assignment.h"
+#include "config.h"
#define PCI_BASE_CLASS_STORAGE 0x01
#define PCI_BASE_CLASS_NETWORK 0x02
@@ -27,6 +29,37 @@ static PCIDevice *qemu_system_hot_add_nic(const char *opts,
int bus_nr)
return pci_nic_init (pci_bus, &nd_table[ret], -1);
}
+#ifdef USE_KVM_DEVICE_ASSIGNMENT
+static PCIDevice *qemu_system_hot_assign_device(const char *opts, int bus_nr)
+{
+ PCIBus *pci_bus;
+ AssignedDevInfo *adev;
+ PCIDevice *ret;
+
+ pci_bus = pci_find_bus(bus_nr);
+ if (!pci_bus) {
+ term_printf ("Can't find pci_bus %d\n", bus_nr);
+ return NULL;
+ }
+ adev = add_assigned_device(opts);
+ if (adev == NULL) {
+ term_printf ("Error adding device; check syntax\n");
+ return NULL;
+ }
+
+ ret = init_assigned_device(adev, pci_bus);
+
+ term_printf("Registered host PCI device %02x:%02x.%1x "
+ "(\"%s\") as guest device %02x:%02x.%1x\n",
+ adev->bus, adev->dev, adev->func, adev->name,
+ pci_bus_num(pci_bus), (ret->devfn >> 3) & 0x1f,
+ adev->func);
+
+ return ret;
+}
+
+#endif /* USE_KVM_DEVICE_ASSIGNMENT */
+
static int add_init_drive(const char *opts)
{
int drive_opt_idx, drive_idx;
@@ -143,6 +176,10 @@ void device_hot_add(int pcibus, const char *type, const
char *opts)
dev = qemu_system_hot_add_nic(opts, pcibus);
else if (strcmp(type, "storage") == 0)
dev = qemu_system_hot_add_storage(opts, pcibus);
+#ifdef USE_KVM_DEVICE_ASSIGNMENT
+ else if (strcmp(type, "host") == 0)
+ dev = qemu_system_hot_assign_device(opts, pcibus);
+#endif /* USE_KVM_DEVICE_ASSIGNMENT */
else
term_printf("invalid type: %s\n", type);
diff --git a/qemu/monitor.c b/qemu/monitor.c
index 79b6b4c..d1043b1 100644
--- a/qemu/monitor.c
+++ b/qemu/monitor.c
@@ -1529,7 +1529,7 @@ static const term_cmd_t term_cmds[] = {
"[,cyls=c,heads=h,secs=s[,trans=t]]\n"
"[snapshot=on|off][,cache=on|off]",
"add drive to PCI storage controller"
},
- { "pci_add", "iss", device_hot_add, "bus nic|storage
[[vlan=n][,macaddr=addr][,model=type]] [file=file][,if=type][,bus=nr]...",
"hot-add PCI device" },
+ { "pci_add", "iss", device_hot_add, "bus nic|storage|host
[[vlan=n][,macaddr=addr][,model=type]] [file=file][,if=type][,bus=nr]...
[host=02:00.0[,name=string][,dma=none]" "hot-add PCI device" },
{ "pci_del", "ii", device_hot_remove, "bus slot-number", "hot remove PCI
device" },
#endif
{ "balloon", "i", do_balloon,
--
1.5.6.5
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html