mirror of https://lore.kernel.org/lkml/
 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>,
	Mark Rutland <mark.rutland@arm.com>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Jiri Olsa <jolsa@kernel.org>, Namhyung Kim <namhyung@kernel.org>,
	Ian Rogers <irogers@google.com>,
	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: [PATCH v5 39/50] perf dsos: Tidy reference counting and locking
Date: Mon, 27 Nov 2023 14:08:51 -0800	[thread overview]
Message-ID: <20231127220902.1315692-40-irogers@google.com> (raw)
In-Reply-To: <20231127220902.1315692-1-irogers@google.com>

Move more functionality into dsos.c generally from machine, renaming
functions to match their new usage. The find function is made to
always "get" before returning a dso. Reduce the scope of locks in vdso
to match the locking paradigm.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/util/dsos.c    | 73 +++++++++++++++++++++++++++++++++++----
 tools/perf/util/dsos.h    |  9 ++++-
 tools/perf/util/machine.c | 62 ++-------------------------------
 tools/perf/util/map.c     |  4 +--
 tools/perf/util/vdso.c    | 48 +++++++++++--------------
 5 files changed, 97 insertions(+), 99 deletions(-)

diff --git a/tools/perf/util/dsos.c b/tools/perf/util/dsos.c
index e65ef6762bed..d269e09005a7 100644
--- a/tools/perf/util/dsos.c
+++ b/tools/perf/util/dsos.c
@@ -181,7 +181,7 @@ struct dso *__dsos__findnew_link_by_longname_id(struct rb_root *root, struct dso
 			 * at the end of the list of duplicates.
 			 */
 			if (!dso || (dso == this))
-				return this;	/* Find matching dso */
+				return dso__get(this);	/* Find matching dso */
 			/*
 			 * The core kernel DSOs may have duplicated long name.
 			 * In this case, the short name should be different.
@@ -253,15 +253,20 @@ static struct dso *__dsos__find_id(struct dsos *dsos, const char *name, struct d
 	if (cmp_short) {
 		list_for_each_entry(pos, &dsos->head, node)
 			if (__dso__cmp_short_name(name, id, pos) == 0)
-				return pos;
+				return dso__get(pos);
 		return NULL;
 	}
 	return __dsos__findnew_by_longname_id(&dsos->root, name, id);
 }
 
-struct dso *__dsos__find(struct dsos *dsos, const char *name, bool cmp_short)
+struct dso *dsos__find(struct dsos *dsos, const char *name, bool cmp_short)
 {
-	return __dsos__find_id(dsos, name, NULL, cmp_short);
+	struct dso *res;
+
+	down_read(&dsos->lock);
+	res = __dsos__find_id(dsos, name, NULL, cmp_short);
+	up_read(&dsos->lock);
+	return res;
 }
 
 static void dso__set_basename(struct dso *dso)
@@ -303,8 +308,6 @@ static struct dso *__dsos__addnew_id(struct dsos *dsos, const char *name, struct
 	if (dso != NULL) {
 		__dsos__add(dsos, dso);
 		dso__set_basename(dso);
-		/* Put dso here because __dsos_add already got it */
-		dso__put(dso);
 	}
 	return dso;
 }
@@ -328,7 +331,7 @@ struct dso *dsos__findnew_id(struct dsos *dsos, const char *name, struct dso_id
 {
 	struct dso *dso;
 	down_write(&dsos->lock);
-	dso = dso__get(__dsos__findnew_id(dsos, name, id));
+	dso = __dsos__findnew_id(dsos, name, id);
 	up_write(&dsos->lock);
 	return dso;
 }
@@ -374,3 +377,59 @@ int __dsos__hit_all(struct dsos *dsos)
 
 	return 0;
 }
+
+struct dso *dsos__findnew_module_dso(struct dsos *dsos,
+				     struct machine *machine,
+				     struct kmod_path *m,
+				     const char *filename)
+{
+	struct dso *dso;
+
+	down_write(&dsos->lock);
+
+	dso = __dsos__find_id(dsos, m->name, NULL, /*cmp_short=*/true);
+	if (!dso) {
+		dso = __dsos__addnew(dsos, m->name);
+		if (dso == NULL)
+			goto out_unlock;
+
+		dso__set_module_info(dso, m, machine);
+		dso__set_long_name(dso, strdup(filename), true);
+		dso->kernel = DSO_SPACE__KERNEL;
+	}
+
+out_unlock:
+	up_write(&dsos->lock);
+	return dso;
+}
+
+struct dso *dsos__find_kernel_dso(struct dsos *dsos)
+{
+	struct dso *dso, *res = NULL;
+
+	down_read(&dsos->lock);
+	list_for_each_entry(dso, &dsos->head, node) {
+		/*
+		 * The cpumode passed to is_kernel_module is not the cpumode of
+		 * *this* event. If we insist on passing correct cpumode to
+		 * is_kernel_module, we should record the cpumode when we adding
+		 * this dso to the linked list.
+		 *
+		 * However we don't really need passing correct cpumode.  We
+		 * know the correct cpumode must be kernel mode (if not, we
+		 * should not link it onto kernel_dsos list).
+		 *
+		 * Therefore, we pass PERF_RECORD_MISC_CPUMODE_UNKNOWN.
+		 * is_kernel_module() treats it as a kernel cpumode.
+		 */
+		if (!dso->kernel ||
+		    is_kernel_module(dso->long_name,
+				     PERF_RECORD_MISC_CPUMODE_UNKNOWN))
+			continue;
+
+		res = dso__get(dso);
+		break;
+	}
+	up_read(&dsos->lock);
+	return res;
+}
diff --git a/tools/perf/util/dsos.h b/tools/perf/util/dsos.h
index 1c81ddf07f8f..a7c7f723c5ff 100644
--- a/tools/perf/util/dsos.h
+++ b/tools/perf/util/dsos.h
@@ -10,6 +10,8 @@
 
 struct dso;
 struct dso_id;
+struct kmod_path;
+struct machine;
 
 /*
  * DSOs are put into both a list for fast iteration and rbtree for fast
@@ -33,7 +35,7 @@ void dsos__exit(struct dsos *dsos);
 void __dsos__add(struct dsos *dsos, struct dso *dso);
 void dsos__add(struct dsos *dsos, struct dso *dso);
 struct dso *__dsos__addnew(struct dsos *dsos, const char *name);
-struct dso *__dsos__find(struct dsos *dsos, const char *name, bool cmp_short);
+struct dso *dsos__find(struct dsos *dsos, const char *name, bool cmp_short);
 
 struct dso *dsos__findnew_id(struct dsos *dsos, const char *name, struct dso_id *id);
  
@@ -48,4 +50,9 @@ size_t __dsos__fprintf(struct dsos *dsos, FILE *fp);
 
 int __dsos__hit_all(struct dsos *dsos);
 
+struct dso *dsos__findnew_module_dso(struct dsos *dsos, struct machine *machine,
+				     struct kmod_path *m, const char *filename);
+
+struct dso *dsos__find_kernel_dso(struct dsos *dsos);
+
 #endif /* __PERF_DSOS */
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
index a0abfba90962..06026a1b2d1a 100644
--- a/tools/perf/util/machine.c
+++ b/tools/perf/util/machine.c
@@ -646,31 +646,6 @@ int machine__process_lost_samples_event(struct machine *machine __maybe_unused,
 	return 0;
 }
 
-static struct dso *machine__findnew_module_dso(struct machine *machine,
-					       struct kmod_path *m,
-					       const char *filename)
-{
-	struct dso *dso;
-
-	down_write(&machine->dsos.lock);
-
-	dso = __dsos__find(&machine->dsos, m->name, true);
-	if (!dso) {
-		dso = __dsos__addnew(&machine->dsos, m->name);
-		if (dso == NULL)
-			goto out_unlock;
-
-		dso__set_module_info(dso, m, machine);
-		dso__set_long_name(dso, strdup(filename), true);
-		dso->kernel = DSO_SPACE__KERNEL;
-	}
-
-	dso__get(dso);
-out_unlock:
-	up_write(&machine->dsos.lock);
-	return dso;
-}
-
 int machine__process_aux_event(struct machine *machine __maybe_unused,
 			       union perf_event *event)
 {
@@ -854,7 +829,7 @@ static struct map *machine__addnew_module_map(struct machine *machine, u64 start
 	if (kmod_path__parse_name(&m, filename))
 		return NULL;
 
-	dso = machine__findnew_module_dso(machine, &m, filename);
+	dso = dsos__findnew_module_dso(&machine->dsos, machine, &m, filename);
 	if (dso == NULL)
 		goto out;
 
@@ -1659,40 +1634,7 @@ static int machine__process_kernel_mmap_event(struct machine *machine,
 		 * Should be there already, from the build-id table in
 		 * the header.
 		 */
-		struct dso *kernel = NULL;
-		struct dso *dso;
-
-		down_read(&machine->dsos.lock);
-
-		list_for_each_entry(dso, &machine->dsos.head, node) {
-
-			/*
-			 * The cpumode passed to is_kernel_module is not the
-			 * cpumode of *this* event. If we insist on passing
-			 * correct cpumode to is_kernel_module, we should
-			 * record the cpumode when we adding this dso to the
-			 * linked list.
-			 *
-			 * However we don't really need passing correct
-			 * cpumode.  We know the correct cpumode must be kernel
-			 * mode (if not, we should not link it onto kernel_dsos
-			 * list).
-			 *
-			 * Therefore, we pass PERF_RECORD_MISC_CPUMODE_UNKNOWN.
-			 * is_kernel_module() treats it as a kernel cpumode.
-			 */
-
-			if (!dso->kernel ||
-			    is_kernel_module(dso->long_name,
-					     PERF_RECORD_MISC_CPUMODE_UNKNOWN))
-				continue;
-
-
-			kernel = dso__get(dso);
-			break;
-		}
-
-		up_read(&machine->dsos.lock);
+		struct dso *kernel = dsos__find_kernel_dso(&machine->dsos);
 
 		if (kernel == NULL)
 			kernel = machine__findnew_dso(machine, machine->mmap_name);
diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c
index cf5a15db3a1f..7c1fff9e413d 100644
--- a/tools/perf/util/map.c
+++ b/tools/perf/util/map.c
@@ -196,9 +196,7 @@ struct map *map__new(struct machine *machine, u64 start, u64 len,
 			 * reading the header will have the build ID set and all future mmaps will
 			 * have it missing.
 			 */
-			down_read(&machine->dsos.lock);
-			header_bid_dso = __dsos__find(&machine->dsos, filename, false);
-			up_read(&machine->dsos.lock);
+			header_bid_dso = dsos__find(&machine->dsos, filename, false);
 			if (header_bid_dso && header_bid_dso->header_build_id) {
 				dso__set_build_id(dso, &header_bid_dso->bid);
 				dso->header_build_id = 1;
diff --git a/tools/perf/util/vdso.c b/tools/perf/util/vdso.c
index df8963796187..35532dcbff74 100644
--- a/tools/perf/util/vdso.c
+++ b/tools/perf/util/vdso.c
@@ -133,8 +133,6 @@ static struct dso *__machine__addnew_vdso(struct machine *machine, const char *s
 	if (dso != NULL) {
 		__dsos__add(&machine->dsos, dso);
 		dso__set_long_name(dso, long_name, false);
-		/* Put dso here because __dsos_add already got it */
-		dso__put(dso);
 	}
 
 	return dso;
@@ -252,17 +250,15 @@ static struct dso *__machine__findnew_compat(struct machine *machine,
 	const char *file_name;
 	struct dso *dso;
 
-	dso = __dsos__find(&machine->dsos, vdso_file->dso_name, true);
+	dso = dsos__find(&machine->dsos, vdso_file->dso_name, true);
 	if (dso)
-		goto out;
+		return dso;
 
 	file_name = vdso__get_compat_file(vdso_file);
 	if (!file_name)
-		goto out;
+		return NULL;
 
-	dso = __machine__addnew_vdso(machine, vdso_file->dso_name, file_name);
-out:
-	return dso;
+	return __machine__addnew_vdso(machine, vdso_file->dso_name, file_name);
 }
 
 static int __machine__findnew_vdso_compat(struct machine *machine,
@@ -308,21 +304,21 @@ static struct dso *machine__find_vdso(struct machine *machine,
 	dso_type = machine__thread_dso_type(machine, thread);
 	switch (dso_type) {
 	case DSO__TYPE_32BIT:
-		dso = __dsos__find(&machine->dsos, DSO__NAME_VDSO32, true);
+		dso = dsos__find(&machine->dsos, DSO__NAME_VDSO32, true);
 		if (!dso) {
-			dso = __dsos__find(&machine->dsos, DSO__NAME_VDSO,
-					   true);
+			dso = dsos__find(&machine->dsos, DSO__NAME_VDSO,
+					 true);
 			if (dso && dso_type != dso__type(dso, machine))
 				dso = NULL;
 		}
 		break;
 	case DSO__TYPE_X32BIT:
-		dso = __dsos__find(&machine->dsos, DSO__NAME_VDSOX32, true);
+		dso = dsos__find(&machine->dsos, DSO__NAME_VDSOX32, true);
 		break;
 	case DSO__TYPE_64BIT:
 	case DSO__TYPE_UNKNOWN:
 	default:
-		dso = __dsos__find(&machine->dsos, DSO__NAME_VDSO, true);
+		dso = dsos__find(&machine->dsos, DSO__NAME_VDSO, true);
 		break;
 	}
 
@@ -334,37 +330,33 @@ struct dso *machine__findnew_vdso(struct machine *machine,
 {
 	struct vdso_info *vdso_info;
 	struct dso *dso = NULL;
+	char *file;
 
-	down_write(&machine->dsos.lock);
 	if (!machine->vdso_info)
 		machine->vdso_info = vdso_info__new();
 
 	vdso_info = machine->vdso_info;
 	if (!vdso_info)
-		goto out_unlock;
+		return NULL;
 
 	dso = machine__find_vdso(machine, thread);
 	if (dso)
-		goto out_unlock;
+		return dso;
 
 #if BITS_PER_LONG == 64
 	if (__machine__findnew_vdso_compat(machine, thread, vdso_info, &dso))
-		goto out_unlock;
+		return dso;
 #endif
 
-	dso = __dsos__find(&machine->dsos, DSO__NAME_VDSO, true);
-	if (!dso) {
-		char *file;
+	dso = dsos__find(&machine->dsos, DSO__NAME_VDSO, true);
+	if (dso)
+		return dso;
 
-		file = get_file(&vdso_info->vdso);
-		if (file)
-			dso = __machine__addnew_vdso(machine, DSO__NAME_VDSO, file);
-	}
+	file = get_file(&vdso_info->vdso);
+	if (!file)
+		return NULL;
 
-out_unlock:
-	dso__get(dso);
-	up_write(&machine->dsos.lock);
-	return dso;
+	return __machine__addnew_vdso(machine, DSO__NAME_VDSO, file);
 }
 
 bool dso__is_vdso(struct dso *dso)
-- 
2.43.0.rc1.413.gea7ed67945-goog


  parent reply	other threads:[~2023-11-27 22:14 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
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 ` Ian Rogers [this message]
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=20231127220902.1315692-40-irogers@google.com \
    --to=irogers@google.com \
    --cc=9erthalion6@gmail.com \
    --cc=acme@kernel.org \
    --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=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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®