Messages in this thread | | | Date | Mon, 14 Oct 2019 21:20:49 +0200 | From | Jiri Olsa <> | Subject | Re: [PATCH 3/3] perf tools: Make 'struct map_shared' truly shared |
| |
On Sun, Oct 13, 2019 at 08:10:54PM -0700, Andi Kleen wrote: > On Sun, Oct 13, 2019 at 05:14:27PM +0200, Jiri Olsa wrote: > > Andi reported that maps cloning is eating lot of memory and > > it's probably unnecessary, because they keep the same data. > > > > Changing 'struct map_shared' to be a pointer inside 'struct map', > > so it can be shared on fork. Changing the map__clone function to > > actually share 'struct map_shared' for cloned maps. > > > > The 'struct map_shared' carries its own refcnt counter, which is > > incremented when it's assigned to new 'struct map' and decremented > > when 'struct map' gets deleted in map__delete (its refcnt is 0). > > > > This 'maps sharing' seems to save lot of heap for reports with > > many forks/cloned mmaps (over 60% in example below). > > The one case I wasn't sure about is with JIT support. So if > a map gets modified with fixup/start from /tmp/perf-%d > in one process, would it impact the other too? > > We may need a COW operation for this (hopefully rare) case.
so the jitted mmaps are inserted into the data file and processed during report where they can overload existing maps - thats detected before addition in:
thread__insert_map map_groups__fixup_overlappings - which uses COW way -> map__clone(map, false); to create new map
other fixups to maps are being done only for kernel maps, where we dont have a problem, because there's only one copy
jirka
| |