All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Namhyung Kim <namhyung@kernel.org>
Cc: Ian Rogers <irogers@google.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>,
	Mark Rutland <mark.rutland@arm.com>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Jiri Olsa <jolsa@kernel.org>,
	Adrian Hunter <adrian.hunter@intel.com>,
	Nick Terrell <terrelln@fb.com>,
	Kan Liang <kan.liang@linux.intel.com>,
	Andi Kleen <ak@linux.intel.com>, Kajol Jain <kjain@linux.ibm.com>,
	Athira Rajeev <atrajeev@linux.vnet.ibm.com>,
	Huacai Chen <chenhuacai@kernel.org>,
	Masami Hiramatsu <mhiramat@kernel.org>,
	Vincent Whitchurch <vincent.whitchurch@axis.com>,
	"Steinar H. Gunderson" <sesse@google.com>,
	Liam Howlett <liam.howlett@oracle.com>,
	Miguel Ojeda <ojeda@kernel.org>,
	Colin Ian King <colin.i.king@gmail.com>,
	Dmitrii Dolgov <9erthalion6@gmail.com>,
	Yang Jihong <yangjihong1@huawei.com>,
	Ming Wang <wangming01@loongson.cn>,
	James Clark <james.clark@arm.com>,
	K Prateek Nayak <kprateek.nayak@amd.com>,
	Sean Christopherson <seanjc@google.com>,
	Leo Yan <leo.yan@linaro.org>,
	Ravi Bangoria <ravi.bangoria@amd.com>,
	German Gomez <german.gomez@arm.com>,
	Changbin Du <changbin.du@huawei.com>,
	Paolo Bonzini <pbonzini@redhat.com>, Li Dong <lidong@vivo.com>,
	Sandipan Das <sandipan.das@amd.com>,
	liuwenyu <liuwenyu7@huawei.com>,
	linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org,
	Guilherme Amadio <amadio@gentoo.org>
Subject: Re: [PATCH v5 12/50] perf map: Simplify map_ip/unmap_ip and make map size smaller
Date: Wed, 6 Dec 2023 10:49:03 -0300	[thread overview]
Message-ID: <ZXB7z8ff0J0IDW1m@kernel.org> (raw)
In-Reply-To: <CAM9d7cgrx7vjLtnSt6Y4q+vtok=kSy6V83xe0c6cT6BVY2m-oA@mail.gmail.com>

Em Mon, Dec 04, 2023 at 03:39:08PM -0800, Namhyung Kim escreveu:
> Hi Ian,
> 
> On Mon, Nov 27, 2023 at 2:09 PM Ian Rogers <irogers@google.com> wrote:
> >
> > When mapping an IP it is either an identity mapping or a DSO relative
> > mapping, so a single bit is required in the struct to identify
> > this. The current code uses function pointers, adding 2 pointers per
> > map and also pushing the size of a map beyond 1 cache line. Switch to
> > using a byte to identify the mapping type (as well as priv and
> > erange_warned), to avoid any masking. Change struct maps's layout to
> > avoid holes.
> >
> > Before:
> > ```
> > struct map {
> >         u64                        start;                /*     0     8 */
> >         u64                        end;                  /*     8     8 */
> >         _Bool                      erange_warned:1;      /*    16: 0  1 */
> >         _Bool                      priv:1;               /*    16: 1  1 */
> >
> >         /* XXX 6 bits hole, try to pack */
> >         /* XXX 3 bytes hole, try to pack */
> >
> >         u32                        prot;                 /*    20     4 */
> >         u64                        pgoff;                /*    24     8 */
> >         u64                        reloc;                /*    32     8 */
> >         u64                        (*map_ip)(const struct map  *, u64); /*    40     8 */
> >         u64                        (*unmap_ip)(const struct map  *, u64); /*    48     8 */
> >         struct dso *               dso;                  /*    56     8 */
> >         /* --- cacheline 1 boundary (64 bytes) --- */
> >         refcount_t                 refcnt;               /*    64     4 */
> >         u32                        flags;                /*    68     4 */
> >
> >         /* size: 72, cachelines: 2, members: 12 */
> >         /* sum members: 68, holes: 1, sum holes: 3 */
> >         /* sum bitfield members: 2 bits, bit holes: 1, sum bit holes: 6 bits */
> >         /* last cacheline: 8 bytes */
> > };
> > ```
> >
> > After:
> > ```
> > struct map {
> >         u64                        start;                /*     0     8 */
> >         u64                        end;                  /*     8     8 */
> >         u64                        pgoff;                /*    16     8 */
> >         u64                        reloc;                /*    24     8 */
> >         struct dso *               dso;                  /*    32     8 */
> >         refcount_t                 refcnt;               /*    40     4 */
> >         u32                        prot;                 /*    44     4 */
> >         u32                        flags;                /*    48     4 */
> >         enum mapping_type          mapping_type:8;       /*    52: 0  4 */
> >
> >         /* Bitfield combined with next fields */
> >
> >         _Bool                      erange_warned;        /*    53     1 */
> >         _Bool                      priv;                 /*    54     1 */
> >
> >         /* size: 56, cachelines: 1, members: 11 */
> >         /* padding: 1 */
> >         /* last cacheline: 56 bytes */
> > };
> > ```
> 
> Thanks for doing this!  I really wanted to clean up the map
> code and to make it more intuitive.
> 
> >
> > Signed-off-by: Ian Rogers <irogers@google.com>
> 
> Acked-by: Namhyung Kim <namhyung@kernel.org>

Applied
 
> A few nitpicks below.

Ian, please consider those for a follow up clarifying patch.

- Arnaldo
 
> > ---
> >  tools/perf/util/machine.c    |  3 +-
> >  tools/perf/util/map.c        | 20 +--------
> >  tools/perf/util/map.h        | 83 +++++++++++++++++++-----------------
> >  tools/perf/util/symbol-elf.c |  6 +--
> >  tools/perf/util/symbol.c     |  6 +--
> >  5 files changed, 50 insertions(+), 68 deletions(-)
> >
> > diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
> > index be3dab9d5253..b6831a1f909d 100644
> > --- a/tools/perf/util/machine.c
> > +++ b/tools/perf/util/machine.c
> > @@ -1360,8 +1360,7 @@ __machine__create_kernel_maps(struct machine *machine, struct dso *kernel)
> >         if (machine->vmlinux_map == NULL)
> >                 return -ENOMEM;
> >
> > -       map__set_map_ip(machine->vmlinux_map, identity__map_ip);
> > -       map__set_unmap_ip(machine->vmlinux_map, identity__map_ip);
> > +       map__set_mapping_type(machine->vmlinux_map, MAPPING_TYPE__IDENTITY);
> >         return maps__insert(machine__kernel_maps(machine), machine->vmlinux_map);
> >  }
> >
> > diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c
> > index f64b83004421..54c67cb7ecef 100644
> > --- a/tools/perf/util/map.c
> > +++ b/tools/perf/util/map.c
> > @@ -109,8 +109,7 @@ void map__init(struct map *map, u64 start, u64 end, u64 pgoff, struct dso *dso)
> >         map__set_pgoff(map, pgoff);
> >         map__set_reloc(map, 0);
> >         map__set_dso(map, dso__get(dso));
> > -       map__set_map_ip(map, map__dso_map_ip);
> > -       map__set_unmap_ip(map, map__dso_unmap_ip);
> > +       map__set_mapping_type(map, MAPPING_TYPE__DSO);
> >         map__set_erange_warned(map, false);
> >         refcount_set(map__refcnt(map), 1);
> >  }
> > @@ -172,7 +171,7 @@ struct map *map__new(struct machine *machine, u64 start, u64 len,
> >                 map__init(result, start, start + len, pgoff, dso);
> >
> >                 if (anon || no_dso) {
> > -                       map->map_ip = map->unmap_ip = identity__map_ip;
> > +                       map->mapping_type = MAPPING_TYPE__IDENTITY;
> >
> >                         /*
> >                          * Set memory without DSO as loaded. All map__find_*
> > @@ -630,18 +629,3 @@ struct maps *map__kmaps(struct map *map)
> >         }
> >         return kmap->kmaps;
> >  }
> > -
> > -u64 map__dso_map_ip(const struct map *map, u64 ip)
> > -{
> > -       return ip - map__start(map) + map__pgoff(map);
> > -}
> > -
> > -u64 map__dso_unmap_ip(const struct map *map, u64 ip)
> > -{
> > -       return ip + map__start(map) - map__pgoff(map);
> > -}
> > -
> > -u64 identity__map_ip(const struct map *map __maybe_unused, u64 ip)
> > -{
> > -       return ip;
> > -}
> > diff --git a/tools/perf/util/map.h b/tools/perf/util/map.h
> > index 1b53d53adc86..3a3b7757da5f 100644
> > --- a/tools/perf/util/map.h
> > +++ b/tools/perf/util/map.h
> > @@ -16,23 +16,25 @@ struct dso;
> >  struct maps;
> >  struct machine;
> >
> > +enum mapping_type {
> > +       /* map__map_ip/map__unmap_ip are given as offsets in the DSO. */
> > +       MAPPING_TYPE__DSO,
> 
> I slightly prefer __PIC than __DSO, but won't argue. :)
> 
> > +       /* map__map_ip/map__unmap_ip are just the given ip value. */
> > +       MAPPING_TYPE__IDENTITY,
> > +};
> > +
> >  DECLARE_RC_STRUCT(map) {
> >         u64                     start;
> >         u64                     end;
> > -       bool                    erange_warned:1;
> > -       bool                    priv:1;
> > -       u32                     prot;
> >         u64                     pgoff;
> >         u64                     reloc;
> > -
> > -       /* ip -> dso rip */
> > -       u64                     (*map_ip)(const struct map *, u64);
> > -       /* dso rip -> ip */
> > -       u64                     (*unmap_ip)(const struct map *, u64);
> > -
> >         struct dso              *dso;
> >         refcount_t              refcnt;
> > +       u32                     prot;
> >         u32                     flags;
> > +       enum mapping_type       mapping_type:8;
> > +       bool                    erange_warned;
> > +       bool                    priv;
> >  };
> >
> >  struct kmap;
> > @@ -41,38 +43,11 @@ struct kmap *__map__kmap(struct map *map);
> >  struct kmap *map__kmap(struct map *map);
> >  struct maps *map__kmaps(struct map *map);
> >
> > -/* ip -> dso rip */
> > -u64 map__dso_map_ip(const struct map *map, u64 ip);
> > -/* dso rip -> ip */
> > -u64 map__dso_unmap_ip(const struct map *map, u64 ip);
> > -/* Returns ip */
> > -u64 identity__map_ip(const struct map *map __maybe_unused, u64 ip);
> > -
> >  static inline struct dso *map__dso(const struct map *map)
> >  {
> >         return RC_CHK_ACCESS(map)->dso;
> >  }
> >
> > -static inline u64 map__map_ip(const struct map *map, u64 ip)
> > -{
> > -       return RC_CHK_ACCESS(map)->map_ip(map, ip);
> > -}
> > -
> > -static inline u64 map__unmap_ip(const struct map *map, u64 ip)
> > -{
> > -       return RC_CHK_ACCESS(map)->unmap_ip(map, ip);
> > -}
> > -
> > -static inline void *map__map_ip_ptr(struct map *map)
> > -{
> > -       return RC_CHK_ACCESS(map)->map_ip;
> > -}
> > -
> > -static inline void* map__unmap_ip_ptr(struct map *map)
> > -{
> > -       return RC_CHK_ACCESS(map)->unmap_ip;
> > -}
> > -
> >  static inline u64 map__start(const struct map *map)
> >  {
> >         return RC_CHK_ACCESS(map)->start;
> > @@ -123,6 +98,34 @@ static inline size_t map__size(const struct map *map)
> >         return map__end(map) - map__start(map);
> >  }
> >
> > +/* ip -> dso rip */
> > +static inline u64 map__dso_map_ip(const struct map *map, u64 ip)
> > +{
> > +       return ip - map__start(map) + map__pgoff(map);
> > +}
> > +
> > +/* dso rip -> ip */
> > +static inline u64 map__dso_unmap_ip(const struct map *map, u64 ip)
> 
> I think it's better to use 'rip' consistently in the variable name
> if possible.
> 
> Thanks,
> Namhyung
> 
> 
> > +{
> > +       return ip + map__start(map) - map__pgoff(map);
> > +}
> > +
> > +static inline u64 map__map_ip(const struct map *map, u64 ip)
> > +{
> > +       if ((RC_CHK_ACCESS(map)->mapping_type) == MAPPING_TYPE__DSO)
> > +               return map__dso_map_ip(map, ip);
> > +       else
> > +               return ip;
> > +}
> > +
> > +static inline u64 map__unmap_ip(const struct map *map, u64 ip)
> > +{
> > +       if ((RC_CHK_ACCESS(map)->mapping_type) == MAPPING_TYPE__DSO)
> > +               return map__dso_unmap_ip(map, ip);
> > +       else
> > +               return ip;
> > +}
> > +
> >  /* rip/ip <-> addr suitable for passing to `objdump --start-address=` */
> >  u64 map__rip_2objdump(struct map *map, u64 rip);
> >
> > @@ -294,13 +297,13 @@ static inline void map__set_dso(struct map *map, struct dso *dso)
> >         RC_CHK_ACCESS(map)->dso = dso;
> >  }
> >
> > -static inline void map__set_map_ip(struct map *map, u64 (*map_ip)(const struct map *map, u64 ip))
> > +static inline void map__set_mapping_type(struct map *map, enum mapping_type type)
> >  {
> > -       RC_CHK_ACCESS(map)->map_ip = map_ip;
> > +       RC_CHK_ACCESS(map)->mapping_type = type;
> >  }
> >
> > -static inline void map__set_unmap_ip(struct map *map, u64 (*unmap_ip)(const struct map *map, u64 rip))
> > +static inline enum mapping_type map__mapping_type(struct map *map)
> >  {
> > -       RC_CHK_ACCESS(map)->unmap_ip = unmap_ip;
> > +       return RC_CHK_ACCESS(map)->mapping_type;
> >  }
> >  #endif /* __PERF_MAP_H */
> > diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
> > index 9e7eeaf616b8..4b934ed3bfd1 100644
> > --- a/tools/perf/util/symbol-elf.c
> > +++ b/tools/perf/util/symbol-elf.c
> > @@ -1392,8 +1392,7 @@ static int dso__process_kernel_symbol(struct dso *dso, struct map *map,
> >                         map__set_start(map, shdr->sh_addr + ref_reloc(kmap));
> >                         map__set_end(map, map__start(map) + shdr->sh_size);
> >                         map__set_pgoff(map, shdr->sh_offset);
> > -                       map__set_map_ip(map, map__dso_map_ip);
> > -                       map__set_unmap_ip(map, map__dso_unmap_ip);
> > +                       map__set_mapping_type(map, MAPPING_TYPE__DSO);
> >                         /* Ensure maps are correctly ordered */
> >                         if (kmaps) {
> >                                 int err;
> > @@ -1455,8 +1454,7 @@ static int dso__process_kernel_symbol(struct dso *dso, struct map *map,
> >                         map__set_end(curr_map, map__start(curr_map) + shdr->sh_size);
> >                         map__set_pgoff(curr_map, shdr->sh_offset);
> >                 } else {
> > -                       map__set_map_ip(curr_map, identity__map_ip);
> > -                       map__set_unmap_ip(curr_map, identity__map_ip);
> > +                       map__set_mapping_type(curr_map, MAPPING_TYPE__IDENTITY);
> >                 }
> >                 curr_dso->symtab_type = dso->symtab_type;
> >                 if (maps__insert(kmaps, curr_map))
> > diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
> > index 82cc74b9358e..314c0263bf3c 100644
> > --- a/tools/perf/util/symbol.c
> > +++ b/tools/perf/util/symbol.c
> > @@ -956,8 +956,7 @@ static int maps__split_kallsyms(struct maps *kmaps, struct dso *dso, u64 delta,
> >                                 return -1;
> >                         }
> >
> > -                       map__set_map_ip(curr_map, identity__map_ip);
> > -                       map__set_unmap_ip(curr_map, identity__map_ip);
> > +                       map__set_mapping_type(curr_map, MAPPING_TYPE__IDENTITY);
> >                         if (maps__insert(kmaps, curr_map)) {
> >                                 dso__put(ndso);
> >                                 return -1;
> > @@ -1475,8 +1474,7 @@ static int dso__load_kcore(struct dso *dso, struct map *map,
> >                         map__set_start(map, map__start(new_map));
> >                         map__set_end(map, map__end(new_map));
> >                         map__set_pgoff(map, map__pgoff(new_map));
> > -                       map__set_map_ip(map, map__map_ip_ptr(new_map));
> > -                       map__set_unmap_ip(map, map__unmap_ip_ptr(new_map));
> > +                       map__set_mapping_type(map, map__mapping_type(new_map));
> >                         /* Ensure maps are correctly ordered */
> >                         map_ref = map__get(map);
> >                         maps__remove(kmaps, map_ref);
> > --
> > 2.43.0.rc1.413.gea7ed67945-goog
> >

-- 

- Arnaldo

  reply	other threads:[~2023-12-06 13:49 UTC|newest]

Thread overview: 95+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-27 22:08 [PATCH v5 00/50] Improvements to memory use Ian Rogers
2023-11-27 22:08 ` [PATCH v5 01/50] perf comm: Use regular mutex Ian Rogers
2023-11-30  0:55   ` Namhyung Kim
2023-11-30 18:27     ` Ian Rogers
2023-12-02 23:54       ` Namhyung Kim
2023-12-07  0:05         ` Ian Rogers
2024-02-06  3:04           ` Ian Rogers
2023-11-27 22:08 ` [PATCH v5 02/50] libperf: Lazily allocate/size mmap event copy Ian Rogers
2023-11-30  1:25   ` Namhyung Kim
2023-11-30 13:15   ` Arnaldo Carvalho de Melo
2023-11-30 14:19     ` Arnaldo Carvalho de Melo
2023-11-30 17:17       ` Arnaldo Carvalho de Melo
2023-11-27 22:08 ` [PATCH v5 03/50] perf mmap: Lazily initialize zstd streams Ian Rogers
2023-11-30  1:28   ` Namhyung Kim
2023-11-27 22:08 ` [PATCH v5 04/50] tools api fs: Switch filename__read_str to use io.h Ian Rogers
2023-11-30  1:36   ` Namhyung Kim
2023-11-27 22:08 ` [PATCH v5 05/50] tools api fs: Avoid reading whole file for a 1 byte bool Ian Rogers
2023-11-30  1:42   ` Namhyung Kim
2023-11-27 22:08 ` [PATCH v5 06/50] tools lib api: Add io_dir an allocation free readdir alternative Ian Rogers
2023-11-30  1:49   ` Namhyung Kim
2023-11-30 17:21   ` Arnaldo Carvalho de Melo
2023-11-30 17:56     ` Ian Rogers
2023-11-30 21:25       ` Arnaldo Carvalho de Melo
2023-12-07  5:13         ` Ian Rogers
2023-11-27 22:08 ` [PATCH v5 07/50] perf maps: Switch modules tree walk to io_dir__readdir Ian Rogers
2023-11-30  1:59   ` Namhyung Kim
2023-11-27 22:08 ` [PATCH v5 08/50] perf record: Be lazier in allocating lost samples buffer Ian Rogers
2023-11-30  2:09   ` Namhyung Kim
2023-11-30 18:29     ` Ian Rogers
2023-12-02 23:56       ` Namhyung Kim
2023-12-05 15:54         ` Arnaldo Carvalho de Melo
2023-11-27 22:08 ` [PATCH v5 09/50] perf pmu: Switch to io_dir__readdir Ian Rogers
2023-11-30  2:16   ` Namhyung Kim
2023-11-27 22:08 ` [PATCH v5 10/50] perf header: Switch mem topology " Ian Rogers
2023-11-30  4:17   ` Namhyung Kim
2023-11-27 22:08 ` [PATCH v5 11/50] perf events: Remove scandir in thread synthesis Ian Rogers
2023-11-30  4:22   ` Namhyung Kim
2023-11-27 22:08 ` [PATCH v5 12/50] perf map: Simplify map_ip/unmap_ip and make map size smaller Ian Rogers
2023-12-04 23:39   ` Namhyung Kim
2023-12-06 13:49     ` Arnaldo Carvalho de Melo [this message]
2023-12-06 16:19       ` Ian Rogers
2023-11-27 22:08 ` [PATCH v5 13/50] perf maps: Move symbol maps functions to maps.c Ian Rogers
2023-12-04 23:40   ` Namhyung Kim
2023-12-06 13:50     ` Arnaldo Carvalho de Melo
2023-11-27 22:08 ` [PATCH v5 14/50] perf thread: Add missing RC_CHK_EQUAL Ian Rogers
2023-12-04 23:41   ` Namhyung Kim
2023-12-06 13:51     ` Arnaldo Carvalho de Melo
2023-11-27 22:08 ` [PATCH v5 15/50] perf maps: Add maps__for_each_map to call a function on each entry Ian Rogers
2023-12-04 23:46   ` Namhyung Kim
2023-12-06 13:53     ` Arnaldo Carvalho de Melo
2023-11-27 22:08 ` [PATCH v5 16/50] perf maps: Add remove maps function to remove a map based on callback Ian Rogers
2023-12-04 23:49   ` Namhyung Kim
2023-12-06 23:28     ` Ian Rogers
2023-11-27 22:08 ` [PATCH v5 17/50] perf debug: Expose debug file Ian Rogers
2023-12-04 23:53   ` Namhyung Kim
2023-11-27 22:08 ` [PATCH v5 18/50] perf maps: Refactor maps__fixup_overlappings Ian Rogers
2023-12-04 23:59   ` Namhyung Kim
2023-12-06 23:39     ` Ian Rogers
2023-11-27 22:08 ` [PATCH v5 19/50] perf maps: Do simple merge if given map doesn't overlap Ian Rogers
2023-12-05  0:06   ` Namhyung Kim
2023-12-06 23:51     ` Ian Rogers
2023-11-27 22:08 ` [PATCH v5 20/50] perf maps: Rename clone to copy from Ian Rogers
2023-12-05  0:07   ` Namhyung Kim
2023-11-27 22:08 ` [PATCH v5 21/50] perf maps: Add maps__load_first Ian Rogers
2023-11-27 22:08 ` [PATCH v5 22/50] perf maps: Add find next entry to give entry after the given map Ian Rogers
2023-11-27 22:08 ` [PATCH v5 23/50] perf maps: Reduce scope of map_rb_node and maps internals Ian Rogers
2023-11-27 22:08 ` [PATCH v5 24/50] perf maps: Fix up overlaps during fixup_end Ian Rogers
2023-11-27 22:08 ` [PATCH v5 25/50] perf maps: Switch from rbtree to lazily sorted array for addresses Ian Rogers
2023-11-27 22:08 ` [PATCH v5 26/50] perf maps: Get map before returning in maps__find Ian Rogers
2023-11-27 22:08 ` [PATCH v5 27/50] perf maps: Get map before returning in maps__find_by_name Ian Rogers
2023-11-27 22:08 ` [PATCH v5 28/50] perf maps: Get map before returning in maps__find_next_entry Ian Rogers
2023-11-27 22:08 ` [PATCH v5 29/50] perf maps: Hide maps internals Ian Rogers
2023-11-27 22:08 ` [PATCH v5 30/50] perf maps: Locking tidy up of nr_maps Ian Rogers
2023-11-27 22:08 ` [PATCH v5 31/50] perf dso: Reorder variables to save space in struct dso Ian Rogers
2023-11-27 22:08 ` [PATCH v5 32/50] perf report: Sort child tasks by tid Ian Rogers
2023-11-27 22:08 ` [PATCH v5 33/50] perf trace: Ignore thread hashing in summary Ian Rogers
2023-11-27 22:08 ` [PATCH v5 34/50] perf machine: Move fprintf to for_each loop and a callback Ian Rogers
2023-11-27 22:08 ` [PATCH v5 35/50] perf threads: Move threads to its own files Ian Rogers
2023-11-27 22:08 ` [PATCH v5 36/50] perf threads: Switch from rbtree to hashmap Ian Rogers
2023-11-27 22:08 ` [PATCH v5 37/50] perf threads: Reduce table size from 256 to 8 Ian Rogers
2023-11-27 22:08 ` [PATCH v5 38/50] perf dsos: Attempt to better abstract dsos internals Ian Rogers
2023-11-27 22:08 ` [PATCH v5 39/50] perf dsos: Tidy reference counting and locking Ian Rogers
2023-11-27 22:08 ` [PATCH v5 40/50] perf dsos: Add dsos__for_each_dso Ian Rogers
2023-11-27 22:08 ` [PATCH v5 41/50] perf dso: Move dso functions out of dsos Ian Rogers
2023-11-27 22:08 ` [PATCH v5 42/50] perf dsos: Switch more loops to dsos__for_each_dso Ian Rogers
2023-11-27 22:08 ` [PATCH v5 43/50] perf dsos: Switch backing storage to array from rbtree/list Ian Rogers
2023-11-27 22:08 ` [PATCH v5 44/50] perf dsos: Remove __dsos__addnew Ian Rogers
2023-11-27 22:08 ` [PATCH v5 45/50] perf dsos: Remove __dsos__findnew_link_by_longname_id Ian Rogers
2023-11-27 22:08 ` [PATCH v5 46/50] perf dsos: Switch hand code to bsearch Ian Rogers
2023-11-27 22:08 ` [PATCH v5 47/50] perf dso: Add reference count checking and accessor functions Ian Rogers
2023-11-27 22:09 ` [PATCH v5 48/50] perf dso: Reference counting related fixes Ian Rogers
2023-11-27 22:09 ` [PATCH v5 49/50] perf dso: Use container_of to avoid a pointer in dso_data Ian Rogers
2023-11-27 22:09 ` [PATCH v5 50/50] perf env: Avoid recursively taking env->bpf_progs.lock Ian Rogers
2023-11-30  1:16 ` [PATCH v5 00/50] Improvements to memory use Namhyung Kim
2023-12-07  0:10   ` Ian Rogers

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZXB7z8ff0J0IDW1m@kernel.org \
    --to=acme@kernel.org \
    --cc=9erthalion6@gmail.com \
    --cc=adrian.hunter@intel.com \
    --cc=ak@linux.intel.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=amadio@gentoo.org \
    --cc=atrajeev@linux.vnet.ibm.com \
    --cc=changbin.du@huawei.com \
    --cc=chenhuacai@kernel.org \
    --cc=colin.i.king@gmail.com \
    --cc=german.gomez@arm.com \
    --cc=irogers@google.com \
    --cc=james.clark@arm.com \
    --cc=jolsa@kernel.org \
    --cc=kan.liang@linux.intel.com \
    --cc=kjain@linux.ibm.com \
    --cc=kprateek.nayak@amd.com \
    --cc=leo.yan@linaro.org \
    --cc=liam.howlett@oracle.com \
    --cc=lidong@vivo.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=liuwenyu7@huawei.com \
    --cc=mark.rutland@arm.com \
    --cc=mhiramat@kernel.org \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=ojeda@kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=peterz@infradead.org \
    --cc=ravi.bangoria@amd.com \
    --cc=sandipan.das@amd.com \
    --cc=seanjc@google.com \
    --cc=sesse@google.com \
    --cc=terrelln@fb.com \
    --cc=vincent.whitchurch@axis.com \
    --cc=wangming01@loongson.cn \
    --cc=yangjihong1@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.