[PATCH v2 4/4] perf symbols: More specific architecture end fixing

From: Ian Rogers
Date: Tue Apr 12 2022 - 11:48:46 EST


Make the conditions used for symbol fixup closer to the comments. The
logic aims to combine the current conditions as last modified in:
https://lore.kernel.org/lkml/20220317135536.805-1-mpetlan@xxxxxxxxxx/
---
tools/perf/arch/arm64/util/machine.c | 19 ++++++++++---------
tools/perf/arch/powerpc/util/machine.c | 18 +++++++++---------
tools/perf/arch/s390/util/machine.c | 17 +++++++++--------
3 files changed, 28 insertions(+), 26 deletions(-)

diff --git a/tools/perf/arch/arm64/util/machine.c b/tools/perf/arch/arm64/util/machine.c
index 54fb41de9931..f258c1ebac03 100644
--- a/tools/perf/arch/arm64/util/machine.c
+++ b/tools/perf/arch/arm64/util/machine.c
@@ -18,16 +18,17 @@

#define SYMBOL_LIMIT (1 << 12) /* 4K */

-void arch__symbols__fixup_end(struct symbol *p, struct symbol *c,
- bool is_kernel __maybe_unused)
+void arch__symbols__fixup_end(struct symbol *p, struct symbol *c, bool is_kernel)
{
- if (p->end == p->start || p->end != c->start) {
- if ((strchr(p->name, '[') && strchr(c->name, '[') == NULL) ||
- (strchr(p->name, '[') == NULL && strchr(c->name, '[')))
- /* Limit range of last symbol in module and kernel */
- p->end += SYMBOL_LIMIT;
- else
- p->end = c->start;
+ if (is_kernel && (p->end == p->start || p->end != c->start) &&
+ ((strchr(p->name, '[') && strchr(c->name, '[') == NULL) ||
+ (strchr(p->name, '[') == NULL && strchr(c->name, '[')))) {
+ /* Limit range of last symbol in module and kernel */
+ p->end += SYMBOL_LIMIT;
+ pr_debug4("%s sym:%s end:%#" PRIx64 "\n", __func__, p->name, p->end);
+ } else if (p->end == p->start) {
+ /* Expand empty symbols. */
+ p->end = c->start;
pr_debug4("%s sym:%s end:%#" PRIx64 "\n", __func__, p->name, p->end);
}
}
diff --git a/tools/perf/arch/powerpc/util/machine.c b/tools/perf/arch/powerpc/util/machine.c
index a732601f951e..689a48040b64 100644
--- a/tools/perf/arch/powerpc/util/machine.c
+++ b/tools/perf/arch/powerpc/util/machine.c
@@ -14,16 +14,16 @@
* Therefore do not fill this gap and do not assign it to the kernel dso map.
*/

-void arch__symbols__fixup_end(struct symbol *p, struct symbol *c,
- bool is_kernel __maybe_unused)
+void arch__symbols__fixup_end(struct symbol *p, struct symbol *c, bool is_kernel)
)
{
- if (p->end == p->start || p->end != c->start) {
- if (strchr(p->name, '[') == NULL && strchr(c->name, '['))
- /* Limit the range of last kernel symbol */
- p->end += page_size;
- else
- p->end = c->start;
- pr_debug4("%s sym:%s end:%#" PRIx64 "\n", __func__, p->name, p->end);
+ if (is_kernel && (p->end == p->start || p->end != c->start) &&
+ strchr(p->name, '[') == NULL && strchr(c->name, '[')) {
+ /* Limit the range of last kernel symbol */
+ p->end += page_size;
+ } else if (p->end == p->start) {
+ /* Expand empty symbols. */
+ p->end = c->start;
}
+ pr_debug4("%s sym:%s end:%#" PRIx64 "\n", __func__, p->name, p->end);
}
diff --git a/tools/perf/arch/s390/util/machine.c b/tools/perf/arch/s390/util/machine.c
index 8622a1b78748..790d98a39c83 100644
--- a/tools/perf/arch/s390/util/machine.c
+++ b/tools/perf/arch/s390/util/machine.c
@@ -42,15 +42,16 @@ int arch__fix_module_text_start(u64 *start, u64 *size, const char *name)
* and beginning of first module's text segment is very big.
* Therefore do not fill this gap and do not assign it to the kernel dso map.
*/
-void arch__symbols__fixup_end(struct symbol *p, struct symbol *c,
- bool is_kernel __maybe_unused)
+void arch__symbols__fixup_end(struct symbol *p, struct symbol *c, bool is_kernel)
{
- if (p->end == p->start || p->end != c->start) {
- if (strchr(p->name, '[') == NULL && strchr(c->name, '['))
- /* Last kernel symbol mapped to end of page */
- p->end = roundup(p->end, page_size);
- else
- p->end = c->start;
+ if (is_kernel && (p->end == p->start || p->end != c->start) &&
+ strchr(p->name, '[') == NULL && strchr(c->name, '[')) {
+ /* Last kernel symbol mapped to end of page */
+ p->end = roundup(p->end, page_size);
+ pr_debug4("%s sym:%s end:%#" PRIx64 "\n", __func__, p->name, p->end);
+ } else if (p->end == p->start) {
+ /* Expand empty symbols. */
+ p->end = c->start;
pr_debug4("%s sym:%s end:%#" PRIx64 "\n", __func__, p->name, p->end);
}
}
--
2.35.1.1178.g4f1659d476-goog