The get_or_create_frame function is responsible for retrieving or
creating a frame based on the provided frameString. If the frame
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's 'data' array and adding the
frameString to the stringTable.
The index of the newly created frame is added to the frameMap.
Signed-off-by: Anup Sharma <anupnewsmail@gmail.com>
---
.../scripts/python/firefox-gecko-converter.py | 33 +++++++++++++++++++
1 file changed, 33 insertions(+)
diff --git a/tools/perf/scripts/python/firefox-gecko-converter.py b/tools/perf/scripts/python/firefox-gecko-converter.py
index 6f69c083d3ff..d5b9fb16e520 100644
--- a/tools/perf/scripts/python/firefox-gecko-converter.py
+++ b/tools/perf/scripts/python/firefox-gecko-converter.py
@@ -77,6 +77,39 @@ def process_event(param_dict):
stackMap[key] = stack
return stack
+ frameMap = dict()
+ def get_or_create_frame(frameString):
+ frame = frameMap.get(frameString)
+ if frame is None:
+ frame = len(frameTable['data'])
+ location = len(stringTable)
+ stringTable.append(frameString)
+ category = KERNEL_CATEGORY_INDEX if frameString.find('kallsyms') != -1 \
+ or frameString.find('/vmlinux') != -1 \
+ or frameString.endswith('.ko)') \
+ else USER_CATEGORY_INDEX
+ implementation = None
+ optimizations = None
+ line = None
+ relevantForJS = False
+ subcategory = None
+ innerWindowID = 0
+ column = None
+
+ frameTable['data'].append([
+ location,
+ relevantForJS,
+ innerWindowID,
+ implementation,
+ optimizations,
+ line,
+ column,
+ category,
+ subcategory,
+ ])
+ frameMap[frameString] = frame
+ return frame
+
def _addThreadSample(pid, tid, threadName, time_stamp, stack):
thread = thread_map.get(tid)
if not thread:
--
2.34.1
On Wed, Jul 5, 2023 at 12:48 PM Anup Sharma <anupnewsmail@gmail.com> wrote: > > The get_or_create_frame function is responsible for retrieving or > creating a frame based on the provided frameString. If the frame > 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's 'data' array and adding the > frameString to the stringTable. > > The index of the newly created frame is added to the frameMap. > > Signed-off-by: Anup Sharma <anupnewsmail@gmail.com> > --- > .../scripts/python/firefox-gecko-converter.py | 33 +++++++++++++++++++ > 1 file changed, 33 insertions(+) > > diff --git a/tools/perf/scripts/python/firefox-gecko-converter.py b/tools/perf/scripts/python/firefox-gecko-converter.py > index 6f69c083d3ff..d5b9fb16e520 100644 > --- a/tools/perf/scripts/python/firefox-gecko-converter.py > +++ b/tools/perf/scripts/python/firefox-gecko-converter.py > @@ -77,6 +77,39 @@ def process_event(param_dict): > stackMap[key] = stack > return stack > > + frameMap = dict() > + def get_or_create_frame(frameString): > + frame = frameMap.get(frameString) > + if frame is None: > + frame = len(frameTable['data']) > + location = len(stringTable) > + stringTable.append(frameString) Looks like it just always appending a new string. Any deduplication work later? > + category = KERNEL_CATEGORY_INDEX if frameString.find('kallsyms') != -1 \ > + or frameString.find('/vmlinux') != -1 \ > + or frameString.endswith('.ko)') \ > + else USER_CATEGORY_INDEX I think you can use param_dict['sample']['cpumode']. Please see include/uapi/linux/perf_event.h for cpumode values. > + implementation = None > + optimizations = None > + line = None > + relevantForJS = False > + subcategory = None > + innerWindowID = 0 > + column = None > + > + frameTable['data'].append([ > + location, > + relevantForJS, > + innerWindowID, > + implementation, > + optimizations, > + line, > + column, > + category, > + subcategory, > + ]) > + frameMap[frameString] = frame I think it'd be better if you define the frameTable in this commit. Thanks, Namhyung > + return frame > + > def _addThreadSample(pid, tid, threadName, time_stamp, stack): > thread = thread_map.get(tid) > if not thread: > -- > 2.34.1 >
On Wed, Jul 05, 2023 at 11:06:58PM -0700, Namhyung Kim wrote: > On Wed, Jul 5, 2023 at 12:48 PM Anup Sharma <anupnewsmail@gmail.com> wrote: > > > > The get_or_create_frame function is responsible for retrieving or > > creating a frame based on the provided frameString. If the frame > > 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's 'data' array and adding the > > frameString to the stringTable. > > > > The index of the newly created frame is added to the frameMap. > > > > Signed-off-by: Anup Sharma <anupnewsmail@gmail.com> > > --- > > .../scripts/python/firefox-gecko-converter.py | 33 +++++++++++++++++++ > > 1 file changed, 33 insertions(+) > > > > diff --git a/tools/perf/scripts/python/firefox-gecko-converter.py b/tools/perf/scripts/python/firefox-gecko-converter.py > > index 6f69c083d3ff..d5b9fb16e520 100644 > > --- a/tools/perf/scripts/python/firefox-gecko-converter.py > > +++ b/tools/perf/scripts/python/firefox-gecko-converter.py > > @@ -77,6 +77,39 @@ def process_event(param_dict): > > stackMap[key] = stack > > return stack > > > > + frameMap = dict() > > + def get_or_create_frame(frameString): > > + frame = frameMap.get(frameString) > > + if frame is None: > > + frame = len(frameTable['data']) > > + location = len(stringTable) > > + stringTable.append(frameString) > > Looks like it just always appending a new string. > Any deduplication work later? Although this initially came to my mind and almost all stack frames seem to be similar for a repeated call, but I am not sure if we can dedup because some frames do differ as the call stack progresses. For example, a process exits a function and then calls another function, resulting in most of the stack frames being the same but the last one being different. > > + category = KERNEL_CATEGORY_INDEX if frameString.find('kallsyms') != -1 \ > > + or frameString.find('/vmlinux') != -1 \ > > + or frameString.endswith('.ko)') \ > > + else USER_CATEGORY_INDEX > > I think you can use param_dict['sample']['cpumode']. > Please see include/uapi/linux/perf_event.h for cpumode > values. I am actively working on incorporating the use of param_dict ['sample']['cpumode'] to determine the category in the upcoming v4 update. I saw in param_dict['sample']['cpumode'] values exist as 1 and 2. Can you point me to exact line in include/uapi/linux/perf_event.h . I am not able to find it. > > + implementation = None > > + optimizations = None > > + line = None > > + relevantForJS = False > > + subcategory = None > > + innerWindowID = 0 > > + column = None > > + > > + frameTable['data'].append([ > > + location, > > + relevantForJS, > > + innerWindowID, > > + implementation, > > + optimizations, > > + line, > > + column, > > + category, > > + subcategory, > > + ]) > > + frameMap[frameString] = frame > > I think it'd be better if you define the frameTable in this > commit. Certainly, my apologies for the disorder. > Thanks, > Namhyung > > > > + return frame > > + > > def _addThreadSample(pid, tid, threadName, time_stamp, stack): > > thread = thread_map.get(tid) > > if not thread: > > -- > > 2.34.1 > >
© 2016 - 2025 Red Hat, Inc.