Fixing High CPU Usage from kworker (i915 Hotplug Loop) on a hacked DS918+ (J3710)

Recently I just noticed that my NAS (hacked DS918+ running on Intel J3710) CPU load staying around 2.0+ even though almost nothing was running after rebooting. After checking with htop, one kernel thread was constantly consuming CPU.

Identify the High CPU Process

htop shows:

Screenshot 2026-03-11 at 21.59.33

Process with PID 606 shows high CPU usage. Then I checked the process details with ps:

1
2
3
root@DS918plus:~# ps -p 606 -f
UID PID PPID C STIME TTY TIME CMD
root 606 2 31 04:28 ? 00:10:45 [kworker/2:1]

[kworker/2:1] is a Linux kernel worker thread, not a normal user process. Then I checked which kernel work it is doing:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
root@DS918plus:~# cat /proc/606/stack
[<ffffffffa0682692>] gmbus_wait+0x142/0x1d0 [i915]
[<ffffffffa06827a3>] gmbus_xfer_read+0x83/0xe0 [i915]
[<ffffffffa0682d9f>] do_gmbus_xfer+0x35f/0x4e0 [i915]
[<ffffffffa0682f95>] gmbus_xfer+0x75/0xa0 [i915]
[<ffffffff8140c268>] __i2c_transfer+0x108/0x230
[<ffffffff8140c3e3>] i2c_transfer+0x53/0x90
[<ffffffffa059da68>] drm_dp_dual_mode_read+0x58/0x80 [drm_kms_helper]
[<ffffffffa059dcb2>] drm_dp_dual_mode_detect+0x32/0x150 [drm_kms_helper]
[<ffffffffa067ed7e>] intel_hdmi_set_edid+0x29e/0x2c0 [i915]
[<ffffffffa067ee34>] intel_hdmi_detect+0x44/0x70 [i915]
[<ffffffffa0591a40>] drm_helper_probe_detect_ctx+0x80/0xd0 [drm_kms_helper]
[<ffffffffa0591ca4>] drm_helper_probe_detect+0x84/0x90 [drm_kms_helper]
[<ffffffffa065811d>] intel_encoder_hotplug+0x2d/0xa0 [i915]
[<ffffffffa0657fce>] i915_hotplug_work_func+0x18e/0x1d0 [i915]
[<ffffffff8105d452>] process_one_work+0x142/0x360
[<ffffffff8105dc9c>] worker_thread+0x1cc/0x450
[<ffffffff81062896>] kthread+0xc6/0xe0
[<ffffffff81567802>] ret_from_fork+0x52/0x80
[<ffffffffffffffff>] 0xffffffffffffffff

The result shows that CPU usage is coming from the Intel i915 graphics driver, which is trying to detect a display connected to the GPU. Since this is a headless NAS without any display, the driver keeps probing for a display and causes high CPU usage.

Use dmesg to check the kernel logs:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
root@DS918plus:~# dmesg | grep -Ei 'i915|drm|hdmi|edid|dp|gmbus|hotplug'
[ 0.000000] Command line: syno_hdd_powerup_seq=1 HddHotplug=0 syno_hw_version=DS918+ vender_format_version=2 console=ttyS0,115200n8 withefi elevator=elevator quiet syno_hdd_detect=0 syno_port_thaw=1 root=/dev/md0 sn=1780PDN123456 mac1=001132123456 netif_num=1 vid=0x346D pid=0x5678
[ 0.000000] ACPI: RSDP 0x000000007A42B014 000024 (v02 LENOVO)
[ 0.000000] smpboot: Allowing 4 CPUs, 0 hotplug CPUs
[ 0.000000] Kernel command line: syno_hdd_powerup_seq=1 HddHotplug=0 syno_hw_version=DS918+ vender_format_version=2 console=ttyS0,115200n8 withefi elevator=elevator quiet syno_hdd_detect=0 syno_port_thaw=1 root=/dev/md0 sn=1780PDN123456 mac1=001132123456 netif_num=1 vid=0x346D pid=0x5678
[ 0.349759] UDP hash table entries: 2048 (order: 4, 65536 bytes)
[ 0.349799] UDP-Lite hash table entries: 2048 (order: 4, 65536 bytes)
[ 0.350326] RPC: Registered udp transport module.
[ 3.186322] sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[ 3.497880] sd 1:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[ 19.723689] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
[ 19.723697] [drm] Driver supports precise vblank timestamp query.
[ 19.730528] [drm] Initialized i915 1.6.0 20180514 for 0000:00:02.0 on minor 0
[ 19.888506] [drm] Cannot find any crtc or sizes
[ 28.834235] [drm] Cannot find any crtc or sizes
[ 66.543385] IPVS: Registered protocols (TCP, UDP, SCTP, AH, ESP)
[ 240.140124] Workqueue: events i915_hpd_poll_init_work [i915]
[ 240.140214] [<ffffffffa0657d6f>] i915_hpd_poll_init_work+0x2f/0x100 [i915]
[ 360.160585] Workqueue: events i915_hpd_poll_init_work [i915]
[ 360.160674] [<ffffffffa0657d6f>] i915_hpd_poll_init_work+0x2f/0x100 [i915]
[ 480.199034] Workqueue: events i915_hpd_poll_init_work [i915]
[ 480.199120] [<ffffffffa0657d6f>] i915_hpd_poll_init_work+0x2f/0x100 [i915]
[ 600.223849] Workqueue: events i915_hpd_poll_init_work [i915]
[ 600.223935] [<ffffffffa0657d6f>] i915_hpd_poll_init_work+0x2f/0x100 [i915]
[ 720.249315] Workqueue: events i915_hpd_poll_init_work [i915]
[ 720.249401] [<ffffffffa0657d6f>] i915_hpd_poll_init_work+0x2f/0x100 [i915]
[ 840.274785] Workqueue: events i915_hpd_poll_init_work [i915]
[ 840.274873] [<ffffffffa0657d6f>] i915_hpd_poll_init_work+0x2f/0x100 [i915]
[ 930.025572] [drm] Cannot find any crtc or sizes

The logs show that the i915 driver is trying to detect a display and fails to find any, which confirms the issue.

Fix the Issue by Unbinding the GPU

Fisrt of all, we need to confirm the Intel GPU PCI address exists:

1
2
3
4
5
6
7
8
9
10
root@DS918plus:~# ls -l /sys/bus/pci/drivers/i915
total 0
lrwxrwxrwx 1 root root 0 Mar 12 05:10 0000:00:02.0 -> ../../../../devices/pci0000:00/0000:00:02.0
--w------- 1 root root 4096 Mar 12 05:10 bind
lrwxrwxrwx 1 root root 0 Mar 12 05:10 module -> ../../../../module/i915
--w------- 1 root root 4096 Mar 12 05:10 new_id
--w------- 1 root root 4096 Mar 12 05:10 remove_id
--w------- 1 root root 4096 Mar 12 05:10 uevent
--w------- 1 root root 4096 Mar 12 05:10 unbind
root@DS918plus:~#

The GPU is located at PCI address 0000:00:02.0. To stop the i915 driver from probing for a display, we can unbind the GPU from the driver:

1
2
root@DS918plus:~# echo 0000:00:02.0 > /sys/bus/pci/drivers/i915/unbind
root@DS918plus:~#

Then check the CPU usage again with htop, the kworker thread should no longer consume high CPU.

Screenshot 2026-03-11 at 22.19.36

Make the Fix Persistent

event the issue after reboot, create a startup script.

1
vim /usr/local/etc/rc.d/unbind_i915.sh

Add the following content to the script:

1
2
3
4
5
6
7
#!/bin/sh

GPU="0000:00:02.0"

if [ -e /sys/bus/pci/drivers/i915/$GPU ]; then
echo $GPU > /sys/bus/pci/drivers/i915/unbind
fi
1
chmod +x /usr/local/etc/rc.d/unbind_i915.sh

This script will run at startup and unbind the i915 driver from the GPU, preventing the high CPU usage issue from occurring again.

Feeling

This NAS was bought at September 08, 2022, which has been running for more than 3.5 years. It is very interesting I only noticed this issue recently. I hope this article can help others who encounter the same problem.