Excessive CPU Usage Caused by i801_SMB Interrupts on NI CompactRIO 904x Revision C

Updated Aug 18, 2026

Reported In

Hardware

  • cRIO-9040
  • cRIO-9041
  • cRIO-9042
  • cRIO-9043
  • cRIO-9045
  • cRIO-9046
  • cRIO-9047
  • cRIO-9048
  • cRIO-9049

Software

  • LabVIEW Real-Time Module

Driver

  • NI CompactRIO

Operating System

  • LabVIEW Real-Time (NI Linux Real-Time)

Issue Details

  • I am using an NI cRIO-904x Revision C controller and have noticed unusually high CPU usage. Most of the CPU activity appears to be associated with the i801_SMB interrupt.
  • After running the cat /proc/interrupts command, I found that the interrupt count for i801_SMB (IRQ20) is increasing rapidly. This behavior occurs even after reformatting the controller and reinstalling NI software.
  • I upgraded the BIOS to version 2.0.3f0, but the high i801_SMB interrupt count persists.
  • In addition, the cRIO occasionally becomes unresponsive and freezes. When this occurs, I see RCU-related error messages in the kernel ring buffer (dmesg), including:

task:rcu_preempt state:I stack:0 pid:13 ppid:2 flags:0x00004000
Call Trace:
? __schedule+0x1de/0x5b0
? schedule+0x7e/0x120
? schedule_timeout+0x182/0x2f0
? del_timer_sync+0xa0/0xa0
? rcu_gp_kthread+0x6ac/0xbd0
? rcu_cpu_kthread+0x280/0x280
? kthread+0x17c/0x1a0
? kthread_worker_fn+0x110/0x110
? ret_from_fork+0x1f/0x30
Sending NMI from CPU 1 to CPUs 0:

                                    

Solution

This issue is caused by a bug related to the SMBALERT_DIS bit in the SLVCMD register. When this bit is not configured correctly, the i801_smbus driver continuously polls for interrupts, resulting in high CPU usage.
Before implementing the solution, verify that:
  • The controller is an NI cRIO-904x Revision C (normal or TPM variant). Refer to Find the Revision of NI Hardware for instructions on determining the hardware revision.
  • Excessive interrupts are observed for i801_SMB by running the following command from the controller console:
    • cat /proc/interrupts

 

This issue was caused by a SMBALERT_DIS bit of SLVCMD register that enables polling on i801_smbus interrupt, which increases the CPU usage. This was determined to be a bug. There are several solutions to this issue, depending on NI Linux Real-Time versions installed on NI cRIO 904x.

 
A rapidly increasing interrupt count on IRQ20 i801_smbus indicates that the controller is affected by this issue.
 
Issue Picture

 

Also determine the installed NI Linux Real-Time version from NI MAX>>System Settings, as the corrective action depends on the operating system version.

 

NI MAX firmware version

If NI Linux Real-Time Version Is Later Than x64 4.9.47-rt37-6.0.0f1 (NI CompactRIO 18.5)

  1. Update the BIOS on the NI cRIO-904x to version 2.0.3f0 or later.
  2. Download the latest BIOS from the cRIO-904x Firmware and Additional Drivers download page.
  3. Follow the instructions in the CompactRIO 904x Firmware and Additional Drivers Readme to complete the BIOS update.
Note: BIOS downgrades are not supported and Emerson T&M is not responsible for issues resulting from a BIOS downgrade.

If NI Linux Real-Time Version Is x64 4.9.47-rt37-6.0.0f1 (NI CompactRIO 18.5) or Earlier

Implement either Method 1 or Method 2.

Method 1: Create an RTOS Startup Script to Configure the SMBALERT_DIS Bit

  1. Update the BIOS on the NI cRIO-904x to version 2.0.3f0 or later.
  2. Reboot the controller and establish an SSH connection. Refer to Accessing the Shell on NI Linux Real-Time Devices for instructions.
  3. Create the startup script by entering the following commands:

cat > /etc/rc5.d/S01smbfix

#!/bin/bash

devmem 0x91612011 8 0x5

 
  1. Press <Ctrl-D> to save the file.
  2. Make the script executable:
chmod +x /etc/rc5.d/S01smbfix

    The following example shows the creation of the startup script and setting execute permissions:
    Creating RTOS File
    1. Reboot the controller from NI MAX.
    Restart cRIO
    1. Reconnect through SSH and verify the configuration:

    devmem 0x91612011 8

     

    1. Run the following command to confirm that excessive i801_smbus interrupts are no longer occurring:

      cat /proc/interrupts

       

    2. Run cat /proc/interrupts command and check whether high CPU usage on i801_smbus interrupt is resolved:
    Issue Resolve Picture

     

    Method 2: Configure modprobe to Ignore i801_smbus Interrupts

    1. Establish an SSH connection to the controller. Refer to Accessing the Shell on NI Linux Real-Time Devices for instructions.
    2. Run the following command:
       
      echo "options i2c-i801 disable_features=0x10" >> /etc/modprobe.d/i2c-i801.conf && reboot
       
    3. After the controller reboots, reconnect through SSH and run:
       
      cat /proc/interrupts
       
    4. Verify that the interrupt count for i801_smbus is no longer increasing excessively.

    Additional Information

    If the issue persists after applying the solution, verify whether the following command reduces the interrupt activity associated with i801_smbus:
     
    devmem 0x91612011 8 0x5
     
    If running the command reduces the interrupt count or CPU usage, the controller is likely affected by the issue described in this article. However, this command only applies the change until the next reboot. To make the change persistent across reboots, implement Method 1 and install the RTOS startup script on the NI CompactRIO 904x controller.
     
    If high CPU usage is observed on a controller other than an NI CompactRIO 904x Revision C, first implement the solutions described in this article. If the issue persists after completing the applicable steps, contact NI Support for additional troubleshooting assistance.