mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Petr Mladek <pmladek@suse.com>
To: Josh Poimboeuf <jpoimboe@kernel.org>
Cc: live-patching@vger.kernel.org, linux-kernel@vger.kernel.org,
	x86@kernel.org, Miroslav Benes <mbenes@suse.cz>,
	Joe Lawrence <joe.lawrence@redhat.com>,
	Jiri Kosina <jikos@kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Marcos Paulo de Souza <mpdesouza@suse.com>,
	Song Liu <song@kernel.org>
Subject: Re: [RFC 00/31] objtool, livepatch: Livepatch module generation
Date: Wed, 11 Sep 2024 15:27:27 +0200	[thread overview]
Message-ID: <ZuGav4txYowDpxqj@pathway.suse.cz> (raw)
In-Reply-To: <cover.1725334260.git.jpoimboe@kernel.org>

On Mon 2024-09-02 20:59:43, Josh Poimboeuf wrote:
> Hi,
> 
> Here's a new way to build livepatch modules called klp-build.
> 
> I started working on it when I realized that objtool already does 99% of
> the work needed for detecting function changes.
> 
> This is similar in concept to kpatch-build, but the implementation is
> much cleaner.
> 
> Personally I still have reservations about the "source-based" approach
> (klp-convert and friends), including the fragility and performance
> concerns of -flive-patching.  I would submit that klp-build might be
> considered the "official" way to make livepatch modules.

For me, it is not easy to compare the two approaches because I do not
have any practical experience with binary-diff bases approach.
I believe that it has its catches as well.

Anyway, I do not want to open a fight about the two approaches.
I would like to better understand the approach implemented by this
patchset.

First, I have been able to go it working by the extra fixes suggested
in the replies to Song Liu. And it worked well.

Second, I was surprised that the linking of vmlinux.o took much longer
than usual. It seems to be caused by -ffunction-sections
-fdata-sections compiler flags.

The difference is really huge. It might complicate kernel development.
I have done the following test:

	# finish build
	$> make -j8
	# touch a source file to simulate a change
	$> touch include/linux/livepatch.h
	# measure time need for the incremental build
	$> time make -j8

Without -ffunction-sections -fdata-sections:

	$> time make -j8
	real    0m58.719s
	user    3m25.925s
	sys     0m21.895s

With -ffunction-sections -fdata-sections:

	$> time make -j8
	real    13m28.126s
	user    15m43.944s
	sys     0m29.142s

=> Incremental build slowed down from 1min to 13.5min.

Is this expected?

Are you used to this when developing the kernel or do you use
a workaround?


> The concept is similar to kpatch-build which has been a successful
> out-of-tree project for over a decade.  It takes a source .patch as an
> input, builds kernels before and after, does a binary diff, and copies
> any changed functions into a new object file which is then linked into a
> livepatch module.
> 
> By making use of existing objtool functionality, and taking from lessons
> learned over the last decade of maintaining kpatch-build, the overall
> design is much simpler.  In fact, it's a complete redesign and has been
> written from scratch (no copied code).
> 
> Advantages over kpatch-build:
> 
>   - Much simpler design: ~3k fewer LOC

This brings the question how reliable and feature complete this code
is in compare with kPatch which is used in production.

One obvious area is the support of more architectures. I guess that
this  code supports only x86_64 at the moment. While kPatch supports
x86_64, ppc64, and s390. I wonder how complicated it would be to
support more architectures.

Also I tried to compare how kPatch and this code do the binary diff
and found the following:

  a) It seems that kPatch compares the assembly by "memcmp" while
     klp-build uses checksum. This looks good.


  b) Both tools have hacks for many special sections and details.
     I am not sure objtool handles all cases which are handled
     by kPatch.

     For example, it seems that kPatch ignores changes in line numbers
     generated by some macros, see kpatch_line_macro_change_only().
     I can't find a counter part in objtool.


  c) It seems that kPatch contains quite complicated code to correlate
     symbols.

     For example, it correlates local variables by comparing
     functions which reference them, see
     kpatch_correlate_static_local_variables().

     Or kPatch tries to correlate optimized .cold, and .part
     variants of the code via the parent code, see
     kpatch_detect_child_functions()

     While klp-build seems to correlate symbols just be comparing
     the demangled/stripped names, see correlate_symbols().
     This seems to be quite error prone.

     I actually do not understand how klp-build compares symbols
     with the same demangled/stripped names. I probably missed
     a trick somewhere.


Do not get me wrong. I do not expect that the upstream variant would
be feature complete from the beginning. I just want to get a picture
how far it is. The code will be maintained only when it would have
users. And it would have users only when it would be comparable or
better then kPatch.

Best Regards,
Petr

  parent reply	other threads:[~2024-09-11 13:27 UTC|newest]

Thread overview: 94+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-09-03  3:59 Josh Poimboeuf
2024-09-03  3:59 ` [RFC 01/31] x86/alternative: Refactor INT3 call emulation selftest Josh Poimboeuf
2024-09-03  3:59 ` [RFC 02/31] x86/module: Improve relocation error messages Josh Poimboeuf
2024-09-03  3:59 ` [RFC 03/31] x86/kprobes: Remove STACK_FRAME_NON_STANDARD annotation Josh Poimboeuf
2024-09-03  3:59 ` [RFC 04/31] kernel/sys: Don't reference UTS_RELEASE directly Josh Poimboeuf
2024-09-03  3:59 ` [RFC 05/31] x86/compiler: Tweak __UNIQUE_ID naming Josh Poimboeuf
2024-09-03  7:56   ` Peter Zijlstra
2024-09-04  2:01     ` Josh Poimboeuf
2024-09-08 19:43     ` David Laight
2024-09-03  3:59 ` [RFC 06/31] elfnote: Use __UNIQUE_ID() for note symbols Josh Poimboeuf
2024-09-03  3:59 ` [RFC 07/31] kbuild: Remove "kmod" prefix from __KBUILD_MODNAME Josh Poimboeuf
2024-09-03  7:58   ` Peter Zijlstra
2024-09-04  2:11     ` Josh Poimboeuf
2024-09-04  7:53       ` Peter Zijlstra
2024-09-03  3:59 ` [RFC 08/31] objtool: Remove .parainstructions reference Josh Poimboeuf
2024-09-03  3:59 ` [RFC 09/31] objtool: Const string cleanup Josh Poimboeuf
2024-09-03  3:59 ` [RFC 10/31] objtool: Use 'struct elf' in elf macros Josh Poimboeuf
2024-09-03  3:59 ` [RFC 11/31] objtool: Add section/symbol type helpers Josh Poimboeuf
2024-09-03  3:59 ` [RFC 12/31] objtool: 'objname' refactoring Josh Poimboeuf
2024-09-03  3:59 ` [RFC 13/31] objtool: Support references to all symbol types in special sections Josh Poimboeuf
2024-09-03  3:59 ` [RFC 14/31] objtool: Refactor add_jump_destinations() Josh Poimboeuf
2024-09-03  3:59 ` [RFC 15/31] objtool: Interval tree cleanups Josh Poimboeuf
2024-09-03  3:59 ` [RFC 16/31] objtool: Simplify fatal error handling Josh Poimboeuf
2024-09-03  4:00 ` [RFC 17/31] objtool: Open up the elf API Josh Poimboeuf
2024-09-03  4:00 ` [RFC 18/31] objtool: Disallow duplicate prefix symbols Josh Poimboeuf
2024-09-03  4:00 ` [RFC 19/31] objtool: Add elf_create_file() Josh Poimboeuf
2024-09-03  4:00 ` [RFC 20/31] objtool: Add UD1 detection Josh Poimboeuf
2024-09-03  8:17   ` Peter Zijlstra
2024-09-04  2:25     ` Josh Poimboeuf
2024-09-03  4:00 ` [RFC 21/31] objtool: Fix x86 addend calcuation Josh Poimboeuf
2024-09-04  9:24   ` laokz
2024-09-04 16:15     ` Josh Poimboeuf
2024-09-03  4:00 ` [RFC 22/31] objtool: Make find_symbol_containing() less arbitrary Josh Poimboeuf
2024-09-03  4:00 ` [RFC 23/31] objtool: Handle __pa_symbol() relocations Josh Poimboeuf
2024-09-03  4:00 ` [RFC 24/31] objtool: Make STACK_FRAME_NON_STANDARD consistent Josh Poimboeuf
2024-09-03  4:00 ` [RFC 25/31] objtool: Fix interval tree insertion for zero-length symbols Josh Poimboeuf
2024-09-03  4:00 ` [RFC 26/31] objtool: Make interval tree functions "static inline" Josh Poimboeuf
2024-09-03  4:00 ` [RFC 27/31] objtool: Fix weak symbol detection Josh Poimboeuf
2024-09-03  8:26   ` Peter Zijlstra
2024-09-04  3:55     ` Josh Poimboeuf
2024-09-04  7:42       ` Peter Zijlstra
2024-09-04 16:03         ` Josh Poimboeuf
2024-09-03  4:00 ` [RFC 28/31] x86/alternative: Create symbols for special section entries Josh Poimboeuf
2024-09-03  8:29   ` Peter Zijlstra
2024-09-04  4:28     ` Josh Poimboeuf
2024-09-04  8:08       ` Peter Zijlstra
2024-09-04 16:13         ` Josh Poimboeuf
2024-09-04 12:39       ` Borislav Petkov
2024-09-04 16:44         ` Josh Poimboeuf
2024-09-06 10:19           ` Borislav Petkov
2024-09-06 16:53             ` Josh Poimboeuf
2024-09-06  6:51   ` [RFC 28/31] x86/alternative: Create symbols for special section entrie Weinan Liu
2024-09-07  6:28     ` Josh Poimboeuf
2024-09-03  4:00 ` [RFC 29/31] objtool: Calculate function checksums Josh Poimboeuf
2024-09-04  7:54   ` Peter Zijlstra
2024-09-04 16:11     ` Josh Poimboeuf
2024-09-03  4:00 ` [RFC 30/31] livepatch: Enable -ffunction-sections -fdata-sections Josh Poimboeuf
2024-09-03  4:00 ` [RFC 31/31] objtool, livepatch: Livepatch module generation Josh Poimboeuf
2024-09-04 21:38   ` Jeff Johnson
2024-09-05  4:15     ` Josh Poimboeuf
2024-09-12  2:39   ` laokz
2024-09-03 17:32 ` [RFC 00/31] " Song Liu
2024-09-04  4:30   ` Josh Poimboeuf
2024-09-04  5:26     ` Song Liu
2024-09-04  6:37       ` Josh Poimboeuf
2024-09-04  7:09         ` Josh Poimboeuf
2024-09-04 20:23           ` Song Liu
2024-09-04 20:59             ` Josh Poimboeuf
2024-09-04 21:32               ` Song Liu
2024-09-05  4:13               ` Josh Poimboeuf
2024-09-05  7:13                 ` Josh Poimboeuf
2024-09-05 21:34                   ` Song Liu
2024-09-07  6:46   ` Josh Poimboeuf
2024-09-07 17:43     ` Song Liu
2024-09-07 20:14       ` Josh Poimboeuf
2024-09-08  5:04         ` Song Liu
2024-09-09 21:19           ` Josh Poimboeuf
2024-09-09 21:43             ` Song Liu
2024-09-06 13:56 ` Joe Lawrence
2024-09-06 17:00   ` Josh Poimboeuf
2024-09-06 21:01     ` Joe Lawrence
2024-09-06 22:45       ` Josh Poimboeuf
2024-09-07  1:47   ` Josh Poimboeuf
2024-09-07 14:17     ` Joe Lawrence
2024-09-11  7:39 ` Josh Poimboeuf
2024-09-12 13:44   ` Joe Lawrence
2024-09-13 14:39     ` Joe Lawrence
2024-09-13 23:09       ` Josh Poimboeuf
2024-09-11 13:27 ` Petr Mladek [this message]
2024-09-11 16:20   ` Josh Poimboeuf
2024-09-12 16:05     ` Song Liu
2024-09-13 18:16       ` [External] " A K M Fazla Mehrab .
2024-09-17  7:12     ` Petr Mladek
2024-09-23  2:29     ` Chen Zhongjin

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=ZuGav4txYowDpxqj@pathway.suse.cz \
    --to=pmladek@suse.com \
    --cc=jikos@kernel.org \
    --cc=joe.lawrence@redhat.com \
    --cc=jpoimboe@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=live-patching@vger.kernel.org \
    --cc=mbenes@suse.cz \
    --cc=mpdesouza@suse.com \
    --cc=peterz@infradead.org \
    --cc=song@kernel.org \
    --cc=x86@kernel.org \
    /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

Powered by JetHome