]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
interconnect: mediatek: Aggregate bandwidth with saturating add
authorNicolas Frattaroli <nicolas.frattaroli@collabora.com>
Mon, 24 Nov 2025 11:07:02 +0000 (12:07 +0100)
committerGeorgi Djakov <djakov@kernel.org>
Sun, 21 Dec 2025 11:59:54 +0000 (13:59 +0200)
By using a regular non-overflow-checking add, the MediaTek icc-emi
driver will happy wrap at U32_MAX + 1 to 0. As it's common for the
interconnect core to fill in INT_MAX values, this is not a hypothetical
situation, but something that actually happens in regular use. This
would be pretty disasterous if anything used this driver.

Replace the addition with an overflow-checked addition from overflow.h,
and saturate to U32_MAX if an overflow is detected.

Fixes: b45293799f75 ("interconnect: mediatek: Add MediaTek MT8183/8195 EMI Interconnect driver")
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
Link: https://lore.kernel.org/r/20251124-mt8196-dvfsrc-v2-13-d9c1334db9f3@collabora.com
Signed-off-by: Georgi Djakov <djakov@kernel.org>
drivers/interconnect/mediatek/icc-emi.c

index 182aa2b0623af37ea52077b9167d0601cca3117c..dfa3a9cd9399833d5d4a014135a86a3d0c490533 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/of_platform.h>
+#include <linux/overflow.h>
 #include <linux/platform_device.h>
 #include <linux/soc/mediatek/dvfsrc.h>
 
@@ -22,7 +23,9 @@ static int mtk_emi_icc_aggregate(struct icc_node *node, u32 tag, u32 avg_bw,
 {
        struct mtk_icc_node *in = node->data;
 
-       *agg_avg += avg_bw;
+       if (check_add_overflow(*agg_avg, avg_bw, agg_avg))
+               *agg_avg = U32_MAX;
+
        *agg_peak = max_t(u32, *agg_peak, peak_bw);
 
        in->sum_avg = *agg_avg;