]> git.proxmox.com Git - qemu-server.git/commitdiff
implement virtio iothread hotplug
authorAlexandre Derumier <aderumier@odiso.com>
Thu, 19 Mar 2015 10:06:12 +0000 (11:06 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Fri, 20 Mar 2015 05:18:19 +0000 (06:18 +0100)
Signed-off-by: Alexandre Derumier <aderumier@odiso.com>
PVE/QemuServer.pm

index 2bd9256ecdee738de2a2c9caf173e8e4bb6740e9..39ca21b2e9c930cb52389f636e801b31aeacb9aa 100644 (file)
@@ -3270,6 +3270,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);
 
@@ -3349,7 +3351,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);
@@ -3389,6 +3392,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}) {
+       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}) {
+       my $iothreads = vm_iothreads_list($vmid);
+       qemu_objectdel($vmid, "iothread-$deviceid") if $iothreads->{"iothread-$deviceid"};
+    }
+}
+
 sub qemu_objectadd {
     my($vmid, $objectid, $qomtype) = @_;
 
@@ -4078,6 +4100,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";
                    }
@@ -6191,4 +6214,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;