all lists on lists.proxmox.com
 help / color / mirror / Atom feed
* [BUG] PCIe passthrough devices invisible on q35 with non-sequential hostpci numbering (two related issues)
@ 2026-06-22 14:38 Giray Pultar
  2026-06-23 12:02 ` Dominik Csapak
  0 siblings, 1 reply; 2+ messages in thread
From: Giray Pultar @ 2026-06-22 14:38 UTC (permalink / raw)
  To: pve-devel


Package: pve-manager
Version: 9.2.3
pve-qemu-kvm: 11.0.0-4
proxmox-kernel: 7.0.6-2-pve
Machine type: q35

## Summary

When PCI passthrough devices use non-sequential hostpci numbers (e.g.,
hostpci0,1,2,3,7,9) with pcie=1 on a q35 machine type, the devices at
higher indices become completely invisible to the guest OS. This is caused
by two related issues in qemu-server and proxmox-ve.


## Issue 1: qemu-server places PCIe root ports at invalid addresses

### Steps to Reproduce

1. Create a q35 VM with more than 4 PCIe passthrough devices
2. Use non-sequential hostpci numbering, e.g.:
    hostpci0: mapping=devA,pcie=1
    hostpci1: mapping=devB,pcie=1
    hostpci2: mapping=devC,pcie=1
    hostpci3: mapping=devD,pcie=1
    hostpci7: mapping=devE,pcie=1
    hostpci9: mapping=devF,pcie=1
3. Start the VM
4. Observe that hostpci7 and hostpci9 are invisible in the guest

### Actual Behavior

Only hostpci0-3 appear. The remaining devices get dynamically-created
PCIe root ports at addresses such as:

   pcie-root-port,id=ich9-pcie-port-8,addr=10.3,bus=pcie.0,port=8,chassis=8
  
pcie-root-port,id=ich9-pcie-port-10,addr=10.5,bus=pcie.0,port=10,chassis=10

These map to PCI slot 0x10 (decimal 16), functions 3 and 5. No device
exists at function 0 of this slot. Per the PCI specification, function 0
must be present before the OS will scan higher functions. The guest never
discovers these root ports, and the devices behind them are invisible.

Guest dmesg confirms empty buses:
   pci_bus 0000:07: extended config space not accessible
   pci_bus 0000:08: extended config space not accessible

### Expected Behavior

All PCIe passthrough devices should appear in the guest regardless of
the hostpciN index numbering.

### Suggested Fix

qemu-server's PCI address allocation logic for dynamically-created PCIe
root ports should either:
   - Place each root port at its own slot with function 0, or
   - Create a placeholder function 0 when using multifunction, or
   - Avoid multifunction grouping for root ports without function 0


## Issue 2: proxmox-ve does not keep hostpci numbering sequential

### Problem Description

When a PCI passthrough device is removed from the middle of a sequence,
Proxmox VE does not renumber the remaining devices to fill the gap:

Before removal of devC (hostpci2):
   hostpci0: mapping=devA
   hostpci1: mapping=devB
   hostpci2: mapping=devC
   hostpci3: mapping=devD
   hostpci4: mapping=devE
   hostpci5: mapping=devF

After removal:
   hostpci0: mapping=devA
   hostpci1: mapping=devB
   hostpci3: mapping=devD
   hostpci4: mapping=devE
   hostpci5: mapping=devF

The gap at hostpci2 persists. These gaps directly trigger Issue 1 above.

### Expected Behavior

Proxmox VE should either:
   1. Automatically renumber hostpci devices sequentially (0,1,2,...)
      when a device is removed, or
   2. Provide a CLI/API command to compact/renumber PCI device indices, or
   3. At minimum, warn the user when non-sequential numbering is detected

### Suggested Solution

Renumber hostpci entries automatically when a device is removed via
the GUI or `qm set --delete hostpciN`, preventing gaps from accumulating.

## Workaround (for both issues)

Manually renumber hostpci devices to be sequential (0,1,2,3,4,5)
instead of using non-sequential numbers.


Giray



^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [BUG] PCIe passthrough devices invisible on q35 with non-sequential hostpci numbering (two related issues)
  2026-06-22 14:38 [BUG] PCIe passthrough devices invisible on q35 with non-sequential hostpci numbering (two related issues) Giray Pultar
@ 2026-06-23 12:02 ` Dominik Csapak
  0 siblings, 0 replies; 2+ messages in thread
From: Dominik Csapak @ 2026-06-23 12:02 UTC (permalink / raw)
  To: Giray Pultar, pve-devel

Hi,

first, bugs are usually tracked via our bugtracker
(https://bugzilla.proxmox.com) so I encourage you to open
bugs there, but see my answers to the two points below:

On 6/23/26 12:33 PM, Giray Pultar wrote:
> 
> Package: pve-manager
> Version: 9.2.3
> pve-qemu-kvm: 11.0.0-4
> proxmox-kernel: 7.0.6-2-pve
> Machine type: q35
> 
> ## Summary
> 
> When PCI passthrough devices use non-sequential hostpci numbers (e.g.,
> hostpci0,1,2,3,7,9) with pcie=1 on a q35 machine type, the devices at
> higher indices become completely invisible to the guest OS. This is caused
> by two related issues in qemu-server and proxmox-ve.
> 
> 
> ## Issue 1: qemu-server places PCIe root ports at invalid addresses
> 
> ### Steps to Reproduce
> 
> 1. Create a q35 VM with more than 4 PCIe passthrough devices
> 2. Use non-sequential hostpci numbering, e.g.:
>     hostpci0: mapping=devA,pcie=1
>     hostpci1: mapping=devB,pcie=1
>     hostpci2: mapping=devC,pcie=1
>     hostpci3: mapping=devD,pcie=1
>     hostpci7: mapping=devE,pcie=1
>     hostpci9: mapping=devF,pcie=1
> 3. Start the VM
> 4. Observe that hostpci7 and hostpci9 are invisible in the guest
> 
> ### Actual Behavior
> 
> Only hostpci0-3 appear. The remaining devices get dynamically-created
> PCIe root ports at addresses such as:
> 
>    pcie-root-port,id=ich9-pcie-port-8,addr=10.3,bus=pcie.0,port=8,chassis=8
> 
> pcie-root-port,id=ich9-pcie-port-10,addr=10.5,bus=pcie.0,port=10,chassis=10
> 
> These map to PCI slot 0x10 (decimal 16), functions 3 and 5. No device
> exists at function 0 of this slot. Per the PCI specification, function 0
> must be present before the OS will scan higher functions. The guest never
> discovers these root ports, and the devices behind them are invisible.
> 
> Guest dmesg confirms empty buses:
>    pci_bus 0000:07: extended config space not accessible
>    pci_bus 0000:08: extended config space not accessible
> 
> ### Expected Behavior
> 
> All PCIe passthrough devices should appear in the guest regardless of
> the hostpciN index numbering.
> 
> ### Suggested Fix
> 
> qemu-server's PCI address allocation logic for dynamically-created PCIe
> root ports should either:
>    - Place each root port at its own slot with function 0, or
>    - Create a placeholder function 0 when using multifunction, or
>    - Avoid multifunction grouping for root ports without function 0
> 

I get why this is problematic and this needs to be fixed, probably has
to be gated behind a new machine version, otherwise we could have issues
with live migration/backup-restore/suspend resume (though most of these
are probably irrelevant with pci passthrough enabled)

Reworking the PCI address assignment is already on my todo (for
different reasons though). I didn't have the time yet for that, but I
should pick that up again in the near future.

Please open an issue on our bugtracker for this so we can better track
this and you get a notification if there is any development on that
front.

> 
> ## Issue 2: proxmox-ve does not keep hostpci numbering sequential
> 
> ### Problem Description
> 
> When a PCI passthrough device is removed from the middle of a sequence,
> Proxmox VE does not renumber the remaining devices to fill the gap:
> 
> Before removal of devC (hostpci2):
>    hostpci0: mapping=devA
>    hostpci1: mapping=devB
>    hostpci2: mapping=devC
>    hostpci3: mapping=devD
>    hostpci4: mapping=devE
>    hostpci5: mapping=devF
> 
> After removal:
>    hostpci0: mapping=devA
>    hostpci1: mapping=devB
>    hostpci3: mapping=devD
>    hostpci4: mapping=devE
>    hostpci5: mapping=devF
> 
> The gap at hostpci2 persists. These gaps directly trigger Issue 1 above.
> 
> ### Expected Behavior
> 
> Proxmox VE should either:
>    1. Automatically renumber hostpci devices sequentially (0,1,2,...)
>       when a device is removed, or
>    2. Provide a CLI/API command to compact/renumber PCI device indices, or
>    3. At minimum, warn the user when non-sequential numbering is detected
> 
> ### Suggested Solution
> 
> Renumber hostpci entries automatically when a device is removed via
> the GUI or `qm set --delete hostpciN`, preventing gaps from accumulating.

I don't think this is a good idea. Each config entry (including numbered
ones) should stand on their own. Since we have to 'statically' assign
the addresses (for live-migration, etc) we can't renumber them
automatically, otherwise the guest could get confused (since the
layout inside would change)

If we fix the issue1, this should not be a problem anymore and we
don't have to do any renumbering here..

> 
> ## Workaround (for both issues)
> 
> Manually renumber hostpci devices to be sequential (0,1,2,3,4,5)
> instead of using non-sequential numbers.
> 
> 
> Giray
> 
> 
> 


thanks for the report
best regards
Dominik




^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-06-23 12:03 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-22 14:38 [BUG] PCIe passthrough devices invisible on q35 with non-sequential hostpci numbering (two related issues) Giray Pultar
2026-06-23 12:02 ` Dominik Csapak

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.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal