Skip to content

feat(ixgbe): add network driver for the Intel X550 - #2612

Open
stlankes wants to merge 4 commits into
mainfrom
ixgbe
Open

feat(ixgbe): add network driver for the Intel X550#2612
stlankes wants to merge 4 commits into
mainfrom
ixgbe

Conversation

@stlankes

@stlankes stlankes commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

The initialization sequence follows the ixy.rs user space driver and the X550 datasheet. The driver operates a single receive and transmit queue.

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.

@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: 6bdc928 Previous: 2e23902 Performance Ratio
startup_benchmark Build Time 82.00 s 80.34 s 1.02
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.79 s (±0.02 s) 0.74 s (±0.02 s) 1.07
Startup Time - 4 cores 0.77 s (±0.02 s) 0.74 s (±0.02 s) 1.04
multithreaded_benchmark Build Time 83.99 s 82.11 s 1.02
multithreaded_benchmark File Size 0.88 MB 0.86 MB 1.02
Multithreaded Pi Efficiency - 2 Threads 82.82 % (±7.61 %) 85.89 % (±6.61 %) 0.96
Multithreaded Pi Efficiency - 4 Threads 41.80 % (±3.27 %) 43.43 % (±2.56 %) 0.96
Multithreaded Pi Efficiency - 8 Threads 24.36 % (±1.67 %) 25.76 % (±1.53 %) 0.95
micro_benchmarks Build Time 83.30 s 80.40 s 1.04
micro_benchmarks File Size 0.88 MB 0.86 MB 1.02
Scheduling time - 1 thread 65.34 ticks (±3.12 ticks) 62.65 ticks (±4.06 ticks) 1.04
Scheduling time - 2 threads 36.50 ticks (±4.46 ticks) 34.08 ticks (±4.10 ticks) 1.07
Micro - Time for syscall (getpid) 4.59 ticks (±0.79 ticks) 3.45 ticks (±0.58 ticks) 1.33
Memcpy speed - (built_in) block size 4096 82934.28 MByte/s (±57293.20 MByte/s) 82448.38 MByte/s (±56997.13 MByte/s) 1.01
Memcpy speed - (built_in) block size 1048576 30283.60 MByte/s (±24429.94 MByte/s) 30585.98 MByte/s (±24707.84 MByte/s) 0.99
Memcpy speed - (built_in) block size 16777216 27117.81 MByte/s (±22407.18 MByte/s) 26340.06 MByte/s (±21720.96 MByte/s) 1.03
Memset speed - (built_in) block size 4096 83321.19 MByte/s (±57554.04 MByte/s) 82292.76 MByte/s (±56891.50 MByte/s) 1.01
Memset speed - (built_in) block size 1048576 30980.06 MByte/s (±24852.16 MByte/s) 31323.85 MByte/s (±25145.86 MByte/s) 0.99
Memset speed - (built_in) block size 16777216 27890.83 MByte/s (±22889.81 MByte/s) 27104.68 MByte/s (±22209.94 MByte/s) 1.03
Memcpy speed - (rust) block size 4096 76226.44 MByte/s (±52907.32 MByte/s) 74097.96 MByte/s (±51811.44 MByte/s) 1.03
Memcpy speed - (rust) block size 1048576 30287.69 MByte/s (±24527.98 MByte/s) 30361.60 MByte/s (±24602.37 MByte/s) 1.00
Memcpy speed - (rust) block size 16777216 26737.86 MByte/s (±22175.56 MByte/s) 27625.34 MByte/s (±22806.88 MByte/s) 0.97
Memset speed - (rust) block size 4096 76735.85 MByte/s (±53273.78 MByte/s) 74373.47 MByte/s (±51976.48 MByte/s) 1.03
Memset speed - (rust) block size 1048576 31024.39 MByte/s (±24953.38 MByte/s) 31110.89 MByte/s (±25033.24 MByte/s) 1.00
Memset speed - (rust) block size 16777216 27504.63 MByte/s (±22657.11 MByte/s) 28386.93 MByte/s (±23265.03 MByte/s) 0.97
alloc_benchmarks Build Time 76.92 s 74.76 s 1.03
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 2525.89 Ticks (±778.41 Ticks) 5860.58 Ticks (±98.43 Ticks) 0.43
Allocations - Average Allocation time (no fail) 3560.40 Ticks (±673.34 Ticks) 6554.81 Ticks (±92.86 Ticks) 0.54
Allocations - Average Deallocation time 683.68 Ticks (±99.02 Ticks) 1805.01 Ticks (±250.35 Ticks) 0.38
mutex_benchmark Build Time 81.21 s 79.82 s 1.02
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
Mutex Stress Test Average Time per Iteration - 2 Threads 40.50 ns (±1.96 ns) 40.26 ns (±1.68 ns) 1.01

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

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.
The initialization sequence follows the ixy.rs user space driver and the
X550 datasheet. The driver operates a single receive and transmit queue.

It prefers MSI-X over the legacy interrupt, because a hypervisor is not
obliged to offer one for a passed-through device and QEMU in fact does
not, which leaves MSI-X as the only way to receive interrupts at all.
Should neither be available, the device still makes progress when the
kernel is built with the idle-poll feature. This makes the msix module
available outside of virtio.
The initialization sequence follows the ixy.rs user space driver and the
X550 datasheet. The driver operates a single receive and transmit queue.

It prefers MSI-X over the legacy interrupt, because a hypervisor is not
obliged to offer one for a passed-through device and QEMU in fact does
not, which leaves MSI-X as the only way to receive interrupts at all.
Should neither be available, the device still makes progress when the
kernel is built with the idle-poll feature. This makes the msix module
available outside of virtio.
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