Quoting Fabian Grünbichler from the bug report:

> Intel ships some CPUs where the CPU address width and the IOMMU
> address width are different, which requires setting that option to
> properly support huge pages and/or VFIO:
>
> https://bugzilla.kernel.org/show_bug.cgi?id=220057
> https://lore.kernel.org/all/20250502224035.3183451-1-alex.william...@redhat.com/t
> https://lore.kernel.org/qemu-devel/20250130134346.1754143-1-...@redhat.com/

This likely also gives users a way forward with a regression reported
in the community forum:
https://forum.proxmox.com/threads/169586/

Signed-off-by: Fiona Ebner <f.eb...@proxmox.com>
---
 src/PVE/QemuServer/CPUConfig.pm               | 31 +++++++++++++------
 .../q35-viommu-intel-guest-phys-bits.conf     |  2 ++
 .../q35-viommu-intel-guest-phys-bits.conf.cmd | 25 +++++++++++++++
 3 files changed, 48 insertions(+), 10 deletions(-)
 create mode 100644 src/test/cfg2cmd/q35-viommu-intel-guest-phys-bits.conf
 create mode 100644 src/test/cfg2cmd/q35-viommu-intel-guest-phys-bits.conf.cmd

diff --git a/src/PVE/QemuServer/CPUConfig.pm b/src/PVE/QemuServer/CPUConfig.pm
index 1c7c12fc..786a99d8 100644
--- a/src/PVE/QemuServer/CPUConfig.pm
+++ b/src/PVE/QemuServer/CPUConfig.pm
@@ -223,6 +223,13 @@ my $cpu_fmt = {
         pattern => qr/$cpu_flag_any_re(;$cpu_flag_any_re)*/,
         optional => 1,
     },
+    'guest-phys-bits' => {
+        type => 'integer',
+        minimum => 32, # see target/i386/cpu.c in QEMU
+        maximum => 64,
+        description => "Number of physical address bits available to the 
guest.",
+        optional => 1,
+    },
     'phys-bits' => {
         type => 'string',
         format => 'pve-phys-bits',
@@ -680,18 +687,22 @@ sub get_cpu_options {
         $pve_forced_flags,
     );
 
-    my $phys_bits = '';
-    foreach my $conf ($custom_cpu, $cpu) {
-        next if !defined($conf);
-        my $conf_val = $conf->{'phys-bits'};
-        next if !$conf_val;
-        if ($conf_val eq 'host') {
-            $phys_bits = ",host-phys-bits=true";
-        } else {
-            $phys_bits = ",phys-bits=$conf_val";
+    for my $phys_bits_opt (qw(guest-phys-bits phys-bits)) {
+        my $phys_bits = '';
+        foreach my $conf ($custom_cpu, $cpu) {
+            next if !defined($conf);
+            my $conf_val = $conf->{$phys_bits_opt};
+            next if !$conf_val;
+            if ($conf_val eq 'host') {
+                die "unexpected value 'host' for guest-phys-bits"
+                    if $phys_bits_opt eq 'guest-phys-bits';
+                $phys_bits = ",host-phys-bits=true";
+            } else {
+                $phys_bits = ",${phys_bits_opt}=${conf_val}";
+            }
         }
+        $cpu_str .= $phys_bits;
     }
-    $cpu_str .= $phys_bits;
 
     return ('-cpu', $cpu_str);
 }
diff --git a/src/test/cfg2cmd/q35-viommu-intel-guest-phys-bits.conf 
b/src/test/cfg2cmd/q35-viommu-intel-guest-phys-bits.conf
new file mode 100644
index 00000000..7decb63e
--- /dev/null
+++ b/src/test/cfg2cmd/q35-viommu-intel-guest-phys-bits.conf
@@ -0,0 +1,2 @@
+machine: q35,viommu=intel
+cpu: host,guest-phys-bits=39
diff --git a/src/test/cfg2cmd/q35-viommu-intel-guest-phys-bits.conf.cmd 
b/src/test/cfg2cmd/q35-viommu-intel-guest-phys-bits.conf.cmd
new file mode 100644
index 00000000..b24baeb0
--- /dev/null
+++ b/src/test/cfg2cmd/q35-viommu-intel-guest-phys-bits.conf.cmd
@@ -0,0 +1,25 @@
+/usr/bin/kvm \
+  -id 8006 \
+  -name 'vm8006,debug-threads=on' \
+  -no-shutdown \
+  -chardev 
'socket,id=qmp,path=/var/run/qemu-server/8006.qmp,server=on,wait=off' \
+  -mon 'chardev=qmp,mode=control' \
+  -chardev 'socket,id=qmp-event,path=/var/run/qmeventd.sock,reconnect-ms=5000' 
\
+  -mon 'chardev=qmp-event,mode=control' \
+  -pidfile /var/run/qemu-server/8006.pid \
+  -daemonize \
+  -smp '1,sockets=1,cores=1,maxcpus=1' \
+  -nodefaults \
+  -boot 
'menu=on,strict=on,reboot-timeout=1000,splash=/usr/share/qemu-server/bootsplash.jpg'
 \
+  -vnc 'unix:/var/run/qemu-server/8006.vnc,password=on' \
+  -cpu 'host,+kvm_pv_eoi,+kvm_pv_unhalt,guest-phys-bits=39' \
+  -m 512 \
+  -global 'ICH9-LPC.disable_s3=1' \
+  -global 'ICH9-LPC.disable_s4=1' \
+  -device 'intel-iommu,intremap=on,caching-mode=on' \
+  -readconfig /usr/share/qemu-server/pve-q35-4.0.cfg \
+  -device 'usb-tablet,id=tablet,bus=ehci.0,port=1' \
+  -device 'VGA,id=vga,bus=pcie.0,addr=0x1' \
+  -device 
'virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3,free-page-reporting=on' \
+  -iscsi 'initiator-name=iqn.1993-08.org.debian:01:aabbccddeeff' \
+  -machine 'type=q35+pve0,kernel-irqchip=split'
-- 
2.47.2



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to