From: Jessica Yu <jeyu@redhat.com>
To: Miroslav Benes <mbenes@suse.cz>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>,
Petr Mladek <pmladek@suse.com>,
Rusty Russell <rusty@rustcorp.com.au>,
Seth Jennings <sjenning@redhat.com>,
Jiri Kosina <jikos@kernel.org>, Vojtech Pavlik <vojtech@suse.com>,
linux-api@vger.kernel.org, live-patching@vger.kernel.org,
x86@kernel.org, linux-kernel@vger.kernel.org
Subject: Re: module: save load_info for livepatch modules
Date: Fri, 13 Nov 2015 19:36:19 -0500 [thread overview]
Message-ID: <20151114003536.GA14759@packer-debian-8-amd64.digitalocean.com> (raw)
In-Reply-To: <alpine.LNX.2.00.1511131338510.15073@pobox.suse.cz>
+++ Miroslav Benes [13/11/15 13:46 +0100]:
>On Fri, 13 Nov 2015, Miroslav Benes wrote:
>
>> As for load_info, I don't have a strong opinion whether to keep it for all
>> modules or for livepatch modules only.
>
>I have. We cannot keep it, even for livepatch modules...
>
>In info->hdr there is a temporary copy of the whole module (see
>init_module syscall and the first parts of load_module). In load_module
>a final struct module * is created with parts of info->hdr copied (I'll
>get to that later). So if we saved info->hdr for later purposes we would
>just have two copies of the same module in the memory. The original one
>with !SHF_ALLOC sections and everything in vmalloc area, and the new
>final copy with SHF_ALLOC sections only. This is not good.
>
>If this is correct (and I think it is after some staring into the code) we
>need to do something different. We should build the info we need for
>delayed relocations from the final copy (or refactor the existing
>module code).
>
>The second problem... dynrela sections need to be marked with SHF_ALLOC
>flag, right? Perhaps it would be better not to do it and copy also
>SHF_RELA_LIVEPATCH sections. It is equivalent but not hidden somewhere
>else (in userspace "kpatch-build" tool).
Hm, OK. I understand your concern about leaving a redundant copy of
the module in memory and I agree that we need to do better. I think I
have a solution.
I'm looking at exactly what components we need to make the calls to
apply_relocate_add() work. It's quite simple, I think we only need to
keep the following:
1. A copy of the module's elf section headers i.e. info->sechdrs.
This should be easy to copy. memcpy [info->hdr->e_shnum *
sizeof(Elf_Shdr)] bytes from info->sechdrs. We can maybe put
this in a new field called module->sechdrs.
2. A copy of each __klp_rela section.
If we don't keep info, the current code will discard/not copy the rela
sections over to module core memory since they are !SHF_ALLOC. In
kpatch-build, it is very easy to simply |= the SHF_ALLOC flag with
each __klp_rela section and they will automatically get copied over to
module core memory, and their sh_addr's automatically get reassigned
as well. Thus the klp rela sections will be accessible at
sechdrs[index_of_klpsec].sh_addr. I think this is the easiest solution.
3. A copy of the symbol table.
Notice that module already has a "symtab" field. In kernels configured
with CONFIG_KALLSYMS, it points to a trimmed down symtab (the
mod->core_symtab) in module core memory. This symtab is not normally
complete; only "core" symbols are kept in it. See add_kallsyms()
(called in post_relocations()) for how core symbols are copied into
this symtab. Then, after the symbols have been copied, module->symtab
is reassigned to point to this core_symtab in do_init_module(). Since
CONFIG_LIVEPATCH requires CONFIG_KALLSYMS, I think we can assume that
mod->symtab will be pointing to mod->core_symtab at the end of the
module load process, since mod->symtab gets assigned to core_symtab in
do_init_module() if CONFIG_KALLSYMS is set.
So for livepatch, what we can do is make sure every symbol in a
livepatch module gets copied into this core symtab. It is important we
keep every symbol since apply_relocate_add() will be using the
original symbol indices. We can implement this by adding a check in
add_kallsyms() to see if we're dealing with a livepatch module. If
yes, just copy all the symbols over.
Then, we will also update Elf_Shdr corresponding to the symbol table
section (sechdrs[symindex].sh_addr) to make sure its sh_addr points to
mod->symtab, so apply_relocate_add() will be able to use it.
4. A copy of mod_arch_specific
I think we discussed this in another email somewhere, but we need to
keep a copy if this somewhere as well.
So to summarize, keep a copy of sechdrs in module->sechdrs, keep a
copy of mod_arch_specific, mark klp rela sections with SHF_ALLOC,
re-use module->symtab by making sure every symbol gets considered a
"core" symbol and gets copied over. And of course any memory we
allocate (sechdrs, arch stuff) we will free in perhaps free_module()
somewhere.
I haven't implemented it yet but I think it will work, and we don't
need to keep load_info in this scheme. What do you think?
Thanks,
Jessica
next prev parent reply other threads:[~2015-11-14 0:36 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-10 4:45 [RFC PATCH 0/5] Arch-independent livepatch Jessica Yu
2015-11-10 4:45 ` [RFC PATCH 1/5] elf: add livepatch-specific elf constants Jessica Yu
2015-11-11 13:58 ` Petr Mladek
2015-11-12 15:33 ` Josh Poimboeuf
2015-11-12 15:45 ` Josh Poimboeuf
2015-11-13 6:49 ` Jessica Yu
2015-11-10 4:45 ` [RFC PATCH 2/5] module: save load_info for livepatch modules Jessica Yu
2015-11-11 8:08 ` Minfei Huang
2015-11-11 14:17 ` Miroslav Benes
2015-11-12 5:33 ` Jessica Yu
2015-11-12 10:24 ` Petr Mladek
2015-11-12 13:22 ` Miroslav Benes
2015-11-12 15:03 ` Petr Mladek
2015-11-12 17:05 ` Josh Poimboeuf
2015-11-12 22:17 ` Jessica Yu
2015-11-13 12:24 ` Miroslav Benes
2015-11-13 12:46 ` Miroslav Benes
2015-11-14 0:36 ` Jessica Yu [this message]
2015-11-16 12:12 ` Miroslav Benes
2015-11-13 12:56 ` Miroslav Benes
2015-11-14 2:09 ` Jessica Yu
2015-11-16 12:21 ` Miroslav Benes
2015-11-13 0:25 ` Jessica Yu
2015-11-11 14:31 ` [RFC PATCH 2/5] " Petr Mladek
2015-11-12 4:44 ` Jessica Yu
2015-11-12 10:05 ` Petr Mladek
2015-11-12 14:19 ` Miroslav Benes
2015-11-13 6:35 ` Jessica Yu
2015-11-13 13:07 ` Miroslav Benes
2015-11-13 8:20 ` Jessica Yu
2015-11-12 17:14 ` [RFC PATCH 2/5] " Josh Poimboeuf
2015-11-12 17:21 ` Josh Poimboeuf
2015-11-10 4:45 ` [RFC PATCH 3/5] livepatch: reuse module loader code to write relocations Jessica Yu
2015-11-10 8:13 ` Jiri Slaby
2015-11-11 14:30 ` Miroslav Benes
2015-11-11 20:07 ` Jessica Yu
2015-11-12 15:27 ` Miroslav Benes
2015-11-12 17:40 ` Josh Poimboeuf
2015-11-12 20:22 ` Jessica Yu
2015-11-12 20:32 ` Josh Poimboeuf
2015-11-13 7:15 ` Jessica Yu
2015-11-13 13:51 ` Miroslav Benes
2015-11-12 19:14 ` Jessica Yu
2015-11-12 20:35 ` Jessica Yu
2015-11-11 15:22 ` [RFC PATCH 3/5] " Petr Mladek
2015-11-11 18:27 ` Jessica Yu
2015-11-12 9:16 ` Petr Mladek
2015-11-12 17:59 ` [RFC PATCH 3/5] " Josh Poimboeuf
2015-11-10 4:45 ` [RFC PATCH 4/5] samples: livepatch: init reloc list and mark as klp module Jessica Yu
2015-11-10 8:15 ` Jiri Slaby
2015-11-10 13:50 ` Josh Poimboeuf
2015-11-10 18:37 ` Jessica Yu
2015-11-11 15:42 ` [RFC PATCH 4/5] " Petr Mladek
2015-11-12 6:02 ` Jessica Yu
2015-11-12 10:44 ` Miroslav Benes
2015-11-10 4:45 ` [RFC PATCH 5/5] livepatch: x86: remove unused relocation code Jessica Yu
2015-11-11 15:48 ` Petr Mladek
2015-11-12 18:01 ` Josh Poimboeuf
2015-11-11 14:00 ` [RFC PATCH 0/5] Arch-independent livepatch Miroslav Benes
2015-11-11 16:28 ` Josh Poimboeuf
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=20151114003536.GA14759@packer-debian-8-amd64.digitalocean.com \
--to=jeyu@redhat.com \
--cc=jikos@kernel.org \
--cc=jpoimboe@redhat.com \
--cc=linux-api@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=live-patching@vger.kernel.org \
--cc=mbenes@suse.cz \
--cc=pmladek@suse.com \
--cc=rusty@rustcorp.com.au \
--cc=sjenning@redhat.com \
--cc=vojtech@suse.com \
--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
all inboxes | Powered by JetHome®