Public bug reported:
igb: unbounded retry loop in igb_release_swfw_sync_i210() during
probe deadlocks pciehp and breaks hibernate resume
Summary
On a ThinkPad X1 Carbon Gen 10 with a CalDigit TS3 Plus Thunderbolt 3 dock
attached at boot, the dock’s Intel I210 Ethernet
controller is probed by igb during the window in which the Thunderbolt PCIe
tunnel established by the BIOS is torn down and rebuilt
by the OS driver.
If the PCIe link drops while igb_probe() is running, the probe reaches
igb_release_swfw_sync_i210(), which retries
igb_get_hw_semaphore_i210() in a loop with no iteration limit and no error
path. Because the device is no longer reachable,
register reads return all-ones, the semaphore can never be acquired, and the
loop cannot terminate.
The udev worker executing the probe therefore spins in R state indefinitely
(observed for 20+ minutes), holding device_lock on the
igb device, taken by really_probe().
Impact
Three distinct user-visible failures follow from the single stuck task:
Dock is dead. pciehp’s IRQ thread blocks in pciehp_unconfigure_device() waiting
on the same device_lock; the
Thunderbolt PCI rescan worker (tb_pci_rescan_work_fn) then blocks behind
pciehp. The tunnel is never completed, so
neither Ethernet nor USB on the dock ever appears.
Resume from hibernation fails and the image is discarded. freeze_processes()
cannot freeze a task spinning in kernel
context, so resume aborts with PM: hibernation: resume failed (-16) and the
machine continues as a fresh boot.
The hibernated session is lost.
Suspend and shutdown break for the rest of the session. Every subsequent s2idle
attempt fails the same 20 s freeze timeout,
retrying roughly every 30 seconds. At shutdown, systemd-shutdown waits forever,
because the task responds to neither
SIGTERM nor SIGKILL.
Environment
Kernel: 7.0.0-28-generic (Ubuntu)
Machine: Lenovo ThinkPad X1 Carbon Gen 10 (Alder Lake)
Dock: CalDigit TS3 Plus, Thunderbolt 3
NIC: Intel I210 (dock-provided; the laptop has no built-in Ethernet)
Thunderbolt device is enrolled and authorized (boltctl: stored, policy iommu)
ACPI: PM: (supports S0 S4 S5) — s2idle and hibernate only, no S3
Thunderbolt pre-boot support enabled in BIOS at time of failure
Reproduction
Intermittent; it is a race, and most boots succeed.
Attach the CalDigit TS3 Plus.
Boot, or resume from hibernation, with the dock attached.
Occasionally the dock’s Ethernet and USB never appear. When that happens, ps
-eo(udev-worker) and the hung-task detector reports irq/NNN-pciehp blocked.
pid,stat,comm shows a long-lived
Suspected cause
drivers/net/ethernet/intel/igb/e1000_i210.c:
void igb_release_swfw_sync_i210(struct e1000_hw *hw, u16 mask)
{
u32 swfw_sync;
while (igb_get_hw_semaphore_i210(hw))
; /* Empty */
...
}
igb_get_hw_semaphore_i210() busy-waits with udelay(50) for a bounded number of
iterations and then returns an error — but
the caller above simply retries, without limit, and has a void return so it has
no way to report failure.On a disconnected device this is an unbounded loop by
construction. It is not a hang on dead I/O that a timeout would eventually
clear;
the task remains runnable and burns a CPU core.
Note that the same loop appears unchanged across a wide range of kernel
versions, including current mainline.
Suggested direction
Bound the retry loop, and/or bail out when the device is gone — e.g. check
pci_dev_is_disconnected() or detect an all-ones read
— so that igb_probe() can fail cleanly and release device_lock, allowing pciehp
to complete removal of the vanished slot.
Logs
PCIe link drops during device init
kernel: pcieport 0000:00:07.0: pciehp: Slot(3): Link Down
kernel: pcieport 0000:00:07.0: pciehp: Slot(3): Card not present
kernel: xhci_hcd 0000:23:00.0: xHCI host controller not responding, assume dead
kernel: xhci_hcd 0000:23:00.0: HC died; cleaning up
kernel: xhci_hcd 0000:22:00.0: xHCI host controller not responding, assume dead
kernel: xhci_hcd 0000:22:00.0: HC died; cleaning up
kernel: xhci_hcd 0000:24:00.0: xHCI host controller not responding, assume dead
kernel: xhci_hcd 0000:24:00.0: HC died; cleaning up
Hibernate resume aborts because the task cannot be frozen
kernel: Freezing user space processes
kernel: Freezing user space processes failed after 20.003 seconds (1 tasks
refusing to freeze, wq_busy=0):
kernel: task:(udev-worker) state:R running task stack:0 pid:260 tgid:260
ppid:237
...
kernel: PM: Image signature found, resuming
kernel: PM: hibernation: resume from hibernation
kernel: PM: hibernation: resume failed (-16)
Stack of the spinning task
kernel: RIP: 0010:delay_halt_tpause+0x1a/0x30
kernel: delay_halt.part.0+0x3e/0x70
kernel: delay_halt+0x13/0x30
kernel: __const_udelay+0x3d/0x50
kernel: igb_get_hw_semaphore_i210+0x32/0x190 [igb]
kernel: igb_release_swfw_sync_i210+0x1a/0x60 [igb]
kernel: igb_release_phy_82575+0x40/0x50 [igb]
kernel: igb_read_phy_reg_82580+0x4b/0x60 [igb]
kernel: igb_setup_copper_link+0xa3/0x220 [igb]
kernel: igb_setup_copper_link_82575+0x111/0x200 [igb]
kernel: igb_setup_link+0x5a/0x2a0 [igb]
kernel: igb_init_hw_82575+0xce/0x1f0 [igb]
kernel: igb_reset+0x175/0x560 [igb]
kernel: igb_probe+0x8a6/0x13c0 [igb]
kernel: local_pci_probe+0x47/0xb0
kernel: pci_call_probe+0x5e/0x1a0
kernel: pci_device_probe+0xa9/0x150
kernel: call_driver_probe+0x29/0x120
kernel: really_probe+0xe3/0x340
kernel: __driver_probe_device+0x9f/0x1d0
kernel: driver_probe_device+0x24/0xd0
kernel: __driver_attach+0x10b/0x240
kernel: bus_for_each_dev+0x8c/0xf0
kernel: driver_attach+0x1e/0x30
kernel: bus_add_driver+0x160/0x2a0
kernel: driver_register+0x5e/0x130
kernel: __pci_register_driver+0x5e/0x70
kernel: igb_init_module+0x59/0xff0 [igb]
kernel: do_one_initcall+0x5f/0x360
kernel: do_init_module+0x97/0x2c0
kernel: load_module+0x9f4/0xb20kernel:kernel:kernel:kernel:kernel:
init_module_from_file+0x153/0x160
idempotent_init_module+0x10f/0x300
__x64_sys_finit_module+0x73/0xf0
do_syscall_64+0xd9/0x5b0
entry_SYSCALL_64_after_hwframe+0x76/0x7e
Resulting lock chain
kernel: INFO: task irq/123-pciehp:172 blocked for more than 860 seconds.
kernel: task:irq/123-pciehp state:D stack:0 pid:172 tgid:172 ppid:2
kernel: pciehp_unconfigure_device+0x97/0x180
kernel: pciehp_disable_slot+0x68/0x140
kernel: pciehp_handle_presence_or_link_change+0x74/0x4c0
kernel: pciehp_ist+0x1a3/0x290
kernel: INFO: task irq/123-pciehp:172 is blocked on a mutex likely owned by
task (udev-worker):260.
kernel: Workqueue: thunderbolt0 tb_pci_rescan_work_fn [thunderbolt]
kernel: tb_pci_rescan_work_fn+0x12/0x40 [thunderbolt]
kernel: INFO: task kworker/u80:11:1433 is blocked on a mutex likely owned by
task irq/123-pciehp:172.
IRQ 123 corresponds to pcieport 0000:00:07.0, the Thunderbolt root port:
kernel: pcieport 0000:00:07.0: PME: Signaling with IRQ 123
Repeated suspend failures for the remainder of the session
kernel: PM: suspend entry (s2idle)
kernel: Freezing user space processes
kernel: Freezing user space processes failed after 20.004 seconds (3 tasks
refusing to freeze, wq_busy=0):
kernel: PM: suspend exit
(repeating roughly every 30 seconds, task count rising from 1 to 3)
Shutdown never completes
systemd-shutdown[1]: Sending SIGTERM to remaining processes...
systemd-shutdown: waiting for process: 269 ((udev-worker)), 4484 (tlp), 1538
(tlp)
Filesystems were unmounted and synced cleanly before this point; only the final
process-reaping phase hangs. A hard power-off is
required, and a warm reboot does not clear the Thunderbolt controller state
ProblemType: Bug
DistroRelease: Ubuntu 24.04
Package: linux-image-7.0.0-28-generic 7.0.0-28.28~24.04.1
ProcVersionSignature: Ubuntu 7.0.0-28.28~24.04.1-generic 7.0.12
Uname: Linux 7.0.0-28-generic x86_64
ApportVersion: 2.28.2-0ubuntu0.1
Architecture: amd64
CasperMD5CheckResult: unknown
CurrentDesktop: ubuntu:GNOME
Date: Fri Jul 31 11:13:47 2026
DistributionChannelDescriptor:
# This is the distribution channel descriptor for the OEM CDs
# For more information see http://wiki.ubuntu.com/DistributionChannelDescriptor
canonical-oem-sutton-focal-amd64-20220425-68+sutton-focal-amd64+X02
InstallationDate: Installed on 2022-05-10 (1543 days ago)
InstallationMedia: Ubuntu 20.04 "Focal" - Build amd64 LIVE Binary 20220425-07:09
IwConfig:
lo no wireless extensions.
enp37s0 no wireless extensions.
lxcbr0 no wireless extensions.
MachineType: LENOVO 21CBCTO1WW
ProcEnviron:
LANG=en_US.UTF-8
PATH=(custom, no user)
SHELL=/usr/bin/bash
TERM=xterm-256color
XDG_RUNTIME_DIR=<set>
ProcFB: 0 i915drmfb
ProcKernelCmdLine: BOOT_IMAGE=/boot/vmlinuz-7.0.0-28-generic
root=UUID=b552fd18-72d9-41e4-b7c7-631684e58d29 ro
resume=UUID=b552fd18-72d9-41e4-b7c7-631684e58d29 resume_offset=7682048
crashkernel=2G-4G:320M,4G-32G:512M,32G-64G:1024M,64G-128G:2048M,128G-:4096M
PulseList: Error: command ['pacmd', 'list'] failed with exit code 1: No
PulseAudio daemon running, or not running as session daemon.
RelatedPackageVersions:
linux-restricted-modules-7.0.0-28-generic N/A
linux-backports-modules-7.0.0-28-generic N/A
linux-firmware 20240318.git3b128b60-0ubuntu2.27
RfKill:
0: tpacpi_bluetooth_sw: Bluetooth
Soft blocked: no
Hard blocked: no
SourcePackage: linux-hwe-7.0
UpgradeStatus: Upgraded to noble on 2024-09-10 (689 days ago)
dmi.bios.date: 04/20/2026
dmi.bios.release: 1.55
dmi.bios.vendor: LENOVO
dmi.bios.version: N3AET90W (1.55 )
dmi.board.asset.tag: Not Available
dmi.board.name: 21CBCTO1WW
dmi.board.vendor: LENOVO
dmi.board.version: Not Defined
dmi.chassis.asset.tag: No Asset Information
dmi.chassis.type: 10
dmi.chassis.vendor: LENOVO
dmi.chassis.version: None
dmi.ec.firmware.release: 1.26
dmi.modalias:
dmi:bvnLENOVO:bvrN3AET90W(1.55):bd04/20/2026:br1.55:efr1.26:svnLENOVO:pn21CBCTO1WW:pvrThinkPadX1CarbonGen10:rvnLENOVO:rn21CBCTO1WW:rvrNotDefined:cvnLENOVO:ct10:cvrNone:skuLENOVO_MT_21CB_BU_Think_FM_ThinkPadX1CarbonGen10:pfaThinkPadX1CarbonGen10:
dmi.product.family: ThinkPad X1 Carbon Gen 10
dmi.product.name: 21CBCTO1WW
dmi.product.sku: LENOVO_MT_21CB_BU_Think_FM_ThinkPad X1 Carbon Gen 10
dmi.product.version: ThinkPad X1 Carbon Gen 10
dmi.sys.vendor: LENOVO
** Affects: linux-hwe-7.0 (Ubuntu)
Importance: Undecided
Status: New
** Tags: amd64 apport-bug noble
--
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/2162579
Title:
igb: unbounded retry loop in igb_release_swfw_sync_i210() during probe
deadlocks pciehp and breaks hibernate resume
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/linux-hwe-7.0/+bug/2162579/+subscriptions
--
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs