From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-ot1-f42.google.com (mail-ot1-f42.google.com [209.85.210.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 873EE19CD0A for ; Sat, 10 Jan 2026 19:13:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.42 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768072415; cv=none; b=IZoSmoBp2q0/9FckVL7xBjFphw1+shppyWXngkfMxDoC9Rf6Z62E8qgQtrkflrK1q2eHzSMr2TC/6dY/UlYN2b+ObltsHpyb0V88xD8Uzz4H4eDP8CpMR93pCY5P1ONKMHY4l/Sz6LNbNYrxtd0pjG9AYtn2trQ2rreKKq5L0p0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768072415; c=relaxed/simple; bh=6hsgPQMDhASeJ+fOgWGYiTzJn6pw7Tq/wZDyJJgthV0=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=g8lG/BeXl9JVTgD1ffih971LCbEYMud8eWwcGW5YgLlSlWFXXyVUJ3NGKQTO8uwFdHx9otNG5Ocf7U2XC8xXZNVQ4gVaxeSY6DqUgBHLmv8CgPZTcyYeoEErVnBzyymnQM2dUX3hGVzFYAR28dz4hatjIMhCCuxOhpVhBgJ2KKc= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Ea5Dg8D+; arc=none smtp.client-ip=209.85.210.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Ea5Dg8D+" Received: by mail-ot1-f42.google.com with SMTP id 46e09a7af769-7c76f65feb5so4255960a34.0 for ; Sat, 10 Jan 2026 11:13:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768072412; x=1768677212; darn=vger.kernel.org; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=WdkXa9/L4wvq4IHLS3coifR72fpkOP/zf+UrPdheL+o=; b=Ea5Dg8D+Nabs5XDu4IK0gOo9JeLKiNDmzJuSMN0xgZxWwKJAc/+gpmJaWFeiIB6Xjw trRDmSsQgPSTwf6LMVd6Ioi76LMJgZjI0M09RbN9Hf1ljhwwi0M22oErsF5vgcLrTV/u 2XI7mqhHwEJqU6UgxBQtoDMoEdqY8hwJ76zVAk3Dnbfy2oj1K71YIoyH/JHvufyTb5o1 FVcOc4PoLOHuHe/RhFNfIizNPBW0u95zdcGsYvmyp28WXX0+7WdSicomMIpj9I362WGx /hwhKAaKesf/uF9ljbczoAqNfSJICP4FG9O6mWt95Lvew2vt1IliBLKz9OzdVRHROkT5 PEyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768072412; x=1768677212; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-gg:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=WdkXa9/L4wvq4IHLS3coifR72fpkOP/zf+UrPdheL+o=; b=fmJw5oLHJqIROnx5DQTMfYIxmc5hxpaJuzmj9pbSgZ1AyH5hOoDZKWrA6LAzWnZcZc KQbtqsqpgAHFl5ZfEbCnPSy8fc8IiVdzUWVk7g/R5AXlxKskCRmURdT6GBcEgkhv5b6S O40r03Pn5+neuME6tfi24qiub7IqiAouulEDaDKjP5WycYClvcLFTgcfV9Zb3aZ15bgz GWWeG/r+aejgPTz6IAaA2wnLPgN+aEXJM9wrxsQzMpDd487haW/8K3j+1hHAM8Plei3k X+qceIl694U1jCYzdGZfDvSnCpwSWEVWuoenHL+1OEh/Z51kkOquQ4zWJ1K1ttmaUdc8 PDdA== X-Forwarded-Encrypted: i=1; AJvYcCXMQbkffwqkYP8fNJjQOO4frAUcLEMBeoGe4dSOr9DXzzwZqIsC7at1WOebIcJXqFyeYLvz6rnCE9n+y/Q=@vger.kernel.org X-Gm-Message-State: AOJu0Yx+zJFjIaj4oiyVcpTMQFuOPuhmsTMssoUHuf+MIbIsOae76y8W jaEg375bnBMnFHnGL3NQzARv3dG35CoAs9mtDMeoNihUqgWxth1kdJx+qIcp4w== X-Gm-Gg: AY/fxX5FPl+24i0Q2Hg5LNlz4eJho5As/DZnO8XacOICBVQi0SkQ6kU0E73vzyq8/cD y5gyWahq7LxJterSQdS2Uw2xt/JTNWyD8+1FT73MrTDDd6CsyRTkRNmvYGResCTYOEzt5zaG1QR zIOvaspOtDtyquWtGje8tT5ck9irfLHUX2VVM7yR4eqw0UF8Ca2QrYN6YbUAaafvlAC8Q41DCi/ fDdbgdJwz77IHK1rPnds5059fB6o8GqULPUmqlvN5mKl2gcEkRQHtgXwqoiXrPs9MU9lBHTyHSN mXPf37OstQ9N34EL6rl5uOuEIyxRZOnFqBE9P52mK1pcfx7EkoeG7JqHGbYGdJUg5WDe70YB2H1 K/8JXenmY+vFC/dmZEBLTjMv+bPwZNoB9Uvq548AiA/aDZO+VY40x1K5o7YShBAAHEhpgExBf6z ovpGwUpcKnTK+9h1xHr+WqeQnr34SmyekWchc40oNwwlZVwIqf1euY5Mywa8ysR0DbKuiZ X-Google-Smtp-Source: AGHT+IHvh3vBxNr6ei7GlykxFLjWFURTvhvRl6IQsovogNCI455jmZsQDHLqMmWUa4ZR3buYcpiN7Q== X-Received: by 2002:a17:903:2341:b0:2a1:10f6:3c1 with SMTP id d9443c01a7336-2a3ee46f97cmr116800655ad.26.1768066346072; Sat, 10 Jan 2026 09:32:26 -0800 (PST) Received: from google.com (61-230-24-179.dynamic-ip.hinet.net. [61.230.24.179]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a3e3c491e7sm134544265ad.38.2026.01.10.09.32.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 10 Jan 2026 09:32:25 -0800 (PST) Date: Sun, 11 Jan 2026 01:32:22 +0800 From: Kuan-Wei Chiu To: Georgi Djakov Cc: jserv@ccns.ncku.edu.tw, marscheng@google.com, wllee@google.com, aarontian@google.com, hsuanting@google.com, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org Subject: Re: [PATCH] interconnect: Add kunit tests for core functionality Message-ID: References: <20251210180058.2115010-1-visitorckw@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: Hi Georgi, Thanks for the review! On Sat, Jan 10, 2026 at 01:09:03AM +0200, Georgi Djakov wrote: > On 12/10/25 8:00 PM, Kuan-Wei Chiu wrote: > > The interconnect framework currently lacks in-tree unit tests to verify > > the core logic in isolation. This makes it difficult to validate > > regression stability when modifying the provider/consumer APIs or > > aggregation logic. > > > > Introduce a kunit test suite that verifies the fundamental behavior of > > the subsystem. The tests cover: > > - Provider API (node creation, linking, topology construction). > > - Consumer API (path enabling/disabling, bandwidth requests). > > - Standard aggregation logic (accumulating bandwidth across links). > > - Bulk operations for setting bandwidth on multiple paths. > > > > The suite simulates a simple SoC topology with multiple masters and a > > shared bus to validate traffic aggregation behavior in a controlled > > software environment, without requiring specific hardware or Device > > Tree support. > > > > Signed-off-by: Kuan-Wei Chiu > > --- > > Build and kunit tests passed > > > > drivers/interconnect/Kconfig | 14 ++ > > drivers/interconnect/Makefile | 2 + > > drivers/interconnect/icc-kunit.c | 315 +++++++++++++++++++++++++++++++ > > 3 files changed, 331 insertions(+) > > create mode 100644 drivers/interconnect/icc-kunit.c > > > > diff --git a/drivers/interconnect/Kconfig b/drivers/interconnect/Kconfig > > index f2e49bd97d31..882dcb0b4a5b 100644 > > --- a/drivers/interconnect/Kconfig > > +++ b/drivers/interconnect/Kconfig > > @@ -22,4 +22,18 @@ config INTERCONNECT_CLK > > help > > Support for wrapping clocks into the interconnect nodes. > > +config INTERCONNECT_KUNIT_TEST > > + tristate "KUnit tests for Interconnect framework" > > + depends on KUNIT > > + default KUNIT_ALL_TESTS > > + help > > + This builds the KUnit test suite for the generic system interconnect > > + framework. > > + > > + The tests cover the core functionality of the interconnect subsystem, > > + including provider/consumer APIs, topology management, and bandwidth > > + aggregation logic. > > + > > + If unsure, say N. > > + > > endif > > diff --git a/drivers/interconnect/Makefile b/drivers/interconnect/Makefile > > index b0a9a6753b9d..dc4c7b657c9d 100644 > > --- a/drivers/interconnect/Makefile > > +++ b/drivers/interconnect/Makefile > > @@ -10,3 +10,5 @@ obj-$(CONFIG_INTERCONNECT_QCOM) += qcom/ > > obj-$(CONFIG_INTERCONNECT_SAMSUNG) += samsung/ > > obj-$(CONFIG_INTERCONNECT_CLK) += icc-clk.o > > + > > +obj-$(CONFIG_INTERCONNECT_KUNIT_TEST) += icc-kunit.o > > diff --git a/drivers/interconnect/icc-kunit.c b/drivers/interconnect/icc-kunit.c > > new file mode 100644 > > index 000000000000..2178487f9527 > > --- /dev/null > > +++ b/drivers/interconnect/icc-kunit.c > > @@ -0,0 +1,315 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > +/* > > + * KUnit tests for the Interconnect framework. > > + * > > + * Copyright (c) 2025 Kuan-Wei Chiu > > + * > > + * This suite verifies the behavior of the interconnect core, including > > + * topology construction, bandwidth aggregation, and path lifecycle. > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +#include "internal.h" > > + > > +enum { > > + NODE_CPU = 100, > > + NODE_GPU, > > + NODE_BUS, > > + NODE_DDR, > > + NODE_MAX > > +}; > > + > > +struct test_node_data { > > + int id; > > + const char *name; > > + int num_links; > > + int links[2]; > > +}; > > + > > +/* > > + * Static Topology: > > + * CPU -\ > > + * -> BUS -> DDR > > + * GPU -/ > > + */ > > +static const struct test_node_data test_topology[] = { > > + { NODE_CPU, "cpu", 1, { NODE_BUS } }, > > + { NODE_GPU, "gpu", 1, { NODE_BUS } }, > > + { NODE_BUS, "bus", 1, { NODE_DDR } }, > > + { NODE_DDR, "ddr", 0, { } }, > > +}; > > + > > +struct icc_test_priv { > > + struct icc_provider provider; > > + struct platform_device *pdev; > > + struct icc_node *nodes[NODE_MAX]; > > So nodes[] is a 104-element array? Is this intentional? That was indeed an oversight. In v2, I will simplify the test by making the node id 0 based. > > [..] > > +static void icc_test_set_bw(struct kunit *test) > > +{ > > + struct icc_test_priv *priv = test->priv; > > + struct icc_path *path; > > + struct icc_node *path_nodes[3]; > > + int ret; > > + > > + /* Path: CPU -> BUS -> DDR */ > > + path_nodes[0] = get_node(priv, NODE_CPU); > > + path_nodes[1] = get_node(priv, NODE_BUS); > > + path_nodes[2] = get_node(priv, NODE_DDR); > > + > > + path = icc_test_create_path(test, path_nodes, 3); > > + > > + ret = icc_enable(path); > > + KUNIT_ASSERT_EQ(test, ret, 0); > > + > > + ret = icc_set_bw(path, 1000, 2000); > > + KUNIT_EXPECT_EQ(test, ret, 0); > > + > > + KUNIT_EXPECT_EQ(test, path_nodes[0]->avg_bw, 1000); > > + KUNIT_EXPECT_EQ(test, path_nodes[0]->peak_bw, 2000); > > + KUNIT_EXPECT_EQ(test, path_nodes[1]->avg_bw, 1000); > > + KUNIT_EXPECT_EQ(test, path_nodes[1]->peak_bw, 2000); > > + > > + icc_set_tag(path, 0xABC); > > + KUNIT_EXPECT_EQ(test, path->reqs[0].tag, 0xABC); > > + > > + icc_disable(path); > > + KUNIT_EXPECT_EQ(test, path_nodes[0]->avg_bw, 0); > > + > > + icc_test_destroy_path(test, path); > > +} > > + > > I also tried to run it and noticed that one of the tests is failing on my board... > > KTAP version 1 > 1..1 > KTAP version 1 > # Subtest: interconnect > 1..4 > ok 1 icc_test_topology_integrity > # icc_test_set_bw: EXPECTATION FAILED at drivers/interconnect/icc-kunit.c:207 > Expected path_nodes[0]->avg_bw == 1000, but > path_nodes[0]->avg_bw == 2147483647 (0x7fffffff) > # icc_test_set_bw: EXPECTATION FAILED at drivers/interconnect/icc-kunit.c:208 > Expected path_nodes[0]->peak_bw == 2000, but > path_nodes[0]->peak_bw == 2147483647 (0x7fffffff) > # icc_test_set_bw: EXPECTATION FAILED at drivers/interconnect/icc-kunit.c:209 > Expected path_nodes[1]->avg_bw == 1000, but > path_nodes[1]->avg_bw == 2147483647 (0x7fffffff) > # icc_test_set_bw: EXPECTATION FAILED at drivers/interconnect/icc-kunit.c:210 > Expected path_nodes[1]->peak_bw == 2000, but > path_nodes[1]->peak_bw == 2147483647 (0x7fffffff) > # icc_test_set_bw: EXPECTATION FAILED at drivers/interconnect/icc-kunit.c:216 > Expected path_nodes[0]->avg_bw == 0, but > path_nodes[0]->avg_bw == 2147483647 (0x7fffffff) > not ok 2 icc_test_set_bw > ok 3 icc_test_aggregation > ok 4 icc_test_bulk_ops > # module: icc_kunit > # interconnect: pass:3 fail:1 skip:0 total:4 > # Totals: pass:3 fail:1 skip:0 total:4 > not ok 1 interconnect > > ...and the following diff seem to fix it: > > diff --git a/drivers/interconnect/icc-kunit.c b/drivers/interconnect/icc-kunit.c > index 2178487f9527..060f640818a5 100644 > --- a/drivers/interconnect/icc-kunit.c > +++ b/drivers/interconnect/icc-kunit.c > @@ -79,6 +79,14 @@ static struct icc_node *icc_test_xlate(const struct of_phandle_args *spec, void > return NULL; > } > > +static int icc_test_get_bw(struct icc_node *node, u32 *avg, u32 *peak) > +{ > + *avg = 0; > + *peak = 0; > + > + return 0; > +} > + > static int icc_test_init(struct kunit *test) > { > struct icc_test_priv *priv; > @@ -95,6 +103,7 @@ static int icc_test_init(struct kunit *test) > > priv->provider.set = icc_test_set; > priv->provider.aggregate = icc_test_aggregate; > + priv->provider.get_bw = icc_test_get_bw; > priv->provider.xlate = icc_test_xlate; > priv->provider.dev = &priv->pdev->dev; > priv->provider.data = priv; > > > Could you please update and re-send? Thanks for pointing this out. I will include this callback in v2. Will send the v2 patch shortly. Regards, Kuan-Wei