]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
hwmon: (nzxt-smart2) DMA-align output buffer
authorGuenter Roeck <linux@roeck-us.net>
Mon, 27 Jul 2026 16:54:23 +0000 (09:54 -0700)
committerGuenter Roeck <linux@roeck-us.net>
Mon, 27 Jul 2026 18:35:22 +0000 (11:35 -0700)
Sashiko reports:

When send_output_report() calls hid_hw_output_report(), the underlying USB
HID core calls usb_interrupt_msg() which maps this buffer directly for DMA.

When the DMA mapping flushes or invalidates the cacheline, it will corrupt
the adjacent variables (mutex, update_interval) that were modified
concurrently by the CPU. This causes memory corruption due to cacheline
sharing on non-coherent CPU architectures (such as ARM or MIPS). The DMA
API debugging tool (CONFIG_DMA_API_DEBUG) will trigger runtime warnings
for this violation.

Any operation that triggers send_output_report() (like setting a fan speed
or updating the interval) causes the USB DMA mapping. On systems with
non-coherent caches, this structural bug causes immediate and deterministic
memory corruption.

Align the output buffer to ARCH_DMA_MINALIGN to fix the problem.

Reported-by: Sashiko <sashiko-bot@kernel.org>
Fixes: 53e68c20aeb1 ("hwmon: add driver for NZXT RGB&Fan Controller/Smart Device v2.")
Cc: Aleksandr Mezin <mezin.alexander@gmail.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/nzxt-smart2.c

index e2316c46629d61fa8f5511ce1c83e73a946a9667..ff0c0bee0e8397387079eac1e07ef4f2dabaf5b7 100644 (file)
@@ -203,7 +203,7 @@ struct drvdata {
         */
        struct mutex mutex;
        long update_interval;
-       u8 output_buffer[OUTPUT_REPORT_SIZE];
+       u8 output_buffer[OUTPUT_REPORT_SIZE] __aligned(ARCH_DMA_MINALIGN);
 };
 
 static long scale_pwm_value(long val, long orig_max, long new_max)