[PATCH 6/6] device assignment: support for hot-plugging PCI devices
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
[PATCH 6/6] device assignment: support for hot-plugging PCI devices
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
[PATCH 6/6] device assignment: support for hot-plugging PCI devices
From: Amit Shah [EMAIL PROTECTED] This patch adds support for hot-plugging host PCI devices into guests Signed-off-by: Amit Shah [EMAIL PROTECTED] Signed-off-by: Muli Ben-Yehuda [EMAIL PROTECTED] --- qemu/hw/device-hotplug.c | 21 + qemu/monitor.c |2 +- 2 files changed, 22 insertions(+), 1 deletions(-) diff --git a/qemu/hw/device-hotplug.c b/qemu/hw/device-hotplug.c index 8e2bc35..817e708 100644 --- a/qemu/hw/device-hotplug.c +++ b/qemu/hw/device-hotplug.c @@ -6,6 +6,7 @@ #include pc.h #include console.h #include block_int.h +#include device-assignment.h #define PCI_BASE_CLASS_STORAGE 0x01 #define PCI_BASE_CLASS_NETWORK 0x02 @@ -27,6 +28,24 @@ static PCIDevice *qemu_system_hot_add_nic(const char *opts, int bus_nr) return pci_nic_init (pci_bus, nd_table[ret], -1); } +static PCIDevice *qemu_system_hot_assign_device(const char *opts, int bus_nr) +{ +PCIBus *pci_bus; +AssignedDevInfo *adev; + +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; +} +return init_assigned_device(adev, pci_bus); +} + static int add_init_drive(const char *opts) { int drive_opt_idx, drive_idx; @@ -143,6 +162,8 @@ 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); +else if (strcmp(type, host) == 0) +dev = qemu_system_hot_assign_device(opts, pcibus); 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