From nobody Fri Dec 19 00:16:41 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id BD330C4167B for ; Sat, 2 Dec 2023 00:10:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229447AbjLBAKV (ORCPT ); Fri, 1 Dec 2023 19:10:21 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59650 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235375AbjLBAKE (ORCPT ); Fri, 1 Dec 2023 19:10:04 -0500 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6C0F41FC1 for ; Fri, 1 Dec 2023 16:09:07 -0800 (PST) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1C2B1C433C8; Sat, 2 Dec 2023 00:08:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1701475690; bh=GC7hLao6eamt5j9k8hcen8vPzgOkrgeme7Xf5lpgbH0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ftiBRtoD5yl3wEraHqbN9wNqd+G6GNBLIgbbxpKOrAHe8oFCL7SBEpqsjBQ3FBZjl kJ0M6ueGJRGdyNixjGCs/yCwrSiN7nBkW5cf+rEdlaQjsoqvMrJtS6mUTqdMYIUrWG duoCJbg0mJe1uhfD2luVEvn0EEQBvfItemXsQ8n24Xxtl1H/RsVHr3Kj0QU4Wz+mUM 9zSYm9L2V6rsZyDO5M2QQmhJldTJuxZGroKBuSpCk5DHoBxirlz8Csr0eOaiPeLFmM MHlCMPu6dHhXS7RgkofjSyJaxpu2deByYIQbzJC6XJolAfJ8xa8JM9pIzZOPL0nDHA LsMkoitTUar3g== From: SeongJae Park Cc: SeongJae Park , Andrew Morton , Shuah Khan , damon@lists.linux.dev, linux-mm@kvack.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH 1/5] selftests/damon: add a DAMON interface wrapper python module Date: Sat, 2 Dec 2023 00:08:02 +0000 Message-Id: <20231202000806.46210-2-sj@kernel.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231202000806.46210-1-sj@kernel.org> References: <20231202000806.46210-1-sj@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable To: unlisted-recipients:; (no To-header on input) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" DAMON sysfs interface supports almost every DAMON functionality. For that, it provides a number of files and hierarchies that not simple to be manually manipulated, or writing shell script every time. For the reason, DAMON is not having good functionality selftests. Adding an existing DAMON user space tool and using it could also be a way, but it would add unnecessarily huge change that not essential for the test purpose. Write a minimum python module that can further extended to be used as an easy-to-use DAMON functionality test purpose DAMON user interface wrapper. Note that this commit is implementing only basic data structures for representing the sysfs files. More operations will be implemented by following commits, as needed for specific real test cases. Signed-off-by: SeongJae Park --- tools/testing/selftests/damon/_damon.py | 102 ++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 tools/testing/selftests/damon/_damon.py diff --git a/tools/testing/selftests/damon/_damon.py b/tools/testing/selfte= sts/damon/_damon.py new file mode 100644 index 000000000000..78101846ab66 --- /dev/null +++ b/tools/testing/selftests/damon/_damon.py @@ -0,0 +1,102 @@ +# SPDX-License-Identifier: GPL-2.0 + +class DamosAccessPattern: + size =3D None + nr_accesses =3D None + age =3D None + scheme =3D None + + def __init__(self, size=3DNone, nr_accesses=3DNone, age=3DNone): + self.size =3D size + self.nr_accesses =3D nr_accesses + self.age =3D age + + if self.size =3D=3D None: + self.size =3D [0, 2**64 - 1] + if self.nr_accesses =3D=3D None: + self.nr_accesses =3D [0, 2**64 - 1] + if self.age =3D=3D None: + self.age =3D [0, 2**64 - 1] + +class Damos: + action =3D None + access_pattern =3D None + # todo: Support quotas, watermarks, stats, tried_regions + idx =3D None + context =3D None + + def __init__(self, action=3D'stat', access_pattern=3DDamosAccessPatter= n()): + self.action =3D action + self.access_pattern =3D access_pattern + self.access_pattern.scheme =3D self + +class DamonTarget: + pid =3D None + # todo: Support target regions if test is made + idx =3D None + context =3D None + + def __init__(self, pid): + self.pid =3D pid + +class DamonAttrs: + sample_us =3D None + aggr_us =3D None + update_us =3D None + min_nr_regions =3D None + max_nr_regions =3D None + context =3D None + + def __init__(self, sample_us=3D5000, aggr_us=3D100000, update_us=3D100= 0000, + min_nr_regions=3D10, max_nr_regions=3D1000): + self.sample_us =3D sample_us + self.aggr_us =3D aggr_us + self.update_us =3D update_us + self.min_nr_regions =3D min_nr_regions + self.max_nr_regions =3D max_nr_regions + +class DamonCtx: + ops =3D None + monitoring_attrs =3D None + targets =3D None + schemes =3D None + kdamond =3D None + idx =3D None + + def __init__(self, ops=3D'paddr', monitoring_attrs=3DDamonAttrs(), tar= gets=3D[], + schemes=3D[]): + self.ops =3D ops + self.monitoring_attrs =3D monitoring_attrs + self.monitoring_attrs.context =3D self + + self.targets =3D targets + for idx, target in enumerate(self.targets): + target.idx =3D idx + target.context =3D self + + self.schemes =3D schemes + for idx, scheme in enumerate(self.schemes): + scheme.idx =3D idx + scheme.context =3D self + +class Kdamond: + state =3D None + pid =3D None + contexts =3D None + idx =3D None # index of this kdamond between siblings + kdamonds =3D None # parent + + def __init__(self, contexts=3D[]): + self.contexts =3D contexts + for idx, context in enumerate(self.contexts): + context.idx =3D idx + context.kdamond =3D self + +class Kdamonds: + kdamonds =3D [] + + def __init__(self, kdamonds=3D[]): + self.kdamonds =3D kdamonds + for idx, kdamond in enumerate(self.kdamonds): + kdamond.idx =3D idx + kdamond.kdamonds =3D self --=20 2.34.1