From: Jessica Yu <jeyu@redhat.com>
To: Miroslav Benes <mbenes@suse.cz>
Cc: Rusty Russell <rusty@rustcorp.com.au>,
Josh Poimboeuf <jpoimboe@redhat.com>,
Petr Mladek <pmladek@suse.com>, Jiri Kosina <jikos@kernel.org>,
Jonathan Corbet <corbet@lwn.net>,
linux-api@vger.kernel.org, live-patching@vger.kernel.org,
x86@kernel.org, linux-kernel@vger.kernel.org,
linux-s390@vger.kernel.org, linux-doc@vger.kernel.org
Subject: Re: livepatch: reuse module loader code to write relocations
Date: Mon, 21 Mar 2016 15:18:32 -0400 [thread overview]
Message-ID: <20160321191832.GC12357@packer-debian-8-amd64.digitalocean.com> (raw)
In-Reply-To: <alpine.LNX.2.00.1603211449240.12175@pobox.suse.cz>
+++ Miroslav Benes [21/03/16 14:55 +0100]:
>On Wed, 16 Mar 2016, Jessica Yu wrote:
>
>[...]
>
>> +struct klp_buf {
>> + char symname[KSYM_SYMBOL_LEN];
>
>I think it is better to make this KSYM_NAME_LEN. KSYM_SYMBOL_LEN looks
>like something different and KSYM_NAME_LEN is 128 which you reference
>below.
>
Ack, I did mean to use KSYM_NAME_LEN, thanks.
>> + char objname[MODULE_NAME_LEN];
>> +};
>
>[...]
>
>> +static int klp_resolve_symbols(Elf_Shdr *relasec, struct module *pmod)
>> +{
>> + int i, cnt, vmlinux, ret;
>> + struct klp_buf bufs = {0};
>> + Elf_Rela *relas;
>> + Elf_Sym *sym;
>> + char *symname;
>> + unsigned long sympos;
>> +
>> + relas = (Elf_Rela *) relasec->sh_addr;
>> + /* For each rela in this klp relocation section */
>> + for (i = 0; i < relasec->sh_size / sizeof(Elf_Rela); i++) {
>> + sym = pmod->core_kallsyms.symtab + ELF_R_SYM(relas[i].r_info);
>> + if (sym->st_shndx != SHN_LIVEPATCH)
>> + return -EINVAL;
>> +
>> + klp_clear_buf(&bufs);
>> +
>> + /* Format: .klp.sym.objname.symbol_name,sympos */
>> + symname = pmod->core_kallsyms.strtab + sym->st_name;
>> + cnt = sscanf(symname, ".klp.sym.%64[^.].%128[^,],%lu",
>> + bufs.objname, bufs.symname, &sympos);
>
>It would be really nice to change actual values for their macro
>definitions, but this would be a mess which is not worth it. Anyway
>shouldn't those width modifiers be %63 and %127 to make a room for \0?
>
Yes, this is a concern and I'm not sure what the best way to fix it
is. If both MODULE_NAME_LEN and KSYM_NAME_LEN were straight up
constants, then I think Josh's stringify approach would have worked
perfectly. However since MODULE_NAME_LEN translates to an expression
(64 - sizeof(unsigned long)), which the preprocessor cannot evaluate,
we will need another approach. Building the format strings at run time
might be messier than we'd like. Alternatively we could just go the
simple route and simply be a bit more aggressive on the upper bound
for the format width; though the size of long varies on different
architectures, afaik the max size it could ever be on any arch is 8
bytes, so perhaps 64 - 8 = 56 (then - 1 to make room for \0) might be
an appropriate field width. This would deserve a comment as well.
>> + if (cnt != 3)
>> + return -EINVAL;
>> +
>> + /* klp_find_object_symbol() treats a NULL objname as vmlinux */
>> + vmlinux = !strcmp(bufs.objname, "vmlinux");
>> + ret = klp_find_object_symbol(vmlinux ? NULL : bufs.objname,
>> + bufs.symname, sympos,
>> + (unsigned long *) &sym->st_value);
>> + if (ret)
>> + return ret;
>> }
>> - preempt_enable();
>>
>> - /*
>> - * Check if it's in another .o within the patch module. This also
>> - * checks that the external symbol is unique.
>> - */
>> - return klp_find_object_symbol(pmod->name, name, 0, addr);
>> + return 0;
>> }
>>
>> static int klp_write_object_relocations(struct module *pmod,
>> struct klp_object *obj)
>> {
>> - int ret = 0;
>> - unsigned long val;
>> - struct klp_reloc *reloc;
>> + int i, cnt, ret = 0;
>> + const char *objname, *secname;
>> + struct klp_buf bufs = {0};
>> + Elf_Shdr *sec;
>>
>> if (WARN_ON(!klp_is_object_loaded(obj)))
>> return -EINVAL;
>>
>> - if (WARN_ON(!obj->relocs))
>> - return -EINVAL;
>> + objname = klp_is_module(obj) ? obj->name : "vmlinux";
>>
>> module_disable_ro(pmod);
>> + /* For each klp relocation section */
>> + for (i = 1; i < pmod->klp_info->hdr.e_shnum; i++) {
>> + sec = pmod->klp_info->sechdrs + i;
>> + if (!(sec->sh_flags & SHF_RELA_LIVEPATCH))
>> + continue;
>>
>> - for (reloc = obj->relocs; reloc->name; reloc++) {
>> - /* discover the address of the referenced symbol */
>> - if (reloc->external) {
>> - if (reloc->sympos > 0) {
>> - pr_err("non-zero sympos for external reloc symbol '%s' is not supported\n",
>> - reloc->name);
>> - ret = -EINVAL;
>> - goto out;
>> - }
>> - ret = klp_find_external_symbol(pmod, reloc->name, &val);
>> - } else
>> - ret = klp_find_object_symbol(obj->name,
>> - reloc->name,
>> - reloc->sympos,
>> - &val);
>> - if (ret)
>> - goto out;
>> + klp_clear_buf(&bufs);
>>
>> - ret = klp_write_module_reloc(pmod, reloc->type, reloc->loc,
>> - val + reloc->addend);
>> - if (ret) {
>> - pr_err("relocation failed for symbol '%s' at 0x%016lx (%d)\n",
>> - reloc->name, val, ret);
>> - goto out;
>> + /* Check if this klp relocation section belongs to obj */
>> + secname = pmod->klp_info->secstrings + sec->sh_name;
>> + cnt = sscanf(secname, ".klp.rela.%64[^.]", bufs.objname);
>
>Same here.
>
>Otherwise it looks really good (which applies for the whole series), so
>after fixing these nits you can add my
>
>Reviewed-by: Miroslav Benes <mbenes@suse.cz>
>
>Cheers,
>Miroslav
next prev parent reply other threads:[~2016-03-21 19:18 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-16 19:47 [PATCH v5 0/6] (mostly) Arch-independent livepatch Jessica Yu
2016-03-16 19:47 ` [PATCH v5 1/6] Elf: add livepatch-specific Elf constants Jessica Yu
2016-03-16 19:47 ` [PATCH v5 2/6] module: preserve Elf information for livepatch modules Jessica Yu
2016-03-16 20:28 ` kbuild test robot
2016-03-16 21:31 ` kbuild test robot
2016-03-21 13:48 ` Miroslav Benes
2016-03-16 19:47 ` [PATCH v5 3/6] module: s390: keep mod_arch_specific " Jessica Yu
2016-03-21 13:49 ` Miroslav Benes
2016-03-16 19:47 ` [PATCH v5 4/6] livepatch: reuse module loader code to write relocations Jessica Yu
2016-03-21 13:55 ` Miroslav Benes
2016-03-21 19:18 ` Jessica Yu [this message]
2016-03-21 19:24 ` Josh Poimboeuf
2016-03-21 21:16 ` Jiri Kosina
2016-03-21 21:34 ` Josh Poimboeuf
[not found] ` <alpine.LNX.2.00.1603212256080.3656@cbobk.fhfr.pm>
2016-03-22 19:00 ` Jessica Yu
2016-03-21 16:31 ` [PATCH v5 4/6] " Petr Mladek
[not found] ` <20160321164651.zautqklg7ng3jfbn@treble.redhat.com>
[not found] ` <20160321173639.ooighgwwubuqv6le@treble.redhat.com>
2016-03-21 18:07 ` Jessica Yu
2016-03-16 19:47 ` [PATCH v5 5/6] samples: livepatch: mark as livepatch module Jessica Yu
2016-03-21 15:54 ` Josh Poimboeuf
2016-03-16 19:47 ` [PATCH v5 6/6] Documentation: livepatch: outline Elf format and requirements for patch modules Jessica Yu
2016-03-21 13:56 ` Miroslav Benes
[not found] <1454548271-24923-1-git-send-email-jeyu@redhat.com>
2016-02-04 1:11 ` [RFC PATCH v4 4/6] livepatch: reuse module loader code to write relocations Jessica Yu
[not found] ` <20160209140106.GC12548@pathway.suse.cz>
2016-02-10 1:21 ` Jessica Yu
[not found] <1452281304-28618-1-git-send-email-jeyu@redhat.com>
2016-01-08 19:28 ` [RFC PATCH v3 4/6] " Jessica Yu
2016-01-13 9:19 ` Miroslav Benes
[not found] ` <20160113183924.GA980@packer-debian-8-amd64.digitalocean.com>
2016-01-14 9:10 ` Miroslav Benes
[not found] ` <alpine.LNX.2.00.1601121729480.15984@pobox.suse.cz>
2016-01-14 3:49 ` Jessica Yu
2016-01-14 9:04 ` Miroslav Benes
[not found] <1448943679-3412-1-git-send-email-jeyu@redhat.com>
2015-12-01 4:21 ` [RFC PATCH v2 4/6] " Jessica Yu
2015-12-08 18:38 ` Josh Poimboeuf
[not found] ` <20151209191013.GA25387@packer-debian-8-amd64.digitalocean.com>
[not found] ` <20151210142830.GA29872@treble.redhat.com>
2015-12-10 21:33 ` Jessica Yu
[not found] ` <20151216054048.GA28258@packer-debian-8-amd64.digitalocean.com>
2015-12-16 12:59 ` Miroslav Benes
2015-12-16 19:14 ` Jessica Yu
[not found] ` <20151217154500.GG3729@pathway.suse.cz>
2015-12-21 5:57 ` Jessica Yu
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=20160321191832.GC12357@packer-debian-8-amd64.digitalocean.com \
--to=jeyu@redhat.com \
--cc=corbet@lwn.net \
--cc=jikos@kernel.org \
--cc=jpoimboe@redhat.com \
--cc=linux-api@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=live-patching@vger.kernel.org \
--cc=mbenes@suse.cz \
--cc=pmladek@suse.com \
--cc=rusty@rustcorp.com.au \
--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