From nobody Mon Sep 28 02:58:34 2026 Received: from smtpbg151.qq.com (smtpbg151.qq.com [18.169.211.239]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 910A62641FC; Thu, 27 Aug 2026 02:17:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=18.169.211.239 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787797046; cv=none; b=rGWEWNbNIQvShFxMOghCSEPh6AJ+YjwpDZXQnBWbM+TmgSCYFqYx4LT8e3cmYRm6uM4XnCHTZroBEzrcAZMjRhUuniixlTfb+kKMApPBBxJZsoetZcZVGCiUY/eJzsjcuDM4AWeqAoJGUGLAnGIXHHOecfUyi4xE7WkDMKRd4pI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787797046; c=relaxed/simple; bh=Otn8w1yt/gBzaL7xp39f/9GrkWA4bJSG9PRUIE/MBW4=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=FBHt+uhXhS9qZ2Glk1kI+U228CEXJfnPUuSfQ5qagCcsvZCki/7EnIkUTV7rfm7e75ugGAVQm40xLPCH+kzVq8qwxkR6nQhkyktT9w3wU/6dgxAyp4d+Z8PF63yjtKcjlyc9JOIXYVxkBTKNsXyhA6JxZH7wjrmEVmum7uY+Nyw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=uniontech.com; spf=pass smtp.mailfrom=uniontech.com; dkim=pass (1024-bit key) header.d=uniontech.com header.i=@uniontech.com header.b=kwUrPv/6; arc=none smtp.client-ip=18.169.211.239 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=uniontech.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=uniontech.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=uniontech.com header.i=@uniontech.com header.b="kwUrPv/6" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=uniontech.com; s=onoh2408; t=1787796950; bh=dY0Ane/g6w6slG4WVya3Y1rgTK4uIbhwmWsfZq4NOqM=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=kwUrPv/6dRCuB5xGFEV/4IejvozKU13Y5s4J95ScEC2GfBUewQfXO5w2gAy8Em5to qL8wcqdc25w3jSah/HXKQIJuKPpu6uC4pPs+XlLq3UevXGp0HHoKA+8dlHsm2FzGD8 LHHTEWSgxfNbvSq0zHerGhQOb0MdHSOO/x5h8nC4= X-QQ-mid: esmtpgz10t1787796930ta39a6dc6 X-QQ-Originating-IP: Vr/DIm68OfOsFIB+dMR1e+jE5N+2Xsb6EvYj4ckGA8I= Received: from zzz-PC ( [113.57.152.160]) by bizesmtp.qq.com (ESMTP) with id ; Thu, 27 Aug 2026 10:15:21 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 1 X-BIZMAIL-ID: 9858402169651406958 EX-QQ-RecipientCnt: 7 From: zhaozhengzhuo@uniontech.com To: sj@kernel.org, shuah@kernel.org Cc: damon@lists.linux.dev, linux-mm@kvack.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, zhaozhengzhuo Subject: [PATCH] selftests/damon: prevent remaining cross-object state pollution Date: Thu, 27 Aug 2026 10:14:52 +0800 Message-ID: <38E4AAAAEDFCC283+20260827021515.1316838-1-zhaozhengzhuo@uniontech.com> X-Mailer: git-send-email 2.50.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-QQ-SENDSIZE: 520 Feedback-ID: esmtpgz:uniontech.com:qybglogicsvrgz:qybglogicsvrgz5b-2 X-QQ-XMAILINFO: MGeqoSbHfHK69bPxTAzoCJdhw2kwrmioHHsWR2DTvlVmG1nTExeaCLmY yzvlV+n+exkh3TYHz2ABo5dBBN4WQLdVLhEnu1Z/3KY43UCV242r2NDTQ1qqxIgDTUUeZWQ Bpt2v4CgEssYMcGLPMX8hm/m2PgRaZgIp9ERA0dLwN50XptZLf98pxJrL8teIvls/2vlDNc 3qJGeqksIFJlQjb0Qyixhx8ZgI97KuJGS3uTE3BPryw7lORyxvpchEfzpg46voK1PVUrIvc cy/k6OdsYFFF5nOZzdAFpDmQgZV0IRTB4lzc5zisWHtJvSI1e9Rm9HF9GhbFa3SnHBIJcCf vcN3cIaBzdvLAWI5V3kWocBHzcy3SQvI4IUMQhNTyTUzrtCW6bVHwuUEXHij0C24GdGgW9F I4G9CarW9m4jSK2CrM2Y0XfMJkYBo7+BiyiAJ02a6hRC4rdVWsfmQAZGkZSPUEmGtmOzbCY KqkEvhGnfn4kehkwuDY6eT749wO2y4wwkdKfO30sGXNEZG1W0Xa1Wx/ecAhkykcHJ1dKqj4 1Gb83J8AiGtpHhEeYg1fI+STmR7CsOE32KidDWuOag1Sfj+rJ70UtUQEV70jHXRdV2gO0yI wFEU6gMBcU0g+UCFt8ocoOQoN3e4D5/YeK+aCD6btwIICqIf5fG3LEUYOd/ofH0R35epA78 TX+dezv1L+P0T4aykeUrGEcobQqJJkD+yux7LeUduvjrpJTHly9dUfgLvEpVbQDgfg3W4+f ZLAxyj1vkD6c7lMpt5akJc7DN7ngtbnPPTgxjBs+KjxHxwSYdwP+H9Chl9iHUvAlWLHNWeM Hzp777pdeRNr7Lz8jo6g6e0ttOIK7eNZpDGrlvMmCONmhkrJDopamsWcFozg2Sw87U7X4T9 8l8Zn5wVacspNlod9pbswn4kZrVhbR5TZfEWjiXXy0i/k2hI4gOyg+uKvbG2cHSJ8+GIRdT 3jsPkDMd8FG6r/YTkJDfnjTcUGCiSsy90o+fGzldJvFUDKxIn606/xyD3EkWTx4nHcSo9/v 1PC1GQ9rXFN/ZCRyXx7H7L/xYr/SUNHKuHz6iDs8jbx/DKSqJO01sN4/zFw4M= X-QQ-XMRINFO: MSVp+SPm3vtSI1QTLgDHQqIV1w2oNKDqfg== X-QQ-RECHKSPAM: 0 Content-Type: text/plain; charset="utf-8" From: zhaozhengzhuo _damon_sysfs.py defines constructors with mutable default arguments, including DamosAccessPattern(), DamosQuota(), DamosWatermarks(), DamosDests(), IntervalsGoal(), and empty lists. Default arguments are evaluated once at function definition time. Damos() instances created without explicit arguments therefore share the same DamosQuota(), and the other default-constructed sub-objects and lists are shared in the same way. The sub-objects keep back-pointers to their owner scheme, so constructing the second Damos() rebinds the shared quota's scheme pointer to the second object. An item appended to one object's default contexts or filters list is also visible from other default-constructed objects. The shared state can corrupt test configurations. DamosQuota.sysfs_dir() derives the sysfs directory from its scheme pointer, so operating on the first scheme's default quota may write to the second scheme's directory. The wrong values often match the defaults, so tests still pass, but the behavior depends on object creation order. Commit 8319dadcbd81 ("selftests/damon: prevent cross-context state pollution in DamonCtx") fixed the same pattern in DamonCtx only. Fix the remaining constructors by defaulting to None and creating fresh objects or lists inside each constructor. Explicit arguments keep their previous behavior. Signed-off-by: zhaozhengzhuo Reviewed-by: SJ Park --- tools/testing/selftests/damon/_damon_sysfs.py | 38 ++++++++++++++----- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/tools/testing/selftests/damon/_damon_sysfs.py b/tools/testing/= selftests/damon/_damon_sysfs.py index e6a2265d721e..f604b7d6530b 100644 --- a/tools/testing/selftests/damon/_damon_sysfs.py +++ b/tools/testing/selftests/damon/_damon_sysfs.py @@ -321,8 +321,10 @@ class DamosFilters: filters =3D None scheme =3D None # owner scheme =20 - def __init__(self, name, filters=3D[]): + def __init__(self, name, filters=3DNone): self.name =3D name + if filters is None: + filters =3D [] self.filters =3D filters for idx, filter_ in enumerate(self.filters): filter_.idx =3D idx @@ -368,7 +370,9 @@ class DamosDests: dests =3D None scheme =3D None # owner scheme =20 - def __init__(self, dests=3D[]): + def __init__(self, dests=3DNone): + if dests is None: + dests =3D [] self.dests =3D dests for idx, dest in enumerate(self.dests): dest.idx =3D idx @@ -426,15 +430,21 @@ class Damos: stats =3D None tried_regions =3D None =20 - def __init__(self, action=3D'stat', access_pattern=3DDamosAccessPatter= n(), - quota=3DDamosQuota(), watermarks=3DDamosWatermarks(), - core_filters=3D[], ops_filters=3D[], filters=3D[], target= _nid=3D0, - dests=3DDamosDests(), apply_interval_us=3D0): + def __init__(self, action=3D'stat', access_pattern=3DNone, quota=3DNon= e, + watermarks=3DNone, core_filters=3DNone, ops_filters=3DNon= e, + filters=3DNone, target_nid=3D0, dests=3DNone, + apply_interval_us=3D0): self.action =3D action + if access_pattern is None: + access_pattern =3D DamosAccessPattern() self.access_pattern =3D access_pattern self.access_pattern.scheme =3D self + if quota is None: + quota =3D DamosQuota() self.quota =3D quota self.quota.scheme =3D self + if watermarks is None: + watermarks =3D DamosWatermarks() self.watermarks =3D watermarks self.watermarks.scheme =3D self =20 @@ -448,6 +458,8 @@ class Damos: self.filters.scheme =3D self =20 self.target_nid =3D target_nid + if dests is None: + dests =3D DamosDests() self.dests =3D dests self.dests.scheme =3D self =20 @@ -568,10 +580,12 @@ class DamonAttrs: context =3D None =20 def __init__(self, sample_us=3D5000, aggr_us=3D100000, - intervals_goal=3DIntervalsGoal(), update_us=3D1000000, - min_nr_regions=3D10, max_nr_regions=3D1000): + intervals_goal=3DNone, update_us=3D1000000, min_nr_region= s=3D10, + max_nr_regions=3D1000): self.sample_us =3D sample_us self.aggr_us =3D aggr_us + if intervals_goal is None: + intervals_goal =3D IntervalsGoal() self.intervals_goal =3D intervals_goal self.intervals_goal.attrs =3D self self.update_us =3D update_us @@ -703,7 +717,9 @@ class Kdamond: idx =3D None # index of this kdamond between siblings kdamonds =3D None # parent =20 - def __init__(self, contexts=3D[], refresh_ms=3DNone): + def __init__(self, contexts=3DNone, refresh_ms=3DNone): + if contexts is None: + contexts =3D [] self.contexts =3D contexts self.refresh_ms =3D refresh_ms for idx, context in enumerate(self.contexts): @@ -853,7 +869,9 @@ class Kdamond: class Kdamonds: kdamonds =3D [] =20 - def __init__(self, kdamonds=3D[]): + def __init__(self, kdamonds=3DNone): + if kdamonds is None: + kdamonds =3D [] self.kdamonds =3D kdamonds for idx, kdamond in enumerate(self.kdamonds): kdamond.idx =3D idx --=20 2.50.1