Messages in this thread | | | From | Anup Sharma <> | Date | Tue, 11 Jul 2023 04:12:57 +0530 | Subject | Re: [PATCH v2 5/7] scripts: python: implement get or create frame function |
| |
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 > >
| |