Linux Perf Users
 help / color / mirror / Atom feed
From: Ian Rogers <irogers@google.com>
To: Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>,
	 Arnaldo Carvalho de Melo <acme@kernel.org>,
	Namhyung Kim <namhyung@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>, Ian Rogers <irogers@google.com>,
	 Adrian Hunter <adrian.hunter@intel.com>,
	James Clark <james.clark@linaro.org>,
	 linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH v1 26/26] perf hashmap: Remove untyped struct hashmap API
Date: Fri, 13 Nov 2026 13:48:50 -0800	[thread overview]
Message-ID: <20261113214850.3329699-27-irogers@google.com> (raw)
In-Reply-To: <20261113214850.3329699-1-irogers@google.com>

Now that all hashmap users in tools/perf have been migrated to
DECLARE_HASHMAP(), remove the legacy untyped struct hashmap wrapper,
hashmap__new(), __hashmap__new(), __hashmap__free(), the
untyped-hashmap compatibility branches in hashmap__insert/find/delete,
and the unused hashmap__for_each_entry* macros from util/hashmap.h, and
rename struct hashmap_entry to struct __hashmap_entry.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/util/hashmap.c |  75 +++++++----------
 tools/perf/util/hashmap.h | 173 +++++++-------------------------------
 2 files changed, 62 insertions(+), 186 deletions(-)

diff --git a/tools/perf/util/hashmap.c b/tools/perf/util/hashmap.c
index f6bfaeaee9d7..946105919197 100644
--- a/tools/perf/util/hashmap.c
+++ b/tools/perf/util/hashmap.c
@@ -21,15 +21,15 @@
 /* start with 4 buckets */
 #define HASHMAP_MIN_CAP_BITS 2
 
-static void __hashmap__add_entry(struct hashmap_entry **pprev,
-				 struct hashmap_entry *entry)
+static void __hashmap__add_entry(struct __hashmap_entry **pprev,
+				 struct __hashmap_entry *entry)
 {
 	entry->next = *pprev;
 	*pprev = entry;
 }
 
-static void __hashmap__del_entry(struct hashmap_entry **pprev,
-				 struct hashmap_entry *entry)
+static void __hashmap__del_entry(struct __hashmap_entry **pprev,
+				 struct __hashmap_entry *entry)
 {
 	*pprev = entry->next;
 	entry->next = NULL;
@@ -48,42 +48,23 @@ void __hashmap__init(struct __hashmap *map, hashmap_hash_fn hash_fn,
 	map->sz = 0;
 }
 
-struct __hashmap *__hashmap__new(hashmap_hash_fn hash_fn,
-				 hashmap_equal_fn equal_fn,
-				 void *ctx)
-{
-	struct __hashmap *map = malloc(sizeof(*map));
-
-	if (!map) {
-		errno = ENOMEM;
-		return NULL;
-	}
-	__hashmap__init(map, hash_fn, equal_fn, ctx);
-	return map;
-}
-
 void __hashmap__clear(struct __hashmap *map)
 {
-	struct hashmap_entry *cur, *tmp;
-	size_t bkt;
+	for (size_t bkt = 0; bkt < map->cap; bkt++) {
+		struct __hashmap_entry *cur = map->buckets[bkt];
+
+		while (cur) {
+			struct __hashmap_entry *next = cur->next;
 
-	hashmap__for_each_entry_safe(map, cur, tmp, bkt) {
-		free(cur);
+			free(cur);
+			cur = next;
+		}
 	}
 	free(map->buckets);
 	map->buckets = NULL;
 	map->cap = map->cap_bits = map->sz = 0;
 }
 
-void __hashmap__free(struct __hashmap *map)
-{
-	if (!map)
-		return;
-
-	__hashmap__clear(map);
-	free(map);
-}
-
 size_t __hashmap__size(const struct __hashmap *map)
 {
 	return map->sz;
@@ -102,10 +83,9 @@ static bool __hashmap__needs_to_grow(struct __hashmap *map)
 
 static int __hashmap__grow(struct __hashmap *map)
 {
-	struct hashmap_entry **new_buckets;
-	struct hashmap_entry *cur, *tmp;
+	struct __hashmap_entry **new_buckets;
 	size_t new_cap_bits, new_cap;
-	size_t h, bkt;
+	size_t h;
 
 	new_cap_bits = map->cap_bits + 1;
 	if (new_cap_bits < HASHMAP_MIN_CAP_BITS)
@@ -116,9 +96,16 @@ static int __hashmap__grow(struct __hashmap *map)
 	if (!new_buckets)
 		return -ENOMEM;
 
-	hashmap__for_each_entry_safe(map, cur, tmp, bkt) {
-		h = hash_bits(map->hash_fn(cur->key, map->ctx), new_cap_bits);
-		__hashmap__add_entry(&new_buckets[h], cur);
+	for (size_t bkt = 0; bkt < map->cap; bkt++) {
+		struct __hashmap_entry *cur = map->buckets[bkt];
+
+		while (cur) {
+			struct __hashmap_entry *next = cur->next;
+
+			h = hash_bits(map->hash_fn(cur->key, map->ctx), new_cap_bits);
+			__hashmap__add_entry(&new_buckets[h], cur);
+			cur = next;
+		}
 	}
 
 	map->cap = new_cap;
@@ -131,10 +118,10 @@ static int __hashmap__grow(struct __hashmap *map)
 
 static bool __hashmap__find_entry(const struct __hashmap *map,
 				  const long key, size_t hash,
-				  struct hashmap_entry ***pprev,
-				  struct hashmap_entry **entry)
+				  struct __hashmap_entry ***pprev,
+				  struct __hashmap_entry **entry)
 {
-	struct hashmap_entry *cur, **prev_ptr;
+	struct __hashmap_entry *cur, **prev_ptr;
 
 	if (!map->buckets)
 		return false;
@@ -157,7 +144,7 @@ int __hashmap__insert(struct __hashmap *map, long key, long value,
 		      enum hashmap_insert_strategy strategy,
 		      void *old_key, void *old_value)
 {
-	struct hashmap_entry *entry;
+	struct __hashmap_entry *entry;
 	size_t h;
 	int err;
 
@@ -193,7 +180,7 @@ int __hashmap__insert(struct __hashmap *map, long key, long value,
 		h = hash_bits(map->hash_fn(key, map->ctx), map->cap_bits);
 	}
 
-	entry = malloc(sizeof(struct hashmap_entry));
+	entry = malloc(sizeof(struct __hashmap_entry));
 	if (!entry)
 		return -ENOMEM;
 
@@ -207,7 +194,7 @@ int __hashmap__insert(struct __hashmap *map, long key, long value,
 
 bool __hashmap__find(const struct __hashmap *map, long key, void *value)
 {
-	struct hashmap_entry *entry;
+	struct __hashmap_entry *entry;
 	size_t h;
 
 	h = hash_bits(map->hash_fn(key, map->ctx), map->cap_bits);
@@ -222,7 +209,7 @@ bool __hashmap__find(const struct __hashmap *map, long key, void *value)
 bool __hashmap__delete(struct __hashmap *map, long key,
 		       void *old_key, void *old_value)
 {
-	struct hashmap_entry **pprev, *entry;
+	struct __hashmap_entry **pprev, *entry;
 	size_t h;
 
 	if (old_key)
diff --git a/tools/perf/util/hashmap.h b/tools/perf/util/hashmap.h
index bb85a65486be..e515443d3c70 100644
--- a/tools/perf/util/hashmap.h
+++ b/tools/perf/util/hashmap.h
@@ -92,16 +92,10 @@ typedef bool (*hashmap_equal_fn)(long key1, long key2, void *ctx);
  *   (e.g. bool, int, pid_t) are safe from buffer overflows, endianness bugs,
  *   and strict-aliasing violations.
  */
-struct hashmap_entry {
-	union {
-		long key;
-		const void *pkey;
-	};
-	union {
-		long value;
-		void *pvalue;
-	};
-	struct hashmap_entry *next;
+struct __hashmap_entry {
+	long key;
+	long value;
+	struct __hashmap_entry *next;
 };
 
 struct __hashmap {
@@ -109,57 +103,19 @@ struct __hashmap {
 	hashmap_equal_fn equal_fn;
 	void *ctx;
 
-	struct hashmap_entry **buckets;
+	struct __hashmap_entry **buckets;
 	size_t cap;
 	size_t cap_bits;
 	size_t sz;
 };
 
-/* Legacy untyped hashmap, kept while migrating callers to DECLARE_HASHMAP. */
-struct hashmap {
-	union {
-		struct __hashmap map;
-		struct {
-			hashmap_hash_fn hash_fn;
-			hashmap_equal_fn equal_fn;
-			void *ctx;
-
-			struct hashmap_entry **buckets;
-			size_t cap;
-			size_t cap_bits;
-			size_t sz;
-		};
-		long *__key;
-		long *__value;
-		char __untyped;
-	};
-};
-
 void __hashmap__init(struct __hashmap *map, hashmap_hash_fn hash_fn,
 		     hashmap_equal_fn equal_fn, void *ctx);
-struct __hashmap *__hashmap__new(hashmap_hash_fn hash_fn,
-				 hashmap_equal_fn equal_fn,
-				 void *ctx);
 void __hashmap__clear(struct __hashmap *map);
-void __hashmap__free(struct __hashmap *map);
 
 size_t __hashmap__size(const struct __hashmap *map);
 size_t __hashmap__capacity(const struct __hashmap *map);
 
-static inline struct hashmap *hashmap__new(hashmap_hash_fn hash_fn,
-					   hashmap_equal_fn equal_fn,
-					   void *ctx)
-{
-	struct hashmap *map = malloc(sizeof(*map));
-
-	if (!map) {
-		errno = ENOMEM;
-		return NULL;
-	}
-	__hashmap__init(&map->map, hash_fn, equal_fn, ctx);
-	return map;
-}
-
 /**
  * enum hashmap_insert_strategy - Strategy for hashmap__insert().
  * @HASHMAP_ADD: Only add key/value if key doesn't exist yet; returns -EEXIST
@@ -195,8 +151,8 @@ bool __hashmap__find(const struct __hashmap *map, long key, void *value);
 struct __hashmap_iter {
 	const struct __hashmap *map;
 	size_t bkt;
-	struct hashmap_entry *cur;
-	struct hashmap_entry *next;
+	struct __hashmap_entry *cur;
+	struct __hashmap_entry *next;
 };
 
 static inline struct __hashmap_iter
@@ -210,7 +166,7 @@ __hashmap_iter__init(const struct __hashmap *map)
 	};
 }
 
-static inline struct hashmap_entry *
+static inline struct __hashmap_entry *
 __hashmap_iter__advance(struct __hashmap_iter *it)
 {
 	if (!it->map || !it->map->buckets)
@@ -232,14 +188,14 @@ __hashmap_iter__advance(struct __hashmap_iter *it)
 struct __hashmap_key_iter {
 	const struct __hashmap *map;
 	long key;
-	struct hashmap_entry *cur;
-	struct hashmap_entry *next;
+	struct __hashmap_entry *cur;
+	struct __hashmap_entry *next;
 };
 
 static inline struct __hashmap_key_iter
 __hashmap_key_iter__init(const struct __hashmap *map, long key)
 {
-	struct hashmap_entry *first = NULL;
+	struct __hashmap_entry *first = NULL;
 
 	if (map && map->buckets) {
 		size_t h = hash_bits(map->hash_fn(key, map->ctx), map->cap_bits);
@@ -254,11 +210,11 @@ __hashmap_key_iter__init(const struct __hashmap *map, long key)
 	};
 }
 
-static inline struct hashmap_entry *
+static inline struct __hashmap_entry *
 __hashmap_key_iter__advance(struct __hashmap_key_iter *it)
 {
 	while (it->next) {
-		struct hashmap_entry *entry = it->next;
+		struct __hashmap_entry *entry = it->next;
 
 		it->next = entry->next;
 		if (it->map->equal_fn(entry->key, it->key, it->map->ctx)) {
@@ -289,7 +245,6 @@ struct name {									\
 		struct __hashmap map;					\
 		key_type *__key;						\
 		value_type *__value;						\
-		int __untyped;							\
 	};									\
 	_Static_assert(sizeof(key_type) <= sizeof(long),			\
 		       #name " key_type exceeds sizeof(long)");			\
@@ -328,19 +283,6 @@ static inline __maybe_unused void name##__free(struct name *hmap)		\
 			*(hm)->__key, (char *)NULL)) *)NULL,			\
 		*(hm)->__key))
 
-#define ___hashmap__choose(hm, untyped_expr, typed_expr)				\
-	__builtin_choose_expr(sizeof((hm)->__untyped) == 1,			\
-			      (untyped_expr), (typed_expr))
-
-#define ___hashmap__in_val(hm, expr) \
-	___hashmap__choose(hm, (long)(expr), (expr))
-
-#define ___hashmap__check_untyped_ptr(hm, ptr)					\
-	_Static_assert(sizeof((hm)->__untyped) != 1 ||				\
-		       (__builtin_constant_p((ptr)) ? (ptr) == NULL : 0) ||	\
-		       sizeof(*(ptr)) == sizeof(long),				\
-		       #ptr " pointee should be a long-sized integer or a pointer")
-
 /**
  * hashmap__init() - Initialize an embedded/stack-allocated typed hashmap.
  * @hmap: Pointer to a hashmap struct declared with DECLARE_HASHMAP().
@@ -397,25 +339,16 @@ do {										\
 	__hashmap__capacity(&(hmap)->map)
 
 #define ___hashmap__insert(hmap, key, value, strategy, old_key, old_value,	\
-			   hm, k, v, okp, ovp, raw_ok, raw_ov, ok, ov, err)	\
+			   hm, k, v, okp, ovp, ok, ov, err)		\
 ({										\
 	typeof(hmap) hm = (hmap);						\
-	typeof(*(hm)->__key) k = ___hashmap__in_val(hm, key);			\
-	typeof(*(hm)->__value) v = ___hashmap__in_val(hm, value);			\
+	typeof(*(hm)->__key) k = (key);						\
+	typeof(*(hm)->__value) v = (value);					\
+	typeof((hm)->__key) okp = (old_key);					\
+	typeof((hm)->__value) ovp = (old_value);				\
 	long ok = 0, ov = 0;							\
-	typeof((hm)->__key) okp =						\
-		___hashmap__choose(hm, (long *)NULL, (old_key));			\
-	typeof((hm)->__value) ovp =						\
-		___hashmap__choose(hm, (long *)NULL, (old_value));		\
-	void *raw_ok = ___hashmap__choose(hm, (void *)(old_key),			\
-					(void *)(okp ? &ok : NULL));		\
-	void *raw_ov = ___hashmap__choose(hm, (void *)(old_value),		\
-					(void *)(ovp ? &ov : NULL));		\
-	int err;								\
-	___hashmap__check_untyped_ptr(hm, old_key);				\
-	___hashmap__check_untyped_ptr(hm, old_value);				\
-	err = __hashmap__insert(&(hm)->map, (long)k, (long)v, (strategy),	\
-				raw_ok, raw_ov);			\
+	int err = __hashmap__insert(&(hm)->map, (long)k, (long)v, (strategy),	\
+				    okp ? &ok : NULL, ovp ? &ov : NULL);	\
 	if (okp)								\
 		*okp = (typeof(*(hm)->__key))ok;				\
 	if (ovp)								\
@@ -427,7 +360,6 @@ do {										\
 	___hashmap__insert(hmap, key, value, strategy, old_key, old_value,	\
 			   __PASTE(__hm_, u), __PASTE(__k_, u), __PASTE(__v_, u),	\
 			   __PASTE(__okp_, u), __PASTE(__ovp_, u),	\
-			   __PASTE(__rok_, u), __PASTE(__rov_, u),	\
 			   __PASTE(__ok_, u), __PASTE(__ov_, u), __PASTE(__err_, u))
 
 /**
@@ -503,18 +435,13 @@ do {										\
 #define hashmap__append(hmap, key, value) \
 	hashmap__insert(hmap, key, value, HASHMAP_APPEND, NULL, NULL)
 
-#define ___hashmap__find(hmap, key, value_ptr, hm, k, vp, raw_vp, v, found)	\
+#define ___hashmap__find(hmap, key, value_ptr, hm, k, vp, v, found)		\
 ({										\
 	typeof(hmap) hm = (hmap);						\
-	___hashmap__lookup_key_type(hm) k = ___hashmap__in_val(hm, key);		\
+	___hashmap__lookup_key_type(hm) k = (key);				\
+	typeof((hm)->__value) vp = (value_ptr);					\
 	long v = 0;								\
-	typeof((hm)->__value) vp =						\
-		___hashmap__choose(hm, (long *)NULL, (value_ptr));		\
-	void *raw_vp = ___hashmap__choose(hm, (void *)(value_ptr),		\
-					(void *)(vp ? &v : NULL));		\
-	bool found;								\
-	___hashmap__check_untyped_ptr(hm, value_ptr);				\
-	found = __hashmap__find(&(hm)->map, (long)k, raw_vp);			\
+	bool found = __hashmap__find(&(hm)->map, (long)k, vp ? &v : NULL);	\
 	if (found && vp)							\
 		*vp = (typeof(*(hm)->__value))v;				\
 	found;									\
@@ -523,7 +450,7 @@ do {										\
 #define _hashmap__find(hmap, key, value_ptr, u)					\
 	___hashmap__find(hmap, key, value_ptr,					\
 			 __PASTE(__hm_, u), __PASTE(__k_, u), __PASTE(__vp_, u),	\
-			 __PASTE(__rvp_, u), __PASTE(__v_, u), __PASTE(__found_, u))
+			 __PASTE(__v_, u), __PASTE(__found_, u))
 
 /**
  * hashmap__find() - Look up a key in a typed hashmap.
@@ -538,23 +465,15 @@ do {										\
 	_hashmap__find(hmap, key, value_ptr, __COUNTER__)
 
 #define ___hashmap__delete(hmap, key, old_key, old_value,				\
-			   hm, k, okp, ovp, raw_ok, raw_ov, ok, ov, rem)	\
+			   hm, k, okp, ovp, ok, ov, rem)		\
 ({										\
 	typeof(hmap) hm = (hmap);						\
-	___hashmap__lookup_key_type(hm) k = ___hashmap__in_val(hm, key);		\
+	___hashmap__lookup_key_type(hm) k = (key);				\
+	typeof((hm)->__key) okp = (old_key);					\
+	typeof((hm)->__value) ovp = (old_value);				\
 	long ok = 0, ov = 0;							\
-	typeof((hm)->__key) okp =						\
-		___hashmap__choose(hm, (long *)NULL, (old_key));			\
-	typeof((hm)->__value) ovp =						\
-		___hashmap__choose(hm, (long *)NULL, (old_value));		\
-	void *raw_ok = ___hashmap__choose(hm, (void *)(old_key),			\
-					(void *)(okp ? &ok : NULL));		\
-	void *raw_ov = ___hashmap__choose(hm, (void *)(old_value),		\
-					(void *)(ovp ? &ov : NULL));		\
-	bool rem;								\
-	___hashmap__check_untyped_ptr(hm, old_key);				\
-	___hashmap__check_untyped_ptr(hm, old_value);				\
-	rem = __hashmap__delete(&(hm)->map, (long)k, raw_ok, raw_ov);		\
+	bool rem = __hashmap__delete(&(hm)->map, (long)k,			\
+				     okp ? &ok : NULL, ovp ? &ov : NULL);	\
 	if (okp)								\
 		*okp = (typeof(*(hm)->__key))ok;				\
 	if (ovp)								\
@@ -566,7 +485,6 @@ do {										\
 	___hashmap__delete(hmap, key, old_key, old_value,				\
 			   __PASTE(__hm_, u), __PASTE(__k_, u),		\
 			   __PASTE(__okp_, u), __PASTE(__ovp_, u),	\
-			   __PASTE(__rok_, u), __PASTE(__rov_, u),	\
 			   __PASTE(__ok_, u), __PASTE(__ov_, u), __PASTE(__rem_, u))
 
 /**
@@ -660,33 +578,4 @@ do {										\
 #define hashmap__for_each_key_safe(hmap, key, val_var) \
 	hashmap__for_each_key(hmap, key, val_var)
 
-/*
- * Legacy entry iterators for unconverted struct hashmap callers.
- */
-#define hashmap__for_each_entry(map, cur, bkt)				    \
-	for (bkt = 0; bkt < (map)->cap; bkt++)				    \
-		for (cur = (map)->buckets[bkt]; cur; cur = cur->next)
-
-#define hashmap__for_each_entry_safe(map, cur, tmp, bkt)		    \
-	for (bkt = 0; bkt < (map)->cap; bkt++)				    \
-		for (cur = (map)->buckets[bkt];				    \
-		     cur && ({tmp = cur->next; true; });		    \
-		     cur = tmp)
-
-#define hashmap__for_each_key_entry(map, cur, _key)			    \
-	for (cur = (map)->buckets					    \
-		     ? (map)->buckets[hash_bits((map)->hash_fn((_key), (map)->ctx), (map)->cap_bits)] \
-		     : NULL;						    \
-	     cur;							    \
-	     cur = cur->next)						    \
-		if ((map)->equal_fn(cur->key, (_key), (map)->ctx))
-
-#define hashmap__for_each_key_entry_safe(map, cur, tmp, _key)		    \
-	for (cur = (map)->buckets					    \
-		     ? (map)->buckets[hash_bits((map)->hash_fn((_key), (map)->ctx), (map)->cap_bits)] \
-		     : NULL;						    \
-	     cur && ({ tmp = cur->next; true; });			    \
-	     cur = tmp)							    \
-		if ((map)->equal_fn(cur->key, (_key), (map)->ctx))
-
 #endif /* __PERF_UTIL_HASHMAP_H */
-- 
2.56.1.703.gf848ed807c-goog


  parent reply	other threads:[~2026-11-13 21:50 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-13 21:48 [PATCH v1 00/26] perf hashmap: Fix undefined behavior, remove ERR_PTR, and add type-safe generic hashmaps Ian Rogers
2026-11-13 21:48 ` [PATCH v1 01/26] perf threads: Fix uninitialized pointer put when thread removal misses Ian Rogers
2026-11-13 21:56   ` sashiko-bot
2026-11-13 21:48 ` [PATCH v1 02/26] perf annotate: Fix sym_hist_entry memory leak when zeroing histograms Ian Rogers
2026-11-13 21:59   ` sashiko-bot
2026-11-13 21:48 ` [PATCH v1 03/26] perf stat: Fix per_pkg_mask key leak on hashmap__add failure Ian Rogers
2026-11-13 21:55   ` sashiko-bot
2026-11-13 21:48 ` [PATCH v1 04/26] perf build: Don't check difference of perf and libbpf hashmap Ian Rogers
2026-11-13 21:54   ` sashiko-bot
2026-11-13 21:48 ` [PATCH v1 05/26] perf hashmap: Always build perf's hashmap and avoid libbpf symbol conflict Ian Rogers
2026-11-13 21:55   ` sashiko-bot
2026-11-13 21:48 ` [PATCH v1 06/26] perf hashmap: Fix strict aliasing violations in hashmap Ian Rogers
2026-11-13 21:56   ` sashiko-bot
2026-11-13 21:48 ` [PATCH v1 07/26] perf hashmap: Remove errptr usage from hashmap Ian Rogers
2026-11-13 22:01   ` sashiko-bot
2026-11-13 21:48 ` [PATCH v1 08/26] perf hashmap: Introduce generic types and macros Ian Rogers
2026-11-13 22:01   ` sashiko-bot
2026-11-13 21:48 ` [PATCH v1 09/26] perf fncache: Use generic hashmap for fncache Ian Rogers
2026-11-13 21:56   ` sashiko-bot
2026-11-13 21:48 ` [PATCH v1 10/26] perf ftrace: Use generic hashmap for profile_hash Ian Rogers
2026-11-13 21:57   ` sashiko-bot
2026-11-13 21:48 ` [PATCH v1 11/26] perf trace: Use generic hashmap for syscall_stats Ian Rogers
2026-11-13 22:04   ` sashiko-bot
2026-11-13 21:48 ` [PATCH v1 12/26] perf trace: Use generic hashmap for bpf-trace-summary Ian Rogers
2026-11-13 21:58   ` sashiko-bot
2026-11-13 21:48 ` [PATCH v1 13/26] perf lock: Use generic hashmap for slab_hash Ian Rogers
2026-11-13 21:57   ` sashiko-bot
2026-11-13 21:48 ` [PATCH v1 14/26] perf stat: Use generic hashmap for per_pkg_mask Ian Rogers
2026-11-13 21:57   ` sashiko-bot
2026-11-13 21:48 ` [PATCH v1 15/26] perf expr: Use generic hashmap for expr_ids Ian Rogers
2026-11-13 22:02   ` sashiko-bot
2026-11-13 21:48 ` [PATCH v1 16/26] perf pmu: Use generic hashmap for pmu aliases Ian Rogers
2026-11-13 22:04   ` sashiko-bot
2026-11-13 21:48 ` [PATCH v1 17/26] perf hwmon_pmu: Use generic hashmap for hwmon events Ian Rogers
2026-11-13 21:58   ` sashiko-bot
2026-11-13 21:48 ` [PATCH v1 18/26] perf s390: Use generic hashmap for counter name cache Ian Rogers
2026-11-13 21:59   ` sashiko-bot
2026-11-13 21:48 ` [PATCH v1 19/26] perf threads: Use generic hashmap for thread shards Ian Rogers
2026-11-13 22:01   ` sashiko-bot
2026-11-13 21:48 ` [PATCH v1 20/26] perf annotate: Use generic hashmap for sym_samples Ian Rogers
2026-11-13 22:08   ` sashiko-bot
2026-11-13 21:48 ` [PATCH v1 21/26] perf annotate: Use generic hashmap for browser type_hash Ian Rogers
2026-11-13 21:59   ` sashiko-bot
2026-11-13 21:48 ` [PATCH v1 22/26] perf annotate-data: Use generic hashmap for type_hist samples Ian Rogers
2026-11-13 22:00   ` sashiko-bot
2026-11-13 21:48 ` [PATCH v1 23/26] perf inject: Use generic hashmap for aslr remap_addresses Ian Rogers
2026-11-13 21:59   ` sashiko-bot
2026-11-13 21:48 ` [PATCH v1 24/26] perf inject: Use generic hashmap for aslr top_addresses Ian Rogers
2026-11-13 21:59   ` sashiko-bot
2026-11-13 21:48 ` [PATCH v1 25/26] perf inject: Use generic hashmap for aslr evsel_orig_attrs Ian Rogers
2026-11-13 22:00   ` sashiko-bot
2026-11-13 21:48 ` Ian Rogers [this message]
2026-11-13 22:01   ` [PATCH v1 26/26] perf hashmap: Remove untyped struct hashmap API sashiko-bot

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=20261113214850.3329699-27-irogers@google.com \
    --to=irogers@google.com \
    --cc=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=james.clark@linaro.org \
    --cc=jolsa@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox