Skip to content

ice: GNSS kthread worker causes hung task warnings when no GPS signal available #56

Description

@ionutnechita

Description

When using Intel E810 NICs with GNSS capability, the ice-gnss-* kthread workers cause hung task warnings when the GNSS receiver has no signal (e.g., no antenna connected or weak signal).

Environment

  • Driver version: ice 2.5.4
  • Kernel version: 6.18.21 / 6.18.22
  • Hardware: Dell PowerEdge XR11
  • NICs:
    • Intel E810-C for SFP (0000:51:00.x) - with GNSS antenna, working
    • Intel E810-C for QSFP (0000:8a:00.x) - no GNSS antenna connected

Steps to reproduce

  1. Install E810 NIC with GNSS capability
  2. Do not connect GNSS antenna (or have weak/no GPS signal)
  3. Load ice driver
  4. Wait ~120 seconds

Expected behavior

Driver should handle missing GNSS signal gracefully without blocking.

Actual behavior

Hung task warnings appear in dmesg:

[  248.064851] INFO: task ice-gnss-0000:5:603 blocked for more than 124 seconds.
[  248.064879]       Tainted: G           OE       6.18.21-xxx #8
[  248.064886] task:ice-gnss-0000:5 state:D stack:0     pid:603   tgid:603   ppid:2
[  248.064898] Call Trace:
[  248.064902]  <TASK>
[  248.064908]  __schedule+0x474/0x1210
[  248.064950]  schedule+0x27/0xf0
[  248.064959]  schedule_preempt_disabled+0x15/0x30
[  248.064968]  kthread+0xa4/0x220
[  248.064985]  ret_from_fork+0x273/0x2a0
[  248.065003]  ret_from_fork_asm+0x1a/0x30
[  248.065018]  </TASK>

GNSS status

# Working NIC (with antenna):
$ cat /dev/gnss0
<valid NMEA data with GPS fix, 9 satellites>

# NIC without antenna (causes hung task):
$ cat /dev/gnss1
$GNRMC,,V,,,,,,,,,,N,V*37
$GNGGA,,,,,,0,00,99.99,,,,,,*56

Root cause analysis

In ice_gnss_read() (src/ice_gnss.c), the polling loop iterates up to ICE_MAX_UBX_READ_TRIES (255) times with msleep(20) between attempts. When GNSS has no signal, this can block for ~5 seconds per cycle.

Additionally, during module unload, kthread_cancel_delayed_work_sync() waits for the work to complete, which can take a long time if stuck in the polling loop.

Suggested fix

Add a stopping flag to allow graceful termination of the read loop during shutdown:

  1. Add bool stopping field to struct gnss_serial
  2. Check stopping flag at the beginning of ice_gnss_read() and exit early
  3. Check stopping flag inside the polling loop
  4. Don't requeue the delayed work if stopping is true
  5. Set stopping = true in ice_gnss_exit() before calling kthread_cancel_delayed_work_sync()

See attached patch for implementation.

Workaround

Connect GNSS antenna to all E810 NICs with GNSS capability, or disable hung task warnings:

sysctl -w kernel.hung_task_timeout_secs=0

0001-ice-gnss-fix-hung-task-when-GNSS-has-no-signal.patch

0001-ice-gnss-fix-hung-task-when-kthread-misses-initial-w.patch

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions