From 909d7a656bb5e638bb199b8abd1c5b221b873793 Mon Sep 17 00:00:00 2001 From: Song Liu Date: Wed, 13 Oct 2021 00:10:20 -0700 Subject: [PATCH 1/2] create-diff-object: compare section name with kpatch_section_function_name Profile-Guided Optimization (PGO) uses profiling data to help the compiler to evaluate the properties of a function, and thus adds different prefixes to the section/function. For example, with -ffunction-sections, the compiler will prefix some sectiones with .text.unlikely. However, if a function changes from the version in the profiling data, the compiler may ignore the profiling data. This often happens to the patched function when kpatch-build builds the patch. As a result, the original function and the patch function may have different prefix, i.e., one of them has .text, the other has .text.unlikely. To correlate these functions properly, use kpatch_section_function_name() in kpatch_correlate_sections() to find matching sections. Signed-off-by: Song Liu --- kpatch-build/create-diff-object.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c index 826741d0..319ed68d 100644 --- a/kpatch-build/create-diff-object.c +++ b/kpatch-build/create-diff-object.c @@ -1001,6 +1001,8 @@ static void kpatch_correlate_section(struct section *sec_orig, kpatch_correlate_symbol(sec_orig->sym, sec_patched->sym); } +static char *kpatch_section_function_name(struct section *sec); + static void kpatch_correlate_sections(struct list_head *seclist_orig, struct list_head *seclist_patched) { @@ -1010,8 +1012,9 @@ static void kpatch_correlate_sections(struct list_head *seclist_orig, if (sec_orig->twin) continue; list_for_each_entry(sec_patched, seclist_patched, list) { - if (kpatch_mangled_strcmp(sec_orig->name, sec_patched->name) || - sec_patched->twin) + if (sec_patched->twin || + kpatch_mangled_strcmp(kpatch_section_function_name(sec_orig), + kpatch_section_function_name(sec_patched))) continue; if (is_special_static(is_rela_section(sec_orig) ? From 0223fa3ab3efc1bed18cff7acf470185e2e66406 Mon Sep 17 00:00:00 2001 From: Song Liu Date: Wed, 13 Oct 2021 01:03:55 -0700 Subject: [PATCH 2/2] kpatch-build: add support for clang pgo For clang with Profile-Guided Optimization (PGO), profile data is needed to compile the livepatch properly. Add option -p|--profile-data, which specifies the profile data file. This option is only valid with CONFIG_CC_IS_CLANG and CONFIG_PGO_CLANG. Signed-off-by: Song Liu --- kpatch-build/kpatch-build | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build index 634095d5..1f3fc99b 100755 --- a/kpatch-build/kpatch-build +++ b/kpatch-build/kpatch-build @@ -535,9 +535,10 @@ usage() { echo " --skip-cleanup Skip post-build cleanup" >&2 echo " --skip-compiler-check Skip compiler version matching check" >&2 echo " (not recommended)" >&2 + echo " -p, --profile-data specify profile data for PGO (clang only)" >&2 } -options="$(getopt -o ha:r:s:c:v:j:t:n:o:dR -l "help,archversion:,sourcerpm:,sourcedir:,config:,vmlinux:,jobs:,target:,name:,output:,oot-module:,oot-module-src:,debug,skip-gcc-check,skip-compiler-check,skip-cleanup,non-replace" -- "$@")" || die "getopt failed" +options="$(getopt -o ha:r:s:c:v:j:t:n:o:dRp: -l "help,archversion:,sourcerpm:,sourcedir:,config:,vmlinux:,jobs:,target:,name:,output:,oot-module:,oot-module-src:,debug,skip-gcc-check,skip-compiler-check,skip-cleanup,non-replace,profile-data" -- "$@")" || die "getopt failed" eval set -- "$options" @@ -619,6 +620,10 @@ while [[ $# -gt 0 ]]; do echo "WARNING: Skipping compiler version matching check (not recommended)" SKIPCOMPILERCHECK=1 ;; + -p|--profile-data) + PROFILE_DATA="$(readlink -f "$2")" + shift + ;; *) [[ "$1" = "--" ]] && shift && continue [[ ! -f "$1" ]] && die "patch file '$1' not found" @@ -896,6 +901,16 @@ fi if [[ -n "$CONFIG_CC_IS_CLANG" ]]; then echo "WARNING: Clang support is experimental" + if [[ -z "$PROFILE_DATA" ]] && [[ -n "$CONFIG_PGO_CLANG" ]]; then + die "Please specify profile-data for CONFIG_PGO_CLANG" + fi + if [[ -n "$PROFILE_DATA" ]] && [[ -z "$CONFIG_PGO_CLANG" ]]; then + echo "WARNING profile-data specified w/o CONFIG_PGO_CLANG, ignore it" + fi +else + if [[ -n "$PROFILE_DATA" ]]; then + die "Only supports profile-data with Clang" + fi fi if [[ "$SKIPCOMPILERCHECK" -eq 0 ]]; then @@ -943,6 +958,9 @@ declare -a MAKEVARS if [[ -n "$CONFIG_CC_IS_CLANG" ]]; then MAKEVARS+=("CC=${KPATCH_CC_PREFIX}${CLANG}") MAKEVARS+=("HOSTCC=clang") + if [[ -n "$CONFIG_PGO_CLANG" ]]; then + MAKEVARS+=("CFLAGS_PGO_CLANG=-fprofile-use=$PROFILE_DATA") + fi else MAKEVARS+=("CC=${KPATCH_CC_PREFIX}${GCC}") fi