[pve-devel] [PATCH 2/2] implement virtio iothread hotplug
Alexandre Derumier
aderumier at odiso.com
Fri Feb 13 13:44:20 CET 2015
Signed-off-by: Alexandre Derumier <aderumier at odiso.com>
---
PVE/QemuServer.pm | 38 +++++++++++++++++++++++++++++++++++++-
1 file changed, 37 insertions(+), 1 deletion(-)
diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index a811064..ae08f25 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -3254,6 +3254,8 @@ sub vm_deviceplug {
} elsif ($deviceid =~ m/^(virtio)(\d+)$/) {
+ qemu_iothread_add($vmid, $deviceid, $device);
+
qemu_driveadd($storecfg, $vmid, $device);
my $devicefull = print_drivedevice_full($storecfg, $conf, $vmid, $device);
@@ -3333,7 +3335,8 @@ sub vm_deviceunplug {
qemu_devicedel($vmid, $deviceid);
qemu_devicedelverify($vmid, $deviceid);
qemu_drivedel($vmid, $deviceid);
-
+ qemu_iothread_del($conf, $vmid, $deviceid);
+
} elsif ($deviceid =~ m/^(scsihw)(\d+)$/) {
qemu_devicedel($vmid, $deviceid);
@@ -3373,6 +3376,25 @@ sub qemu_devicedel {
my $ret = vm_mon_cmd($vmid, "device_del", id => $deviceid);
}
+sub qemu_iothread_add {
+ my($vmid, $deviceid, $device) = @_;
+
+ if($device->{iothread} && $device->{iothread} eq 'yes') {
+ my $iothreads = vm_iothreads_list($vmid);
+ qemu_objectadd($vmid, "iothread-$deviceid", "iothread") if !$iothreads->{"iothread-$deviceid"};
+ }
+}
+
+sub qemu_iothread_del {
+ my($conf, $vmid, $deviceid) = @_;
+
+ my $device = parse_drive($deviceid, $conf->{$deviceid});
+ if($device->{iothread} && $device->{iothread} eq 'yes') {
+ my $iothreads = vm_iothreads_list($vmid);
+ qemu_objectdel($vmid, "iothread-$deviceid") if $iothreads->{"iothread-$deviceid"};
+ }
+}
+
sub qemu_objectadd {
my($vmid, $objectid, $qomtype) = @_;
@@ -4060,6 +4082,7 @@ sub vmconfig_update_disk {
# skip non hotpluggable value
if (&$safe_num_ne($drive->{discard}, $old_drive->{discard}) ||
+ &$safe_string_ne($drive->{iothread}, $old_drive->{iothread}) ||
&$safe_string_ne($drive->{cache}, $old_drive->{cache})) {
die "skip\n";
}
@@ -6147,4 +6170,17 @@ sub lspci {
return $devices;
}
+sub vm_iothreads_list {
+ my ($vmid) = @_;
+
+ my $res = vm_mon_cmd($vmid, 'query-iothreads');
+
+ my $iothreads = {};
+ foreach my $iothread (@$res) {
+ $iothreads->{ $iothread->{id} } = $iothread->{"thread-id"};
+ }
+
+ return $iothreads;
+}
+
1;
--
1.7.10.4
More information about the pve-devel
mailing list