* [PATCH] HID: playstation: ratelimit input CRC check failed messages
@ 2026-10-28 0:36 Mauricio Faria de Oliveira
2026-11-02 14:18 ` Roderick Colenbrander
0 siblings, 1 reply; 2+ messages in thread
From: Mauricio Faria de Oliveira @ 2026-10-28 0:36 UTC (permalink / raw)
To: Roderick Colenbrander, Jiri Kosina, Benjamin Tissoires
Cc: kernel-dev, linux-input, linux-kernel, Mauricio Faria de Oliveira
The kernel log of a Steam Deck was mostly filled with CRC check errors
from what is apparently a bogus controller, with 8174 messages in <200
seconds, averaging ~43 messages/second:
$ cat dmesg-pstore.202610250608-0 \
| grep -c "input CRC's check failed"
8174
$ cat dmesg-pstore.202610250608-0 \
| grep -m1 "input CRC's check failed"
<3>[ 8.715455] playstation 0005:054C:05C4.0006:
DualShock4 input CRC's check failed
$ tac dmesg-pstore.202610250608-0 \
| grep -m1 "input CRC's check failed"
<3>[ 196.187459] playstation 0005:054C:05C4.0006:
DualShock4 input CRC's check failed
$ echo $((8174 / (196-8)))
43
Let's ratelimit the input CRC check failed messages for the exceptional,
high-frequency error case, which doesn't impact the occasional, low-freq
error case (as ratelimiting does not trigger) or the non-error case.
CRC check failed messages for driver-initiated requests are kept as is.
Testing with a UHID driver to synthetically reproduce input CRC check
errors (generated by an LLM) shows that it reduces the duplicate lines
and still provides useful information (number of errors/same message).
For example, triggering such error every 25ms (40 times/second), prints
10 messages and silently counts another 187 in 5 seconds, ie, 197 / 5 =
39.4 times/second (aligned with the synthetic reproducer's rate):
[ 9.554184] playstation ...: Registered DualShock4 controller ...
[ 10.053936] playstation ...: DualShock4 input CRC's check failed
[ 10.078162] playstation ...: DualShock4 input CRC's check failed
[ 10.103447] playstation ...: DualShock4 input CRC's check failed
[ 10.128739] playstation ...: DualShock4 input CRC's check failed
[ 10.154016] playstation ...: DualShock4 input CRC's check failed
[ 10.179198] playstation ...: DualShock4 input CRC's check failed
[ 10.204474] playstation ...: DualShock4 input CRC's check failed
[ 10.229762] playstation ...: DualShock4 input CRC's check failed
[ 10.254904] playstation ...: DualShock4 input CRC's check failed
[ 10.280441] playstation ...: DualShock4 input CRC's check failed
[ 15.070695] dualshock4_parse_report: 187 callbacks suppressed
...
This reduces the space consumed in the kernel log during 5 seconds from
~200 lines to only 11 lines (5.5%).
Signed-off-by: Mauricio Faria de Oliveira <mfo@igalia.com>
---
drivers/hid/hid-playstation.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c
index f9dc9378cf777d33aab3cdb87302c6e48f406d2f..b053037a3f0b95b6986c7e53e787e005676ed565 100644
--- a/drivers/hid/hid-playstation.c
+++ b/drivers/hid/hid-playstation.c
@@ -824,6 +824,7 @@ static int ps_get_report(struct hid_device *hdev, u8 report_id, u8 *buf,
u32 report_crc = get_unaligned_le32(&buf[crc_offset]);
if (!ps_check_crc32(PS_FEATURE_CRC32_SEED, buf, crc_offset, report_crc)) {
+ /* hid_err_ratelimited() not used on driver-initiated requests */
hid_err(hdev, "CRC check failed for reportID=%d\n", report_id);
return -EILSEQ;
}
@@ -1459,7 +1460,7 @@ static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *r
u32 report_crc = get_unaligned_le32(&data[size - 4]);
if (!ps_check_crc32(PS_INPUT_CRC32_SEED, data, size - 4, report_crc)) {
- hid_err(hdev, "DualSense input CRC's check failed\n");
+ hid_err_ratelimited(hdev, "DualSense input CRC's check failed\n");
return -EILSEQ;
}
@@ -2425,7 +2426,7 @@ static int dualshock4_parse_report(struct ps_device *ps_dev, struct hid_report *
/* Last 4 bytes of input report contains CRC. */
if (!ps_check_crc32(PS_INPUT_CRC32_SEED, data, size - 4, report_crc)) {
- hid_err(hdev, "DualShock4 input CRC's check failed\n");
+ hid_err_ratelimited(hdev, "DualShock4 input CRC's check failed\n");
return -EILSEQ;
}
---
base-commit: 83f32c773255720a661aa45d83e36278135f23f5
change-id: 20261027-hid-playstation-ratelimit-input-crc-error-26f871f1c9d2
Best regards,
--
Mauricio Faria de Oliveira <mfo@igalia.com>
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: [PATCH] HID: playstation: ratelimit input CRC check failed messages
2026-10-28 0:36 [PATCH] HID: playstation: ratelimit input CRC check failed messages Mauricio Faria de Oliveira
@ 2026-11-02 14:18 ` Roderick Colenbrander
0 siblings, 0 replies; 2+ messages in thread
From: Roderick Colenbrander @ 2026-11-02 14:18 UTC (permalink / raw)
To: Mauricio Faria de Oliveira
Cc: Roderick Colenbrander, Jiri Kosina, Benjamin Tissoires,
kernel-dev, linux-input, linux-kernel
Hi Mauricio,
This looks reasonable to reduce log spam.
Signed-off-by: roderick.colenbrander@sony.com
Thanks,
Roderick Colenbrander
On Tue, Oct 27, 2026 at 5:36 PM Mauricio Faria de Oliveira
<mfo@igalia.com> wrote:
>
> The kernel log of a Steam Deck was mostly filled with CRC check errors
> from what is apparently a bogus controller, with 8174 messages in <200
> seconds, averaging ~43 messages/second:
>
> $ cat dmesg-pstore.202610250608-0 \
> | grep -c "input CRC's check failed"
> 8174
>
> $ cat dmesg-pstore.202610250608-0 \
> | grep -m1 "input CRC's check failed"
> <3>[ 8.715455] playstation 0005:054C:05C4.0006:
> DualShock4 input CRC's check failed
>
> $ tac dmesg-pstore.202610250608-0 \
> | grep -m1 "input CRC's check failed"
> <3>[ 196.187459] playstation 0005:054C:05C4.0006:
> DualShock4 input CRC's check failed
>
> $ echo $((8174 / (196-8)))
> 43
>
> Let's ratelimit the input CRC check failed messages for the exceptional,
> high-frequency error case, which doesn't impact the occasional, low-freq
> error case (as ratelimiting does not trigger) or the non-error case.
>
> CRC check failed messages for driver-initiated requests are kept as is.
>
> Testing with a UHID driver to synthetically reproduce input CRC check
> errors (generated by an LLM) shows that it reduces the duplicate lines
> and still provides useful information (number of errors/same message).
>
> For example, triggering such error every 25ms (40 times/second), prints
> 10 messages and silently counts another 187 in 5 seconds, ie, 197 / 5 =
> 39.4 times/second (aligned with the synthetic reproducer's rate):
>
> [ 9.554184] playstation ...: Registered DualShock4 controller ...
> [ 10.053936] playstation ...: DualShock4 input CRC's check failed
> [ 10.078162] playstation ...: DualShock4 input CRC's check failed
> [ 10.103447] playstation ...: DualShock4 input CRC's check failed
> [ 10.128739] playstation ...: DualShock4 input CRC's check failed
> [ 10.154016] playstation ...: DualShock4 input CRC's check failed
> [ 10.179198] playstation ...: DualShock4 input CRC's check failed
> [ 10.204474] playstation ...: DualShock4 input CRC's check failed
> [ 10.229762] playstation ...: DualShock4 input CRC's check failed
> [ 10.254904] playstation ...: DualShock4 input CRC's check failed
> [ 10.280441] playstation ...: DualShock4 input CRC's check failed
> [ 15.070695] dualshock4_parse_report: 187 callbacks suppressed
> ...
>
> This reduces the space consumed in the kernel log during 5 seconds from
> ~200 lines to only 11 lines (5.5%).
>
> Signed-off-by: Mauricio Faria de Oliveira <mfo@igalia.com>
> ---
> drivers/hid/hid-playstation.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c
> index f9dc9378cf777d33aab3cdb87302c6e48f406d2f..b053037a3f0b95b6986c7e53e787e005676ed565 100644
> --- a/drivers/hid/hid-playstation.c
> +++ b/drivers/hid/hid-playstation.c
> @@ -824,6 +824,7 @@ static int ps_get_report(struct hid_device *hdev, u8 report_id, u8 *buf,
> u32 report_crc = get_unaligned_le32(&buf[crc_offset]);
>
> if (!ps_check_crc32(PS_FEATURE_CRC32_SEED, buf, crc_offset, report_crc)) {
> + /* hid_err_ratelimited() not used on driver-initiated requests */
> hid_err(hdev, "CRC check failed for reportID=%d\n", report_id);
> return -EILSEQ;
> }
> @@ -1459,7 +1460,7 @@ static int dualsense_parse_report(struct ps_device *ps_dev, struct hid_report *r
> u32 report_crc = get_unaligned_le32(&data[size - 4]);
>
> if (!ps_check_crc32(PS_INPUT_CRC32_SEED, data, size - 4, report_crc)) {
> - hid_err(hdev, "DualSense input CRC's check failed\n");
> + hid_err_ratelimited(hdev, "DualSense input CRC's check failed\n");
> return -EILSEQ;
> }
>
> @@ -2425,7 +2426,7 @@ static int dualshock4_parse_report(struct ps_device *ps_dev, struct hid_report *
>
> /* Last 4 bytes of input report contains CRC. */
> if (!ps_check_crc32(PS_INPUT_CRC32_SEED, data, size - 4, report_crc)) {
> - hid_err(hdev, "DualShock4 input CRC's check failed\n");
> + hid_err_ratelimited(hdev, "DualShock4 input CRC's check failed\n");
> return -EILSEQ;
> }
>
>
> ---
> base-commit: 83f32c773255720a661aa45d83e36278135f23f5
> change-id: 20261027-hid-playstation-ratelimit-input-crc-error-26f871f1c9d2
>
> Best regards,
> --
> Mauricio Faria de Oliveira <mfo@igalia.com>
>
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-11-02 14:18 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-28 0:36 [PATCH] HID: playstation: ratelimit input CRC check failed messages Mauricio Faria de Oliveira
2026-11-02 14:18 ` Roderick Colenbrander
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®