Commit 0faa22e7 authored by Michal Wajdeczko's avatar Michal Wajdeczko
Browse files

drm/xe/guc: Ratelimit diagnostic messages from the relay



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: default avatarMichal Wajdeczko <michal.wajdeczko@intel.com>
Reviewed-by: default avatarPiotr Piórkowski <piotr.piorkowski@intel.com>
Link: https://lore.kernel.org/r/20251005173946.2784-1-michal.wajdeczko@intel.com
parent 430d3288
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -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),
+4 −0
Original line number Diff line number Diff line
@@ -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