Skip to content

fix(pci): disable decoding while sizing BARs - #2609

Open
stlankes wants to merge 2 commits into
hermit-os:mainfrom
stlankes:pci
Open

fix(pci): disable decoding while sizing BARs#2609
stlankes wants to merge 2 commits into
hermit-os:mainfrom
stlankes:pci

Conversation

@stlankes

@stlankes stlankes commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Determining the size of a BAR writes all-ones into it and restores the previous value afterwards. While decoding is enabled, the device decodes those intermediate values as real addresses and relocates itself. For a passed-through device the host follows that relocation and tries to map the BAR outside of the guest, which aborts the VM:

kvm_set_user_memory_region: KVM_SET_USER_MEMORY_REGION failed,
slot=5, start=0xfffffffffe000000, size=0x400000: Invalid argument

Disable decoding around the probe, as the PCI specification requires, and route the informational bus dump through get_bar so that it is covered as well.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark Results

Details
Benchmark Current: 3431433 Previous: 2e23902 Performance Ratio
startup_benchmark Build Time 79.65 s 80.34 s 0.99
startup_benchmark File Size 0.76 MB 0.80 MB 0.96
Startup Time - 1 core 0.77 s (±0.03 s) 0.75 s (±0.02 s) 1.03
Startup Time - 2 cores 0.76 s (±0.03 s) 0.74 s (±0.02 s) 1.04
Startup Time - 4 cores 0.77 s (±0.02 s) 0.74 s (±0.02 s) 1.03
multithreaded_benchmark Build Time 81.37 s 82.11 s 0.99
multithreaded_benchmark File Size 0.88 MB 0.86 MB 1.02
Multithreaded Pi Efficiency - 2 Threads 86.35 % (±6.66 %) 85.89 % (±6.61 %) 1.01
Multithreaded Pi Efficiency - 4 Threads 42.31 % (±2.96 %) 43.43 % (±2.56 %) 0.97
Multithreaded Pi Efficiency - 8 Threads 25.03 % (±1.26 %) 25.76 % (±1.53 %) 0.97
micro_benchmarks Build Time 77.18 s 80.40 s 0.96
micro_benchmarks File Size 0.88 MB 0.86 MB 1.02
Scheduling time - 1 thread 63.46 ticks (±2.15 ticks) 62.65 ticks (±4.06 ticks) 1.01
Scheduling time - 2 threads 34.06 ticks (±3.01 ticks) 34.08 ticks (±4.10 ticks) 1.00
Micro - Time for syscall (getpid) 4.26 ticks (±0.68 ticks) 3.45 ticks (±0.58 ticks) 1.23
Memcpy speed - (built_in) block size 4096 82787.16 MByte/s (±57393.30 MByte/s) 82448.38 MByte/s (±56997.13 MByte/s) 1.00
Memcpy speed - (built_in) block size 1048576 30541.03 MByte/s (±24585.39 MByte/s) 30585.98 MByte/s (±24707.84 MByte/s) 1.00
Memcpy speed - (built_in) block size 16777216 29202.03 MByte/s (±24025.37 MByte/s) 26340.06 MByte/s (±21720.96 MByte/s) 1.11
Memset speed - (built_in) block size 4096 83099.66 MByte/s (±57608.79 MByte/s) 82292.76 MByte/s (±56891.50 MByte/s) 1.01
Memset speed - (built_in) block size 1048576 31262.48 MByte/s (±25011.06 MByte/s) 31323.85 MByte/s (±25145.86 MByte/s) 1.00
Memset speed - (built_in) block size 16777216 29980.66 MByte/s (±24480.94 MByte/s) 27104.68 MByte/s (±22209.94 MByte/s) 1.11
Memcpy speed - (rust) block size 4096 72916.78 MByte/s (±50985.04 MByte/s) 74097.96 MByte/s (±51811.44 MByte/s) 0.98
Memcpy speed - (rust) block size 1048576 30389.03 MByte/s (±24568.10 MByte/s) 30361.60 MByte/s (±24602.37 MByte/s) 1.00
Memcpy speed - (rust) block size 16777216 29434.68 MByte/s (±24224.32 MByte/s) 27625.34 MByte/s (±22806.88 MByte/s) 1.07
Memset speed - (rust) block size 4096 73380.01 MByte/s (±51330.57 MByte/s) 74373.47 MByte/s (±51976.48 MByte/s) 0.99
Memset speed - (rust) block size 1048576 31092.48 MByte/s (±25001.55 MByte/s) 31110.89 MByte/s (±25033.24 MByte/s) 1.00
Memset speed - (rust) block size 16777216 30192.72 MByte/s (±24658.07 MByte/s) 28386.93 MByte/s (±23265.03 MByte/s) 1.06
alloc_benchmarks Build Time 76.38 s 74.76 s 1.02
alloc_benchmarks File Size 0.84 MB 0.87 MB 0.96
Allocations - Allocation success 91.34 % 91.31 % 1.00
Allocations - Deallocation success 100.00 % 100.00 % 1
Allocations - Pre-fail Allocations 61.54 % 61.44 % 1.00
Allocations - Average Allocation time 2575.91 Ticks (±782.08 Ticks) 5860.58 Ticks (±98.43 Ticks) 0.44
Allocations - Average Allocation time (no fail) 3603.51 Ticks (±668.32 Ticks) 6554.81 Ticks (±92.86 Ticks) 0.55
Allocations - Average Deallocation time 714.50 Ticks (±213.43 Ticks) 1805.01 Ticks (±250.35 Ticks) 0.40
mutex_benchmark Build Time 80.73 s 79.82 s 1.01
mutex_benchmark File Size 0.88 MB 0.86 MB 1.02
Mutex Stress Test Average Time per Iteration - 1 Threads 12.10 ns (±0.30 ns) 12.10 ns (±0.41 ns) 1.00
Mutex Stress Test Average Time per Iteration - 2 Threads 39.80 ns (±2.42 ns) 40.26 ns (±1.68 ns) 0.99

This comment was automatically generated by workflow using github-action-benchmark.

@mkroening mkroening self-assigned this Aug 6, 2026
@stlankes stlankes closed this Aug 6, 2026
@stlankes stlankes reopened this Aug 6, 2026
A legacy PCI interrupt is signalled level triggered and active low,
while the IOAPIC defaults to the edge triggered, active high behavior of
the ISA interrupts. A passed-through device therefore stops delivering
interrupts after its first one, because the host only unmasks it once
the guest has completed a level triggered interrupt.

Correct the redirection entry where a legacy interrupt line is handed
out.
Comment thread src/drivers/pci.rs Outdated
Determining the size of a BAR writes all-ones into it and restores the
previous value afterwards. While decoding is enabled, the device decodes
those intermediate values as real addresses and relocates itself. For a
passed-through device the host follows that relocation and tries to map
the BAR outside of the guest, which aborts the VM:

    kvm_set_user_memory_region: KVM_SET_USER_MEMORY_REGION failed,
    slot=5, start=0xfffffffffe000000, size=0x400000: Invalid argument

Disable decoding around the probe, as the PCI specification requires,
and route the informational bus dump through get_bar so that it is
covered as well.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants