Hi Jan,

I captured the ixl(4) TX queue stall while it was happening
on OpenBSD 7.9/amd64 GENERIC.MP.

1. Hardware and configuration
=============================

Intel XXV710 SFP28 dual-port adapter:
- ixl0: port 0, FW 9.856.79020, API 1.15, 8 queues
- ixl1: port 1, FW 9.856.79020, API 1.15, 8 queues

Both ports were active at 25GbaseCR full-duplex, MTU 9000,
as members of aggr2 (LACP).

Production traffic uses VLANs, CARP and PF forwarding.
There is no bridge configuration.

This setup worked on OpenBSD 7.7. OpenBSD 7.8 was not tested.

2. Reproduction and chronology
==============================

Synthetic iperf3 tests using TCP, UDP, different transfer
sizes, parallel streams and bidirectional traffic did not
reproduce the problem.

The iperf3 tests were performed with the same underlying
network configuration, but not all production VLANs
were present at that point.

After stopping iperf3, I switched the affected router
to CARP BACKUP, restored all production VLANs, and
rebooted it.

I then switched the router to CARP MASTER. Within a
few minutes, the TX queue stall reappeared under normal
production traffic, without iperf3 running.

I captured diagnostics at approximately 09:43:43 and
09:43:53 CEST on October 9, 2026.

I then moved production traffic back to the other firewall.
The affected router has remained CARP BACKUP since then.

I did not attempt another production failover because
the problem was clearly affecting traffic.

3. Main finding: ixl1 TX queue 4
================================

>From the two full kstat ixl1::: captures:

                         t0             t+10s          delta
packets                  1702287        1702302         +15
bytes                    1998230281     1998231331      +1050
qdrops                   34112          35509           +1397
qlen                     1024           1024            unchanged
maxqlen                  1024           1024            unchanged
oactive                  true           true
oactives                 1              1
errors                   0              0

The software TX queue remained full, oactive stayed true,
and qdrops increased while the packet counter barely moved.

Other TX queues continued transmitting.


4. Persistence of the stall after failback
==========================================

After the initial captures, production traffic was
moved back to the other firewall. The affected router
remained CARP BACKUP.

At 10:56:01 CEST, the affected TX queue was still full:

                         09:43:53       10:56:01       delta
ixl1 TX q4 packets       1702302        1703119        +817
ixl1 TX q4 qdrops          35517          48556       +13039
ixl1 TX q4 qlen             1024           1024       unchanged
ixl1 TX q4 oactive          true           true       unchanged

All other TX queues on both interfaces had qlen=0,
qdrops=0 and oactive=false at 10:56:01.

These are cumulative counters; no continuous sampling
was performed between the observations.

5. dmesg - device identification and driver messages
====================================================

ixl0 at pci15 dev 0 function 0 "Intel XXV710 SFP28" rev 0x02: port 0, FW 
9.856.79020 API 1.15, msix, 8 queues, address [REDACTED]
ixl1 at pci15 dev 0 function 1 "Intel XXV710 SFP28" rev 0x02: port 1, FW 
9.856.79020 API 1.15, msix, 8 queues, address [REDACTED]

Driver error/timeout/watchdog/reset messages:
No matching messages found in the captured dmesg.

6. netstat -s - relevant network counters
========================================

                                      t0       t+10s
Output drops (no buffers)              0            0
Output discards (no route)             0            0
Output drops (full output queue)       0            0
Input drops (no buffers)               0            0

These are general network stack counters, not the
per-queue ixl software qdrops counters.


7. kstat - all TX queues, both interfaces
========================================

The per-queue summaries below were extracted separately
from the full kstat snapshots used in section 3.
Some counters therefore differ slightly because the
sampling times were not exactly identical.


Columns: interface queue packets qdrops qlen oactive

--- t0 ---
ixl0  q0  packets=1611029      qdrops=0         qlen=0     oactive=false
ixl0  q1  packets=1310909      qdrops=0         qlen=0     oactive=false
ixl0  q2  packets=1904026      qdrops=0         qlen=0     oactive=false
ixl0  q3  packets=2247120      qdrops=0         qlen=0     oactive=false
ixl0  q4  packets=1857250      qdrops=0         qlen=0     oactive=false
ixl0  q5  packets=3877865      qdrops=0         qlen=0     oactive=false
ixl0  q6  packets=996624       qdrops=0         qlen=0     oactive=false
ixl0  q7  packets=1700511      qdrops=0         qlen=0     oactive=false
ixl1  q0  packets=1383968      qdrops=0         qlen=0     oactive=false
ixl1  q1  packets=2462384      qdrops=0         qlen=0     oactive=false
ixl1  q2  packets=1413506      qdrops=0         qlen=0     oactive=false
ixl1  q3  packets=1496771      qdrops=0         qlen=0     oactive=false
ixl1  q4  packets=1702289      qdrops=34189     qlen=1024  oactive=true
ixl1  q5  packets=2852569      qdrops=0         qlen=0     oactive=false
ixl1  q6  packets=1769569      qdrops=0         qlen=0     oactive=false
ixl1  q7  packets=3165406      qdrops=0         qlen=0     oactive=false

--- t10 ---
ixl0  q0  packets=1621469      qdrops=0         qlen=0     oactive=false
ixl0  q1  packets=1345917      qdrops=0         qlen=0     oactive=false
ixl0  q2  packets=1919066      qdrops=0         qlen=0     oactive=false
ixl0  q3  packets=2267470      qdrops=0         qlen=0     oactive=false
ixl0  q4  packets=1866928      qdrops=0         qlen=0     oactive=false
ixl0  q5  packets=3884631      qdrops=0         qlen=0     oactive=false
ixl0  q6  packets=1011239      qdrops=0         qlen=0     oactive=false
ixl0  q7  packets=1711710      qdrops=0         qlen=0     oactive=false
ixl1  q0  packets=1401927      qdrops=0         qlen=0     oactive=false
ixl1  q1  packets=2479432      qdrops=0         qlen=0     oactive=false
ixl1  q2  packets=1419343      qdrops=0         qlen=0     oactive=false
ixl1  q3  packets=1503891      qdrops=0         qlen=0     oactive=false
ixl1  q4  packets=1702302      qdrops=35517     qlen=1024  oactive=true
ixl1  q5  packets=2860654      qdrops=0         qlen=0     oactive=false
ixl1  q6  packets=1819686      qdrops=0         qlen=0     oactive=false
ixl1  q7  packets=3183726      qdrops=0         qlen=0     oactive=false

Hardware TX counters (selected lines):
--- t0 ---
ixl0:
     tx link xon: 0 packets
    tx link xoff: 0 packets
    tx link down: 0 packets
         tx errs: 0 packets
     tx discards: 0 packets
ixl1:
     tx link xon: 0 packets
    tx link xoff: 0 packets
    tx link down: 0 packets
         tx errs: 0 packets
     tx discards: 0 packets
--- t10 ---
ixl0:
     tx link xon: 0 packets
    tx link xoff: 0 packets
    tx link down: 0 packets
         tx errs: 0 packets
     tx discards: 0 packets
ixl1:
     tx link xon: 0 packets
    tx link xoff: 0 packets
    tx link down: 0 packets
         tx errs: 0 packets
     tx discards: 0 packets

8. ifconfig ixl - link state
============================

--- t0 ---
ixl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 9000
        trunk: trunkdev aggr2
        media: Ethernet autoselect (25GbaseCR full-duplex)
        status: active
ixl1: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 9000
        trunk: trunkdev aggr2
        media: Ethernet autoselect (25GbaseCR full-duplex)
        status: active

--- t10 ---
ixl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 9000
        trunk: trunkdev aggr2
        media: Ethernet autoselect (25GbaseCR full-duplex)
        status: active
ixl1: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 9000
        trunk: trunkdev aggr2
        media: Ethernet autoselect (25GbaseCR full-duplex)
        status: active


9. vmstat -i - affected queue interrupt
=======================================

--- t0 ---
irq116/ixl1:4                  833294      686
--- t10 ---
irq116/ixl1:4                  836707      684

The interrupt count increased from 833294 to 836707
(+3413), but this does not establish whether TX
completions were progressing correctly.

10. Operational plan
====================

Once diagnostic collection is complete, I will migrate
the production VLANs away from the ixl interfaces to
other network interfaces, then reboot the affected router
to restore a reliable hot-standby configuration.

The XXV710 interfaces will no longer carry production
traffic.

I have retained the complete original diagnostics
collected during the stall. The excerpts above focus
on the relevant driver and TX queue state.

Please let me know if any additional driver state would
be useful for investigating this.

Thanks,

Reply via email to