Skip to content
This repository was archived by the owner on Nov 8, 2023. It is now read-only.

Commit 4376e96

Browse files
committed
Merge tag 'perf-tools-fixes-for-v6.10-2024-07-08' of git://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools
Pull perf tools fixes from Namhyung Kim: "Fix performance issue for v6.10 These address the performance issues reported by Matt, Namhyung and Linus. Recently perf changed the processing of the comm string and DSO using sorted arrays but this caused it to sort the array whenever adding a new entry. This caused a performance issue and the fix is to enhance the sorting by finding the insertion point in the sorted array and to shift righthand side using memmove()" * tag 'perf-tools-fixes-for-v6.10-2024-07-08' of git://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools: perf dsos: When adding a dso into sorted dsos maintain the sort order perf comm str: Avoid sort during insert
2 parents 256abd8 + 7b2450b commit 4376e96

File tree

2 files changed

+39
-16
lines changed

2 files changed

+39
-16
lines changed

tools/perf/util/comm.c

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,6 @@ static struct comm_str *comm_str__new(const char *str)
8686
return result;
8787
}
8888

89-
static int comm_str__cmp(const void *_lhs, const void *_rhs)
90-
{
91-
const struct comm_str *lhs = *(const struct comm_str * const *)_lhs;
92-
const struct comm_str *rhs = *(const struct comm_str * const *)_rhs;
93-
94-
return strcmp(comm_str__str(lhs), comm_str__str(rhs));
95-
}
96-
9789
static int comm_str__search(const void *_key, const void *_member)
9890
{
9991
const char *key = _key;
@@ -169,9 +161,24 @@ static struct comm_str *comm_strs__findnew(const char *str)
169161
}
170162
result = comm_str__new(str);
171163
if (result) {
172-
comm_strs->strs[comm_strs->num_strs++] = result;
173-
qsort(comm_strs->strs, comm_strs->num_strs, sizeof(struct comm_str *),
174-
comm_str__cmp);
164+
int low = 0, high = comm_strs->num_strs - 1;
165+
int insert = comm_strs->num_strs; /* Default to inserting at the end. */
166+
167+
while (low <= high) {
168+
int mid = low + (high - low) / 2;
169+
int cmp = strcmp(comm_str__str(comm_strs->strs[mid]), str);
170+
171+
if (cmp < 0) {
172+
low = mid + 1;
173+
} else {
174+
high = mid - 1;
175+
insert = mid;
176+
}
177+
}
178+
memmove(&comm_strs->strs[insert + 1], &comm_strs->strs[insert],
179+
(comm_strs->num_strs - insert) * sizeof(struct comm_str *));
180+
comm_strs->num_strs++;
181+
comm_strs->strs[insert] = result;
175182
}
176183
}
177184
up_write(&comm_strs->lock);

tools/perf/util/dsos.c

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -203,11 +203,27 @@ int __dsos__add(struct dsos *dsos, struct dso *dso)
203203
dsos->dsos = temp;
204204
dsos->allocated = to_allocate;
205205
}
206-
dsos->dsos[dsos->cnt++] = dso__get(dso);
207-
if (dsos->cnt >= 2 && dsos->sorted) {
208-
dsos->sorted = dsos__cmp_long_name_id_short_name(&dsos->dsos[dsos->cnt - 2],
209-
&dsos->dsos[dsos->cnt - 1])
210-
<= 0;
206+
if (!dsos->sorted) {
207+
dsos->dsos[dsos->cnt++] = dso__get(dso);
208+
} else {
209+
int low = 0, high = dsos->cnt - 1;
210+
int insert = dsos->cnt; /* Default to inserting at the end. */
211+
212+
while (low <= high) {
213+
int mid = low + (high - low) / 2;
214+
int cmp = dsos__cmp_long_name_id_short_name(&dsos->dsos[mid], &dso);
215+
216+
if (cmp < 0) {
217+
low = mid + 1;
218+
} else {
219+
high = mid - 1;
220+
insert = mid;
221+
}
222+
}
223+
memmove(&dsos->dsos[insert + 1], &dsos->dsos[insert],
224+
(dsos->cnt - insert) * sizeof(struct dso *));
225+
dsos->cnt++;
226+
dsos->dsos[insert] = dso__get(dso);
211227
}
212228
dso__set_dsos(dso, dsos);
213229
return 0;

0 commit comments

Comments
 (0)