Received: by 2002:a05:6358:701b:b0:131:369:b2a3 with SMTP id 27csp267637rwo; Fri, 21 Jul 2023 11:30:54 -0700 (PDT) X-Google-Smtp-Source: APBJJlHCP1A/eDOgLNKU8ygkUjboxkzS7G9/IIo84l/AWZjIKEFU1/Iava1RAORBTMm387NmQuUs X-Received: by 2002:a05:6a00:1911:b0:63d:3339:e967 with SMTP id y17-20020a056a00191100b0063d3339e967mr922249pfi.19.1689964254574; Fri, 21 Jul 2023 11:30:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689964254; cv=none; d=google.com; s=arc-20160816; b=E9r8AhjBBVzi06D7igdpZm0pZA/6dP8JR5TtASkOBKqwukevQfKazzRvYkslS1codo Pg5dfW3G5CSE3k3osNUPoJjf3nRSGET9qMW4VOjx05ehyazrkg28HuFAe3R/wyW2SHSB KFo4kF/fGP80UQGFQeyRHRH9A4K+rS32q/9TU75ecjOt9WqWYdBJV/jk2DnHe+HWrvyK s8uZVCLZXFciagfgcGhkNYwON4tXgwJeI/zyAywZuFpbXB3dlZrzjszHiA5TK1rlhmvJ XbxpGd6IajN63xTd+JdUJoVit/lZ7/fpUvtrNFxevLEOL7M9VRel36sIRjhtM5TiZOGV 6VsQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:to:from:date:dkim-signature; bh=dpJVh7Wa8yjpHxUJX1BOdNbTC2pXJ0eBIYFHqeqxfJM=; fh=74JdZCcncRx9vhK0g0jCPyLh0X9SLH8kcZrk5gmejJ4=; b=0RCRqghUfF2ujH3f2UbvzG9MQEajFPo7+xbwksXLYEo+gi7QtCxUIkeeOiaufDrNjk YPB78dCEhjXt921tO5mTQJ2fCbKH4Bfp5G1jodVS1rNjgJfwWXlYICwPdYchjLdZSjxu 9XtJArgk26rGU1NhWI/+xabwxwBd5OXf3ZArVlaBVPeQaLD+FIuzeyngsut26i8atzBS 6eWZjTb1dcafbMsckiOtyhVmZljBIGfwhPmpNOs3a8hoov63dY0FV9rFDLYiOKjnlDWu Y5Qy4Hdywln9+aj9VvwSjeAU7nXjD35mv28i57FRLQ/hgzJo6ZkfZteCS+is5+8zEeYW MthQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b=sX3XNSv7; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id ay42-20020a056a00302a00b00675262821cdsi3496870pfb.113.2023.07.21.11.30.39; Fri, 21 Jul 2023 11:30:54 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b=sX3XNSv7; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229727AbjGURzt (ORCPT + 99 others); Fri, 21 Jul 2023 13:55:49 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53370 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229663AbjGURzr (ORCPT ); Fri, 21 Jul 2023 13:55:47 -0400 Received: from mail-pf1-x42c.google.com (mail-pf1-x42c.google.com [IPv6:2607:f8b0:4864:20::42c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AF4543583; Fri, 21 Jul 2023 10:55:46 -0700 (PDT) Received: by mail-pf1-x42c.google.com with SMTP id d2e1a72fcca58-6687096c6ddso1507122b3a.0; Fri, 21 Jul 2023 10:55:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1689962146; x=1690566946; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=dpJVh7Wa8yjpHxUJX1BOdNbTC2pXJ0eBIYFHqeqxfJM=; b=sX3XNSv7IowWcyMhaJeFw1o5fNoqWzquDZ2f92X7lqyrorbBu6FRnYJ4xE1hNvOwkz obMhfFkuDhXJmlRfyvO+nUMBpVWnI6LF3mHPDR6znXemRwqKEnGIfVpC4M/QgtD0YJ44 qQhKFjTsnVjKwlqY2CILI8TsizvIeYp7UELyKbgzpiSP4E7UNq0e7gk8ZRvWbLNFvDwt sHv/SphQaSML2Ko6kD0FLk8iyTNV7MPc+eZNQ+33gxPsiJisndNokRUGrSS2tu0r6h1a zG89lK1kBdxkXPGl9QPBNvP9G9mb7sNYkHIQepnSdDYSNacBew3KrTChieD33FQFPuW5 O7XQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689962146; x=1690566946; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:to:from:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=dpJVh7Wa8yjpHxUJX1BOdNbTC2pXJ0eBIYFHqeqxfJM=; b=XvDTl7vBtU4oIs4sajufigen77zQEi5tOzAiAhl6sUxIltyolg/IarfeKJWt6TQsYB KaG0pZX9Nv+07z4B5IfY/86ghztwJ64GiPJdVINUdoVGdc1bYJ9NaBlRv81PxicNj2Lr aC9K/OWPCjpCd15pqki9dg9B1r0RzInW96H7pV+5jQKM1hQilL3eddCdoSIGLHhfgPvt zB5rNHBAF3a/4ResmcHtaShWOPjgw37k9cRUN9Y9Jmah5kSfor9VRa0J7cogspvaLHmJ LnTTZ8cyKYZlX94BHGj4tCO8IyAKqMNxXWpDqTNDYvvLjGsCBeedZUbecQG2+82Ep+hF zbCA== X-Gm-Message-State: ABy/qLba2cJxq7xDncRmN1lhFhBf1vufMm1lPkooUXyBOAmMqHa5dt7R 03E1gJLJyGEyT38DApOjJJE= X-Received: by 2002:a05:6a20:12c9:b0:133:c9d0:75ff with SMTP id v9-20020a056a2012c900b00133c9d075ffmr2741086pzg.42.1689962146008; Fri, 21 Jul 2023 10:55:46 -0700 (PDT) Received: from yoga ([2400:1f00:13:cde2:d588:8109:e86b:839c]) by smtp.gmail.com with ESMTPSA id x15-20020a1709027c0f00b001bb4f9d86ebsm3813659pll.23.2023.07.21.10.55.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Jul 2023 10:55:45 -0700 (PDT) Date: Fri, 21 Jul 2023 23:25:38 +0530 From: Anup Sharma To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , Anup Sharma , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 5/8] perf scripts python: Implement add sample function and thread processing Message-ID: <4442f4b1ab4c7317cf940560a3a285fcdfbeeb08.1689961706.git.anupnewsmail@gmail.com> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The intern_stack function is responsible for retrieving or creating a stack_id based on the provided frame_id and prefix_id. It first generates a key using the frame_id and prefix_id values. If the stack corresponding to the key is found in the stackMap, it is returned. Otherwise, a new stack is created by appending the prefix_id and frame_id to the stackTable. The key and the index of the newly created stack are added to the stackMap for future reference. The _intern_frame function is responsible for retrieving or creating a frame_id based on the provided frame string. If the frame_id corresponding to the frameString is found in the frameMap, it is returned. Otherwise, a new frame is created by appending relevant information to the frameTable and adding the frameString to the string_id through _intern_string. The _intern_string function will gets a matching string, or saves the new string and returns a String ID. Signed-off-by: Anup Sharma --- tools/perf/scripts/python/perf-gecko.py | 54 +++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/tools/perf/scripts/python/perf-gecko.py b/tools/perf/scripts/python/perf-gecko.py index f0d29f48467e..35e25e64d6d9 100644 --- a/tools/perf/scripts/python/perf-gecko.py +++ b/tools/perf/scripts/python/perf-gecko.py @@ -13,6 +13,7 @@ import os import sys import json import argparse +from functools import reduce from dataclasses import dataclass, field from typing import List, Dict, Optional, NamedTuple, Set, Tuple, Any @@ -39,6 +40,10 @@ CATEGORIES = None # The product name is used by the profiler UI to show the Operating system and Processor. PRODUCT = os.popen('uname -op').read().strip() +# The category index is used by the profiler UI to show the color of the flame graph. +USER_CATEGORY_INDEX = 0 +KERNEL_CATEGORY_INDEX = 1 + # https://github.com/firefox-devtools/profiler/blob/53970305b51b9b472e26d7457fee1d66cd4e2737/src/types/gecko-profile.js#L156 class Frame(NamedTuple): string_id: StringID @@ -99,6 +104,55 @@ class Thread: stackMap: Dict[Tuple[Optional[int], int], int] = field(default_factory=dict) frameMap: Dict[str, int] = field(default_factory=dict) + def _intern_stack(self, frame_id: int, prefix_id: Optional[int]) -> int: + """Gets a matching stack, or saves the new stack. Returns a Stack ID.""" + key = f"{frame_id}" if prefix_id is None else f"{frame_id},{prefix_id}" + # key = (prefix_id, frame_id) + stack_id = self.stackMap.get(key) + if stack_id is None: + # return stack_id + stack_id = len(self.stackTable) + self.stackTable.append(Stack(prefix_id=prefix_id, frame_id=frame_id)) + self.stackMap[key] = stack_id + return stack_id + + def _intern_string(self, string: str) -> int: + """Gets a matching string, or saves the new string. Returns a String ID.""" + string_id = self.stringMap.get(string) + if string_id is not None: + return string_id + string_id = len(self.stringTable) + self.stringTable.append(string) + self.stringMap[string] = string_id + return string_id + + def _intern_frame(self, frame_str: str) -> int: + """Gets a matching stack frame, or saves the new frame. Returns a Frame ID.""" + frame_id = self.frameMap.get(frame_str) + if frame_id is not None: + return frame_id + frame_id = len(self.frameTable) + self.frameMap[frame_str] = frame_id + string_id = self._intern_string(frame_str) + + symbol_name_to_category = KERNEL_CATEGORY_INDEX if frame_str.find('kallsyms') != -1 \ + or frame_str.find('/vmlinux') != -1 \ + or frame_str.endswith('.ko)') \ + else USER_CATEGORY_INDEX + + self.frameTable.append(Frame( + string_id=string_id, + relevantForJS=False, + innerWindowID=0, + implementation=None, + optimizations=None, + line=None, + column=None, + category=symbol_name_to_category, + subcategory=None, + )) + return frame_id + def _to_json_dict(self) -> Dict: """Converts current Thread to GeckoThread JSON format.""" # Gecko profile format is row-oriented data as List[List], -- 2.34.1