From: Alexandre Derumier via pve-devel <pve-devel@lists.proxmox.com>
To: pve-devel@lists.proxmox.com
Cc: Alexandre Derumier <alexandre.derumier@groupe-cyllene.com>
Subject: [pve-devel] [PATCH qemuserver 2/3] add print_drivedevice_controller && print_drivedevice_iothread
Date: Fri, 27 Jun 2025 12:02:41 +0200 [thread overview]
Message-ID: <mailman.673.1751018572.395.pve-devel@lists.proxmox.com> (raw)
In-Reply-To: <20250627100242.1478523-1-alexandre.derumier@groupe-cyllene.com>
[-- Attachment #1: Type: message/rfc822, Size: 10158 bytes --]
From: Alexandre Derumier <alexandre.derumier@groupe-cyllene.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH qemuserver 2/3] add print_drivedevice_controller && print_drivedevice_iothread
Date: Fri, 27 Jun 2025 12:02:41 +0200
Message-ID: <20250627100242.1478523-3-alexandre.derumier@groupe-cyllene.com>
Signed-off-by: Alexandre Derumier <alexandre.derumier@groupe-cyllene.com>
---
src/PVE/QemuServer.pm | 60 +++-----------------------
src/PVE/QemuServer/DriveDevice.pm | 70 +++++++++++++++++++++++++++++++
2 files changed, 76 insertions(+), 54 deletions(-)
diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm
index f6f8cc58..dca206b4 100644
--- a/src/PVE/QemuServer.pm
+++ b/src/PVE/QemuServer.pm
@@ -72,7 +72,7 @@ use PVE::QemuServer::Drive qw(
print_drive
storage_allows_io_uring_default
);
-use PVE::QemuServer::DriveDevice qw(print_drivedevice_full scsihw_infos);
+use PVE::QemuServer::DriveDevice qw(print_drivedevice_controller print_drivedevice_full print_drivedevice_iothread scsihw_infos);
use PVE::QemuServer::Machine;
use PVE::QemuServer::Memory qw(get_current_memory);
use PVE::QemuServer::MetaInfo;
@@ -3442,8 +3442,7 @@ sub config_to_command {
push @$devices, '-watchdog-action', $wdopts->{action} if $wdopts->{action};
}
- my $scsicontroller = {};
- my $ahcicontroller = {};
+ my $used_controller = {};
my $scsihw = defined($conf->{scsihw}) ? $conf->{scsihw} : $defaults->{scsihw};
# Add iscsi initiator name if available
@@ -3465,58 +3464,11 @@ sub config_to_command {
$drive->{bootindex} = $bootorder->{$ds} if $bootorder->{$ds};
- if ($drive->{interface} eq 'virtio') {
- push @$cmd, '-object', "iothread,id=iothread-$ds" if $drive->{iothread};
- }
-
- if ($drive->{interface} eq 'scsi') {
-
- my ($maxdev, $controller, $controller_prefix) = scsihw_infos($conf, $drive);
-
- die
- "scsi$drive->{index}: machine version 4.1~pve2 or higher is required to use more than 14 SCSI disks\n"
- if $drive->{index} > 13 && !&$version_guard(4, 1, 2);
-
- my $pciaddr = print_pci_addr("$controller_prefix$controller", $bridges, $arch);
- my $scsihw_type =
- $scsihw =~ m/^virtio-scsi-single/ ? "virtio-scsi-pci" : $scsihw;
-
- my $iothread = '';
- if (
- $conf->{scsihw}
- && $conf->{scsihw} eq "virtio-scsi-single"
- && $drive->{iothread}
- ) {
- $iothread .= ",iothread=iothread-$controller_prefix$controller";
- push @$cmd, '-object', "iothread,id=iothread-$controller_prefix$controller";
- } elsif ($drive->{iothread}) {
- log_warn(
- "iothread is only valid with virtio disk or virtio-scsi-single controller, ignoring\n"
- );
- }
-
- my $queues = '';
- if (
- $conf->{scsihw}
- && $conf->{scsihw} eq "virtio-scsi-single"
- && $drive->{queues}
- ) {
- $queues = ",num_queues=$drive->{queues}";
- }
+ my $iothread = print_drivedevice_iothread($conf, $drive);
+ push @$cmd, '-object', $iothread if $iothread;
- push @$devices, '-device',
- "$scsihw_type,id=$controller_prefix$controller$pciaddr$iothread$queues"
- if !$scsicontroller->{$controller};
- $scsicontroller->{$controller} = 1;
- }
-
- if ($drive->{interface} eq 'sata') {
- my $controller = int($drive->{index} / $PVE::QemuServer::Drive::MAX_SATA_DISKS);
- my $pciaddr = print_pci_addr("ahci$controller", $bridges, $arch);
- push @$devices, '-device', "ahci,id=ahci$controller,multifunction=on$pciaddr"
- if !$ahcicontroller->{$controller};
- $ahcicontroller->{$controller} = 1;
- }
+ my $controller = print_drivedevice_controller($conf, $drive, $iothread, $scsihw, $arch, $bridges, $used_controller);
+ push @$devices, '-device', $controller if $controller;
my $live_restore = $live_restore_backing->{$ds};
my $live_blockdev_name = undef;
diff --git a/src/PVE/QemuServer/DriveDevice.pm b/src/PVE/QemuServer/DriveDevice.pm
index 764afc93..1e875cb9 100644
--- a/src/PVE/QemuServer/DriveDevice.pm
+++ b/src/PVE/QemuServer/DriveDevice.pm
@@ -14,6 +14,8 @@ use base qw(Exporter);
our @EXPORT_OK = qw(
print_drivedevice_full
+ print_drivedevice_controller
+ print_drivedevice_iothread
scsihw_infos
);
@@ -160,4 +162,72 @@ sub print_drivedevice_full {
return $device;
}
+sub print_drivedevice_controller {
+ my ($conf, $drive, $iothread_enabled, $scsihw, $arch, $bridges, $used_controller) = @_;
+
+ if ($drive->{interface} eq 'scsi') {
+
+ my ($maxdev, $controller, $controller_prefix) = scsihw_infos($conf, $drive);
+ return if $used_controller->{scsi}->{$controller};
+
+ my $pciaddr = print_pci_addr("$controller_prefix$controller", $bridges, $arch);
+ my $scsihw_type =
+ $scsihw =~ m/^virtio-scsi-single/ ? "virtio-scsi-pci" : $scsihw;
+
+
+ my $iothread = $iothread_enabled ? ",iothread=iothread-$controller_prefix$controller" : "";
+
+ my $queues = '';
+ if (
+ $conf->{scsihw}
+ && $conf->{scsihw} eq "virtio-scsi-single"
+ && $drive->{queues}
+ ) {
+ $queues = ",num_queues=$drive->{queues}";
+ }
+
+
+ $used_controller->{scsi}->{$controller} = 1;
+ return "$scsihw_type,id=$controller_prefix$controller$pciaddr$iothread$queues";
+ }
+
+ if ($drive->{interface} eq 'sata') {
+ my $controller = int($drive->{index} / $PVE::QemuServer::Drive::MAX_SATA_DISKS);
+ return if $used_controller->{ahci}->{$controller};
+
+ my $pciaddr = print_pci_addr("ahci$controller", $bridges, $arch);
+
+ $used_controller->{ahci}->{$controller} = 1;
+ return "ahci,id=ahci$controller,multifunction=on$pciaddr";
+
+ }
+}
+
+sub print_drivedevice_iothread {
+ my ($conf, $drive) = @_;
+
+ my $drive_id = PVE::QemuServer::Drive::get_drive_id($drive);
+
+ if ($drive->{interface} eq 'virtio') {
+ return "iothread,id=iothread-$drive_id" if $drive->{iothread};
+ }
+
+ if ($drive->{interface} eq 'scsi') {
+
+ my ($maxdev, $controller, $controller_prefix) = scsihw_infos($conf, $drive);
+
+ if (
+ $conf->{scsihw}
+ && $conf->{scsihw} eq "virtio-scsi-single"
+ && $drive->{iothread}
+ ) {
+ return "iothread,id=iothread-$controller_prefix$controller";
+ } elsif ($drive->{iothread}) {
+ log_warn(
+ "iothread is only valid with virtio disk or virtio-scsi-single controller, ignoring\n"
+ );
+ }
+ }
+}
+
1;
--
2.39.5
[-- Attachment #2: Type: text/plain, Size: 160 bytes --]
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
next prev parent reply other threads:[~2025-06-27 10:02 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20250627100242.1478523-1-alexandre.derumier@groupe-cyllene.com>
2025-06-27 10:02 ` [pve-devel] [PATCH qemuserver 1/3] introduce DriveDevice module Alexandre Derumier via pve-devel
2025-06-27 10:02 ` Alexandre Derumier via pve-devel [this message]
2025-06-27 10:02 ` [pve-devel] [PATCH qemuserver 3/3] hotplug: drive controller : use print_drivedevice_iothread && print_drivedevice_controller Alexandre Derumier via pve-devel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=mailman.673.1751018572.395.pve-devel@lists.proxmox.com \
--to=pve-devel@lists.proxmox.com \
--cc=alexandre.derumier@groupe-cyllene.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.