[PATCH qemu-server 10/13] blockdev: change aio on target if io_uring is not default.

Alexandre Derumier alexandre.derumier at groupe-cyllene.com
Tue Jun 3 09:55:55 CEST 2025


This was a limitation of drive-mirror, blockdev mirror is able
to reopen image with a different aio.

Do the change when generating the blockdev_format

Signed-off-by: Alexandre Derumier <alexandre.derumier at groupe-cyllene.com>
---
 PVE/QemuServer.pm          | 9 ++++++---
 PVE/QemuServer/Blockdev.pm | 3 +++
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index f68c5bf2..534aa2df 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -8228,8 +8228,6 @@ sub qemu_blockdev_mirror {
     my $dst_drive = dclone($drive);
     $dst_drive->{file} = $dst_volid;
     $dst_drive->{zeroinit} = 1 if $is_zero_initialized;
-    #improve: if target storage don't support aio uring,change it to default native
-    #and remove clone_disk_check_io_uring()
 
     #add new block device
     my $target_drive_blockdev = generate_drive_blockdev($storecfg, $dst_drive);
@@ -8621,7 +8619,12 @@ sub clone_disk {
 	    $dst_format = 'raw';
 	    $size = PVE::QemuServer::Drive::TPMSTATE_DISK_SIZE;
 	} else {
-	    clone_disk_check_io_uring($drive, $storecfg, $src_storeid, $storeid, $use_drive_mirror);
+
+	    my $machine_type = PVE::QemuServer::Machine::get_current_qemu_machine($vmid);
+	    # blockdev can reopen with a different aio
+	    if (!PVE::QemuServer::Machine::is_machine_version_at_least($machine_type, 10, 0)) {
+		clone_disk_check_io_uring($drive, $storecfg, $src_storeid, $storeid, $use_drive_mirror);
+	    }
 
 	    $size = PVE::Storage::volume_size_info($storecfg, $drive->{file}, 10);
 	}
diff --git a/PVE/QemuServer/Blockdev.pm b/PVE/QemuServer/Blockdev.pm
index 01fef66d..60a996f3 100644
--- a/PVE/QemuServer/Blockdev.pm
+++ b/PVE/QemuServer/Blockdev.pm
@@ -68,6 +68,9 @@ sub generate_blockdev_drive_aio {
 		$aio = "threads";
 	    }
 	}
+    } elsif ($drive->{aio} eq 'io_uring' && !storage_allows_io_uring_default($scfg, $cache_direct)) {
+	#change aio if io_uring is not supported by storage
+	$aio = $cache_direct ? 'native' : 'threads';
     }
     return $aio;
 }
-- 
2.39.5




More information about the pve-devel mailing list