]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/xe/guc: Ratelimit diagnostic messages from the relay
authorMichal Wajdeczko <michal.wajdeczko@intel.com>
Sun, 5 Oct 2025 17:39:46 +0000 (19:39 +0200)
committerMichal Wajdeczko <michal.wajdeczko@intel.com>
Mon, 6 Oct 2025 17:44:43 +0000 (19:44 +0200)
There might be some malicious VFs that by sending an invalid VF2PF
relay messages will flood PF's dmesg with our diagnostics messages.

Rate limit all relay messages, unless running in DEBUG_SRIOV mode.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Reviewed-by: Piotr Piórkowski <piotr.piorkowski@intel.com>
Link: https://lore.kernel.org/r/20251005173946.2784-1-michal.wajdeczko@intel.com
drivers/gpu/drm/xe/xe_guc_relay.c
drivers/gpu/drm/xe/xe_guc_relay_types.h

index e5dc94f3e61810e34f72184d9313e6e6fe357bd6..0c0ff24ba62a4801649ec1e9033943ca30d824ce 100644 (file)
@@ -56,9 +56,19 @@ static struct xe_device *relay_to_xe(struct xe_guc_relay *relay)
        return gt_to_xe(relay_to_gt(relay));
 }
 
+#define XE_RELAY_DIAG_RATELIMIT_INTERVAL       (10 * HZ)
+#define XE_RELAY_DIAG_RATELIMIT_BURST          10
+
+#define relay_ratelimit_printk(relay, _level, fmt...) ({                       \
+       typeof(relay) _r = (relay);                                             \
+       if (IS_ENABLED(CONFIG_DRM_XE_DEBUG_SRIOV) ||                            \
+           ___ratelimit(&_r->diag_ratelimit, "xe_guc_relay"))                  \
+               xe_gt_sriov_##_level(relay_to_gt(_r), "relay: " fmt);           \
+})
+
 #define relay_assert(relay, condition) xe_gt_assert(relay_to_gt(relay), condition)
-#define relay_notice(relay, msg...)    xe_gt_sriov_notice(relay_to_gt(relay), "relay: " msg)
-#define relay_debug(relay, msg...)     xe_gt_sriov_dbg_verbose(relay_to_gt(relay), "relay: " msg)
+#define relay_notice(relay, msg...)    relay_ratelimit_printk((relay), notice, msg)
+#define relay_debug(relay, msg...)     relay_ratelimit_printk((relay), dbg_verbose, msg)
 
 static int relay_get_totalvfs(struct xe_guc_relay *relay)
 {
@@ -345,6 +355,9 @@ int xe_guc_relay_init(struct xe_guc_relay *relay)
        INIT_WORK(&relay->worker, relays_worker_fn);
        INIT_LIST_HEAD(&relay->pending_relays);
        INIT_LIST_HEAD(&relay->incoming_actions);
+       ratelimit_state_init(&relay->diag_ratelimit,
+                            XE_RELAY_DIAG_RATELIMIT_INTERVAL,
+                            XE_RELAY_DIAG_RATELIMIT_BURST);
 
        err = mempool_init_kmalloc_pool(&relay->pool, XE_RELAY_MEMPOOL_MIN_NUM +
                                        relay_get_totalvfs(relay),
index 5999fcb77e96c420458752e11953d807b40c3c70..20eee10856b250a367ac76224a0588b1a04e4004 100644 (file)
@@ -7,6 +7,7 @@
 #define _XE_GUC_RELAY_TYPES_H_
 
 #include <linux/mempool.h>
+#include <linux/ratelimit_types.h>
 #include <linux/spinlock.h>
 #include <linux/workqueue.h>
 
@@ -31,6 +32,9 @@ struct xe_guc_relay {
 
        /** @last_rid: last Relay-ID used while sending a message. */
        u32 last_rid;
+
+       /** @diag_ratelimit: ratelimit state used to throttle diagnostics messages. */
+       struct ratelimit_state diag_ratelimit;
 };
 
 #endif