Blame 0109-create-diff-object-compare-section-name-with-kpatch_.patch

Michel Lind de7e84
From 9633ff14e80449b2001d6e49884fce896e1ffd41 Mon Sep 17 00:00:00 2001
642cd7
From: Song Liu <songliubraving@fb.com>
642cd7
Date: Wed, 13 Oct 2021 00:10:20 -0700
Michel Lind de7e84
Subject: [PATCH 109/118] create-diff-object: compare section name with
642cd7
 kpatch_section_function_name
642cd7
642cd7
Profile-Guided Optimization (PGO) uses profiling data to help the compiler
642cd7
to evaluate the properties of a function, and thus adds different prefixes
642cd7
to the section/function. For example, with -ffunction-sections, the
642cd7
compiler will prefix some sectiones with .text.unlikely. However, if a
642cd7
function changes from the version in the profiling data, the compiler may
642cd7
ignore the profiling data. This often happens to the patched function
642cd7
when kpatch-build builds the patch. As a result, the original function
642cd7
and the patch function may have different prefix, i.e., one of them has
642cd7
.text, the other has .text.unlikely.
642cd7
642cd7
To correlate these functions properly, use kpatch_section_function_name()
642cd7
in kpatch_correlate_sections() to find matching sections.
642cd7
642cd7
Signed-off-by: Song Liu <songliubraving@fb.com>
Michel Lind de7e84
(cherry picked from commit 47d1b39ba7686e2368c1ad24af274dfd9f54ecf9)
642cd7
---
642cd7
 kpatch-build/create-diff-object.c | 7 +++++--
642cd7
 1 file changed, 5 insertions(+), 2 deletions(-)
642cd7
642cd7
diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c
Michel Lind de7e84
index 22a0155..61e1477 100644
642cd7
--- a/kpatch-build/create-diff-object.c
642cd7
+++ b/kpatch-build/create-diff-object.c
Michel Lind de7e84
@@ -1101,6 +1101,8 @@ static void kpatch_correlate_section(struct section *sec_orig,
642cd7
 		kpatch_correlate_symbol(sec_orig->sym, sec_patched->sym);
642cd7
 }
642cd7
 
642cd7
+static char *kpatch_section_function_name(struct section *sec);
642cd7
+
642cd7
 static void kpatch_correlate_sections(struct list_head *seclist_orig,
642cd7
 		struct list_head *seclist_patched)
642cd7
 {
Michel Lind de7e84
@@ -1110,8 +1112,9 @@ static void kpatch_correlate_sections(struct list_head *seclist_orig,
642cd7
 		if (sec_orig->twin)
642cd7
 			continue;
642cd7
 		list_for_each_entry(sec_patched, seclist_patched, list) {
642cd7
-			if (kpatch_mangled_strcmp(sec_orig->name, sec_patched->name) ||
642cd7
-			    sec_patched->twin)
642cd7
+			if (sec_patched->twin ||
642cd7
+			    kpatch_mangled_strcmp(kpatch_section_function_name(sec_orig),
642cd7
+						  kpatch_section_function_name(sec_patched)))
642cd7
 				continue;
642cd7
 
54dc0a
 			if (is_ubsan_sec(sec_orig->name))
642cd7
-- 
Michel Lind de7e84
2.48.1
642cd7