From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.3 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLACK,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AA911C433E2 for ; Mon, 20 Jul 2020 06:55:45 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 44B942065D for ; Mon, 20 Jul 2020 06:55:45 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=intel.onmicrosoft.com header.i=@intel.onmicrosoft.com header.b="fqtddxvI" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 44B942065D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id DAAD86B0005; Mon, 20 Jul 2020 02:55:44 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id D84B06B0006; Mon, 20 Jul 2020 02:55:44 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id BD7D16B0007; Mon, 20 Jul 2020 02:55:44 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0068.hostedemail.com [216.40.44.68]) by kanga.kvack.org (Postfix) with ESMTP id A39F16B0005 for ; Mon, 20 Jul 2020 02:55:44 -0400 (EDT) Received: from smtpin08.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay01.hostedemail.com (Postfix) with ESMTP id 5E964181BDCA6 for ; Mon, 20 Jul 2020 06:55:44 +0000 (UTC) X-FDA: 77057543808.08.nerve29_240d45426f22 Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin08.hostedemail.com (Postfix) with ESMTP id 9006C181E6B10 for ; Mon, 20 Jul 2020 06:53:30 +0000 (UTC) X-HE-Tag: nerve29_240d45426f22 X-Filterd-Recvd-Size: 20709 Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by imf45.hostedemail.com (Postfix) with ESMTP for ; Mon, 20 Jul 2020 06:53:28 +0000 (UTC) IronPort-SDR: 8LVUL/3XPc/ohagbuPQ0FmVXRAJvsDlZhnIrlWz9AFXNjxj0wKiga078C9AhFk3VjtpnWJ4xy5 ScPhht9tEDtA== X-IronPort-AV: E=McAfee;i="6000,8403,9687"; a="147819203" X-IronPort-AV: E=Sophos;i="5.75,374,1589266800"; d="scan'208";a="147819203" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Jul 2020 23:53:26 -0700 IronPort-SDR: tsOD/ZY7mnVweGqMn5Dp4i47nUv4vEK4UtSsEEMK937mq8cDDNSt1EowazSk+3O0WWiaBENq+J 5vtXvTm/jSvg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.75,374,1589266800"; d="scan'208";a="317929399" Received: from fmsmsx107.amr.corp.intel.com ([10.18.124.205]) by orsmga008.jf.intel.com with ESMTP; 19 Jul 2020 23:53:25 -0700 Received: from fmsmsx114.amr.corp.intel.com (10.18.116.8) by fmsmsx107.amr.corp.intel.com (10.18.124.205) with Microsoft SMTP Server (TLS) id 14.3.439.0; Sun, 19 Jul 2020 23:53:25 -0700 Received: from FMSEDG002.ED.cps.intel.com (10.1.192.134) by FMSMSX114.amr.corp.intel.com (10.18.116.8) with Microsoft SMTP Server (TLS) id 14.3.439.0; Sun, 19 Jul 2020 23:53:24 -0700 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (104.47.57.169) by edgegateway.intel.com (192.55.55.69) with Microsoft SMTP Server (TLS) id 14.3.439.0; Sun, 19 Jul 2020 23:53:18 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=b3PkeCMhu3tPVN2e1tjqqI4wOZOQ1DATY9TqEOQ16A2qtXm4En0R3v46GesN4IG6rnH7YDABsgw+3d8f8YxA0oa9Lqi/QmFRutMfHtjXTHGwMjpWrtiHsp4JRQ3fcmDDjdiO1tgehJ6gh/8J5fAU1Di4f3AbZ2s3Q5pRiY5GHpr9xKBk/2URAgFGVEFgLLBZTrbwGHD3EzLj9JewaqtT4F1PbtKx6sFYopbGM5L+5ZVTBtcusYP9MYNIco2z/M/oZtzsWn+O3Jk3p+i8rsvz3cHyygCUIRvrGXTvfBv3y1YoCWRuW1WLrrBRKY/GCPg6u+IEQozf357JggiWercUpA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=7I3pNh3edqbFTBXZAXqt1XvcjlpbvwpzIx6QlFnkfFo=; b=YARAfZ7sfZYULsFwyOpat6rpHgggrDQIgGmlNV/G76MLsnc8+cbYAwN6fg6gnjgIBIx1iwTUDyQ+lmFeTBeYI6gItLqx1cJ8Fzji4+YOwp5Q/nbt4c2QEiCW2TKVUzhQoPx9g5zsoRNyvEewaXhrOZm4xSodEhm+/PLhOF+1L3d4yBFDoaCPUwfj8v5LyenzOfwOLfATCixSwfflG4Fqpn0l/uy/rrTxOlUxbO9j5K9cDErvsaWfbetgZBb1PMtHM0DkSB15TRrDVMW29q7B4JVGPsmbrBwFMQfJbPMlVdQIsh7fczUITL56CUAXsgYXsuMEsc7wUJcVF+mpQw4V8w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel.onmicrosoft.com; s=selector2-intel-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=7I3pNh3edqbFTBXZAXqt1XvcjlpbvwpzIx6QlFnkfFo=; b=fqtddxvImnalL4cy31+neZstV1/PNm7+iTQM857TKYkNn6HPci4tdpw7+AJWN7J/IybAsGk66xUyfvvWsPVv5E2efUwQx0myvtLctsddH2HFteLo7ZikJQIYl6s3WCkkkoxSTx8ifS2JhXFxRiQ+nYzrjKtPb9nO8hF/rOf4ZTI= Received: from DM5PR11MB1595.namprd11.prod.outlook.com (2603:10b6:4:c::14) by DM6PR11MB3834.namprd11.prod.outlook.com (2603:10b6:5:137::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3195.24; Mon, 20 Jul 2020 06:53:14 +0000 Received: from DM5PR11MB1595.namprd11.prod.outlook.com ([fe80::a42f:221e:3902:e3e5]) by DM5PR11MB1595.namprd11.prod.outlook.com ([fe80::a42f:221e:3902:e3e5%6]) with mapi id 15.20.3195.025; Mon, 20 Jul 2020 06:53:14 +0000 From: "Du, Fan" To: SeongJae Park , "akpm@linux-foundation.org" CC: SeongJae Park , "Jonathan.Cameron@Huawei.com" , "aarcange@redhat.com" , "acme@kernel.org" , "alexander.shishkin@linux.intel.com" , "amit@kernel.org" , "benh@kernel.crashing.org" , "brendan.d.gregg@gmail.com" , "brendanhiggins@google.com" , "cai@lca.pw" , "colin.king@canonical.com" , "corbet@lwn.net" , "david@redhat.com" , "dwmw@amazon.com" , "foersleo@amazon.de" , "irogers@google.com" , "jolsa@redhat.com" , "kirill@shutemov.name" , "mark.rutland@arm.com" , "mgorman@suse.de" , "minchan@kernel.org" , "mingo@redhat.com" , "namhyung@kernel.org" , "peterz@infradead.org" , "rdunlap@infradead.org" , "riel@surriel.com" , "rientjes@google.com" , "rostedt@goodmis.org" , "rppt@kernel.org" , "sblbir@amazon.com" , "shakeelb@google.com" , "shuah@kernel.org" , "sj38.park@gmail.com" , "snu@amazon.de" , "vbabka@suse.cz" , "vdavydov.dev@gmail.com" , "yang.shi@linux.alibaba.com" , "Huang, Ying" , "linux-damon@amazon.com" , "linux-mm@kvack.org" , "linux-doc@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "Du, Fan" Subject: RE: [RFC v5 10/11] tools/damon/record: Support NUMA specific recording Thread-Topic: [RFC v5 10/11] tools/damon/record: Support NUMA specific recording Thread-Index: AQHWVG5o2+JOdRAPN0yNRzM2ym1J+akQFAMw Date: Mon, 20 Jul 2020 06:53:14 +0000 Message-ID: References: <20200707144540.21216-1-sjpark@amazon.com> <20200707144540.21216-11-sjpark@amazon.com> In-Reply-To: <20200707144540.21216-11-sjpark@amazon.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-version: 11.2.0.6 dlp-product: dlpe-windows dlp-reaction: no-action authentication-results: amazon.com; dkim=none (message not signed) header.d=none;amazon.com; dmarc=none action=none header.from=intel.com; x-originating-ip: [192.198.147.210] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 16e15a01-0e45-40ce-a9ac-08d82c799339 x-ms-traffictypediagnostic: DM6PR11MB3834: x-ld-processed: 46c98d88-e344-4ed4-8496-4ed7712e255d,ExtAddr x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:576; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: nfMob/DZCmPsq0vCe0pUHipTDWGwzEINYMq2RwpK9uj2Qglu1eQEbywxZkA6M+WUn36ERvPbHF1HV4eaoZY00vYy0LX/GUFJWgLUiz4diW+7Q7fXNFMdRiZI5RtfXNQxCRnx/lK/1lAsKiZ3H7kG8WgpG+ZfaIGOOvdJwNjwVDIqYEFvD+NhhMejX0J78us5EnwuHMs55N7NCQ+NDT+qOCunxwAvDwgcNWa+2tLz6rf4TelbXV+3mg1+Ov0GGPfLsWjOIU51kWt6Y8MBjTryeTTJKAqMozbzwirO+OYG6Nd12u0tTQ0gXcJgGq/z6f1UdG+IosFrUFqK1ZDkl9uogPszYi+hCAurrD/YOK3H8Td9RoxaYH9dEMYD3CChOFiRyRFSYQlilGanxsrIsyUgFw== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM5PR11MB1595.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFTY:;SFS:(4636009)(396003)(346002)(366004)(376002)(136003)(39860400002)(7416002)(7406005)(83380400001)(7696005)(8936002)(66946007)(71200400001)(4326008)(9686003)(55016002)(33656002)(66446008)(66556008)(76116006)(86362001)(316002)(5660300002)(2906002)(8676002)(64756008)(186003)(6506007)(966005)(110136005)(52536014)(54906003)(478600001)(26005)(66476007);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata: R+PNh8mV+oEXIuCtvOOYarhk+zN0JvIYui5HZi8yK3J9cO+FkrTxi9x4cdC66zt9h8k2WiHwMeUuvhKge8kI4ayGDnXLZhmsfP8gSsUuYoyS+yoP99BJJ8d/UuP1eLi33lQXPYENsw9g6tfeKY2ET/TTjmjSuFkf7PiQLfN+gNXFjsMbeoOfGLrOkurPWn1wz+/IihA6Cm8qU/CcSx9gYdrAMHB+MaxWtzSpv63h7iQm1K5OsUjOeXnaw76b82VOJ5OaF/ltGju0vifw86aFeEI/sfhzvvj+OgjsV/wZzpRznXQ/U4YQKnpDIh3dUQXd9JkHT/EHrTWRMufwvC9MF+SSlsM38bvDVwmiWxjfol77x1aAJiU6TaNbqi1WlXLEdDXvI3XjhYRYypgr1s3b2aV3x4zs0fFsqEYb59wc9trpR5BlITpP1tC+0IlwD5/RaT2Co0jY4Oir4DpVwF8zUrlhsLvva1QRJhCdMi/56mi1gN8e8F3lEBCIImWxCf6/ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: DM5PR11MB1595.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 16e15a01-0e45-40ce-a9ac-08d82c799339 X-MS-Exchange-CrossTenant-originalarrivaltime: 20 Jul 2020 06:53:14.2121 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: JOhgf7gREztHMvpkH5wc84MC2l1JZu4gdjMmmwyuKe8ehsDWUDjK7hfYKoQoYEF4uTB3mzV8uCbRzsLPIfcZ6Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR11MB3834 X-OriginatorOrg: intel.com X-Rspamd-Queue-Id: 9006C181E6B10 X-Spamd-Result: default: False [0.00 / 100.00] X-Rspamd-Server: rspam01 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: >-----Original Message----- >From: owner-linux-mm@kvack.org On Behalf >Of SeongJae Park >Sent: Tuesday, July 7, 2020 10:46 PM >To: akpm@linux-foundation.org >Cc: SeongJae Park ; Jonathan.Cameron@Huawei.com; >aarcange@redhat.com; acme@kernel.org; alexander.shishkin@linux.intel.com; >amit@kernel.org; benh@kernel.crashing.org; brendan.d.gregg@gmail.com; >brendanhiggins@google.com; cai@lca.pw; colin.king@canonical.com; >corbet@lwn.net; david@redhat.com; dwmw@amazon.com; >foersleo@amazon.de; irogers@google.com; jolsa@redhat.com; >kirill@shutemov.name; mark.rutland@arm.com; mgorman@suse.de; >minchan@kernel.org; mingo@redhat.com; namhyung@kernel.org; >peterz@infradead.org; rdunlap@infradead.org; riel@surriel.com; >rientjes@google.com; rostedt@goodmis.org; rppt@kernel.org; >sblbir@amazon.com; shakeelb@google.com; shuah@kernel.org; >sj38.park@gmail.com; snu@amazon.de; vbabka@suse.cz; >vdavydov.dev@gmail.com; yang.shi@linux.alibaba.com; Huang, Ying >; linux-damon@amazon.com; linux-mm@kvack.org; >linux-doc@vger.kernel.org; linux-kernel@vger.kernel.org >Subject: [RFC v5 10/11] tools/damon/record: Support NUMA specific >recording > >From: SeongJae Park > >This commit updates the DAMON user space tool (damo-record) for NUMA >specific physical memory monitoring. With this change, users can >monitor accesses to physical memory of specific NUMA node. > >Signed-off-by: SeongJae Park >--- > tools/damon/_paddr_layout.py | 158 >+++++++++++++++++++++++++++++++++++ > tools/damon/record.py | 21 ++++- > 2 files changed, 178 insertions(+), 1 deletion(-) > create mode 100644 tools/damon/_paddr_layout.py > >diff --git a/tools/damon/_paddr_layout.py b/tools/damon/_paddr_layout.py >new file mode 100644 >index 000000000000..10056172db21 >--- /dev/null >+++ b/tools/damon/_paddr_layout.py >@@ -0,0 +1,158 @@ >+#!/usr/bin/env python3 >+# SPDX-License-Identifier: GPL-2.0 >+ >+import os >+ >+class PaddrRange: >+ start =3D None >+ end =3D None >+ nid =3D None >+ state =3D None >+ name =3D None >+ >+ def __init__(self, start, end, nid, state, name): >+ self.start =3D start >+ self.end =3D end >+ self.nid =3D nid >+ self.state =3D state >+ self.name =3D name >+ >+ def interleaved(self, prange): >+ if self.end <=3D prange.start: >+ return None >+ if prange.end <=3D self.start: >+ return None >+ return [max(self.start, prange.start), min(self.end, prange.end)] >+ >+ def __str__(self): >+ return '%x-%x, nid %s, state %s, name %s' % (self.start, self.end= , >+ self.nid, self.state, self.name) >+ >+class MemBlock: >+ nid =3D None >+ index =3D None >+ state =3D None >+ >+ def __init__(self, nid, index, state): >+ self.nid =3D nid >+ self.index =3D index >+ self.state =3D state >+ >+ def __str__(self): >+ return '%d (%s)' % (self.index, self.state) >+ >+ def __repr__(self): >+ return self.__str__() >+ >+def readfile(file_path): >+ with open(file_path, 'r') as f: >+ return f.read() >+ >+def collapse_ranges(ranges): >+ ranges =3D sorted(ranges, key=3Dlambda x: x.start) >+ merged =3D [] >+ for r in ranges: >+ if not merged: >+ merged.append(r) >+ continue >+ last =3D merged[-1] >+ if last.end !=3D r.start or last.nid !=3D r.nid or last.state != =3D r.state: >+ merged.append(r) >+ else: >+ last.end =3D r.end >+ return merged >+ >+def memblocks_to_ranges(blocks, block_size): >+ ranges =3D [] >+ for b in blocks: >+ ranges.append(PaddrRange(b.index * block_size, >+ (b.index + 1) * block_size, b.nid, b.state, None)) >+ >+ return collapse_ranges(ranges) >+ >+def memblock_ranges(): >+ SYSFS=3D'/sys/devices/system/node' >+ sz_block =3D int(readfile('/sys/devices/system/memory/block_size_byte= s'), >16) >+ sys_nodes =3D [x for x in os.listdir(SYSFS) if x.startswith('node')] >+ >+ blocks =3D [] >+ for sys_node in sys_nodes: >+ nid =3D int(sys_node[4:]) >+ >+ sys_node_files =3D os.listdir(os.path.join(SYSFS, sys_node)) >+ for f in sys_node_files: >+ if not f.startswith('memory'): >+ continue >+ index =3D int(f[6:]) >+ sys_state =3D os.path.join(SYSFS, sys_node, f, 'state') >+ state =3D readfile(sys_state).strip() >+ >+ blocks.append(MemBlock(nid, index, state)) >+ >+ return memblocks_to_ranges(blocks, sz_block) >+ >+def iomem_ranges(): >+ ranges =3D [] >+ >+ with open('/proc/iomem', 'r') as f: >+ # example of the line: '100000000-42b201fff : System RAM' >+ for line in f: >+ fields =3D line.split(':') >+ if len(fields) < 2: >+ continue >+ name =3D ':'.join(fields[1:]).strip() >+ addrs =3D fields[0].split('-') >+ if len(addrs) !=3D 2: >+ continue >+ start =3D int(addrs[0], 16) >+ end =3D int(addrs[1], 16) + 1 >+ ranges.append(PaddrRange(start, end, None, None, name)) >+ >+ return ranges Hi SeongJae Here on system with persistent memory, user can plug {all or portion of }pe= rsistent memory into buddy system with drivers from patchset[1] implemented. The persistent memory in this se= tup will be treated as normal system RAM, and have valid full-fledged page structure as well. For example, here is what /proc/iomem looks like in system with such config= uration on my testbed. 1840000000-963fffffff : Persistent Memory 1840000000-18be1fffff : namespace0.0 18c0000000-37bfffffff : dax0.0 18c0000000-37bfffffff : System RAM <- first 128G of persistent memory = corresponding to node 2 # numactl -H available: 3 nodes (0-2) node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 = 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 node 0 size: 95447 MB node 0 free: 92391 MB node 1 cpus: 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44= 45 46 47 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93= 94 95 node 1 size: 96733 MB node 1 free: 95670 MB node 2 cpus: node 2 size: 126976 MB node 2 free: 126935 MB node distances: node 0 1 2 0: 10 21 17 1: 21 10 28 2: 17 28 10 So here we have two ranges: 1840000000-963fffffff : Persistent Memory 18c0000000-37bfffffff : System RAM [1]: https://patchwork.kernel.org/cover/10829019/ >+def paddr_ranges(): >+ ranges1 =3D memblock_ranges() >+ ranges2 =3D iomem_ranges() >+ merged =3D [] >+ >+ for r in ranges1: >+ subsets =3D [] >+ for r2 in ranges2: >+ interleaved =3D r.interleaved(r2) >+ if interleaved =3D=3D None: >+ continue >+ >+ start, end =3D interleaved >+ left =3D None >+ if start > r.start: >+ left =3D PaddrRange(r.start, start, r.nid, r.state, r.nam= e) >+ subsets.append(left) >+ >+ middle =3D PaddrRange(start, end, r.nid, r.state, r.name) >+ if r2.nid: >+ middle.nid =3D r2.nid >+ if r2.state: >+ middle.state =3D r2.state >+ if r2.name: >+ middle.name =3D r2.name Memory block from numa node 2 will match with range "1840000000-963fffffff = : Persistent Memory" But take the name "Persistent memory", expected "System RAM" here. >+ subsets.append(middle) >+ r.start =3D end >+ if r.start < r.end: >+ subsets =3D [r] >+ >+ merged +=3D subsets >+ return merged >+ >+def pr_ranges(ranges): >+ print('#%12s %13s\tnode\tstate\tresource\tsize' % ('start', 'end')) >+ for r in ranges: >+ print('%13d %13d\t%s\t%s\t%s\t%d' % (r.start, r.end, r.nid, >+ r.state, r.name, r.end - r.start)) >+ >+def main(): >+ ranges =3D paddr_ranges() >+ >+ pr_ranges(ranges) >+ >+if __name__ =3D=3D '__main__': >+ main() >diff --git a/tools/damon/record.py b/tools/damon/record.py >index 416dca940c1d..8440a9818810 100644 >--- a/tools/damon/record.py >+++ b/tools/damon/record.py >@@ -12,6 +12,7 @@ import subprocess > import time > > import _damon >+import _paddr_layout > > def do_record(target, is_target_cmd, init_regions, attrs, old_attrs): > if os.path.isfile(attrs.rfile_path): >@@ -70,6 +71,8 @@ def set_argparser(parser): > help=3D'the target command or the pid to record') > parser.add_argument('-l', '--rbuf', metavar=3D'', type=3Dint, > default=3D1024*1024, help=3D'length of record result buffer') >+ parser.add_argument('--numa_node', metavar=3D'', type=3Dint, >+ help=3D'if target is \'paddr\', limit it to the numa node') > parser.add_argument('-o', '--out', metavar=3D'', type=3Dst= r, > default=3D'damon.data', help=3D'output file path') > >@@ -96,6 +99,18 @@ def default_paddr_region(): > ret =3D [start, end] > return ret > >+def paddr_region_of(numa_node): >+ regions =3D [] >+ default_region =3D default_paddr_region() >+ paddr_ranges =3D _paddr_layout.paddr_ranges() >+ for r in paddr_ranges: >+ if r.end <=3D default_region[0] or default_region[1] <=3D r.start= : >+ continue >+ if r.nid =3D=3D numa_node and r.name =3D=3D 'System RAM': >+ regions.append([r.start, r.end]) To profile physical address for numa node 2, above checking will not return= valid node 2 range i.e., 18c0000000-37bfffffff : System RAM, but empty ones. I tweaked the checking to match "Persistent Memory" also, it looks physical= address monitoring with numa node specified works from first glance. I'm willing to give it a try once you posted next updated version. >+ return regions >+ > def main(args=3DNone): > global orig_attrs > if not args: >@@ -113,12 +128,16 @@ def main(args=3DNone): > args.schemes =3D '' > new_attrs =3D _damon.cmd_args_to_attrs(args) > init_regions =3D _damon.cmd_args_to_init_regions(args) >+ numa_node =3D args.numa_node > target =3D args.target > > target_fields =3D target.split() > if target =3D=3D 'paddr': # physical memory address space > if not init_regions: >- init_regions =3D [default_paddr_region()] >+ if numa_node: >+ init_regions =3D paddr_region_of(numa_node) >+ else: >+ init_regions =3D [default_paddr_region()] > do_record(target, False, init_regions, new_attrs, orig_attrs) > elif not subprocess.call('which %s > /dev/null' % target_fields[0], > shell=3DTrue, executable=3D'/bin/bash'): >-- >2.17.1 >