From: Ankur Arora <ankur.a.arora@oracle.com> To: linux-kernel@vger.kernel.org, x86@kernel.org Cc: peterz@infradead.org, hpa@zytor.com, jpoimboe@redhat.com, namit@vmware.com, mhiramat@kernel.org, jgross@suse.com, bp@alien8.de, vkuznets@redhat.com, pbonzini@redhat.com, boris.ostrovsky@oracle.com, mihai.carabas@oracle.com, kvm@vger.kernel.org, xen-devel@lists.xenproject.org, virtualization@lists.linux-foundation.org, Ankur Arora <ankur.a.arora@oracle.com> Subject: [RFC PATCH 07/26] x86/paravirt: Persist .parainstructions.runtime Date: Tue, 7 Apr 2020 22:03:04 -0700 [thread overview] Message-ID: <20200408050323.4237-8-ankur.a.arora@oracle.com> (raw) In-Reply-To: <20200408050323.4237-1-ankur.a.arora@oracle.com> Persist .parainstructions.runtime in memory. We will use it to patch paravirt-ops at runtime. The extra memory footprint depends on chosen config options but the inlined queued_spin_unlock() presents an edge case: $ objdump -h vmlinux|grep .parainstructions Idx Name Size VMA LMA File-off Algn 27 .parainstructions 0001013c ffffffff82895000 0000000002895000 01c95000 2**3 28 .parainstructions.runtime 0000cd2c ffffffff828a5140 00000000028a5140 01ca5140 2**3 (The added footprint is the size of the .parainstructions.runtime section.) $ size vmlinux text data bss dec hex filename 13726196 12302814 14094336 40123346 2643bd2 vmlinux Signed-off-by: Ankur Arora <ankur.a.arora@oracle.com> --- arch/x86/include/asm/alternative.h | 1 + arch/x86/kernel/alternative.c | 16 +++++++++++++++- arch/x86/kernel/module.c | 28 +++++++++++++++++++++++----- 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/arch/x86/include/asm/alternative.h b/arch/x86/include/asm/alternative.h index db91a7731d87..d19546c14ff6 100644 --- a/arch/x86/include/asm/alternative.h +++ b/arch/x86/include/asm/alternative.h @@ -76,6 +76,7 @@ extern void apply_alternatives(struct alt_instr *start, struct alt_instr *end); struct module; void alternatives_module_add(struct module *mod, char *name, + void *para, void *para_end, void *locks, void *locks_end, void *text, void *text_end); void alternatives_module_del(struct module *mod); diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c index 09e4ee0e09a2..8189ac21624c 100644 --- a/arch/x86/kernel/alternative.c +++ b/arch/x86/kernel/alternative.c @@ -482,6 +482,12 @@ struct alt_module { struct module *mod; char *name; +#ifdef CONFIG_PARAVIRT_RUNTIME + /* ptrs to paravirt sites */ + struct paravirt_patch_site *para; + struct paravirt_patch_site *para_end; +#endif + /* ptrs to lock prefixes */ const s32 *locks; const s32 *locks_end; @@ -496,6 +502,7 @@ struct alt_module { static LIST_HEAD(alt_modules); void __init_or_module alternatives_module_add(struct module *mod, char *name, + void *para, void *para_end, void *locks, void *locks_end, void *text, void *text_end) { @@ -506,7 +513,7 @@ void __init_or_module alternatives_module_add(struct module *mod, char *name, if (!noreplace_smp && (num_present_cpus() == 1 || setup_max_cpus <= 1)) uniproc_patched = true; #endif - if (!uniproc_patched) + if (!IS_ENABLED(CONFIG_PARAVIRT_RUNTIME) && !uniproc_patched) return; mutex_lock(&text_mutex); @@ -516,6 +523,11 @@ void __init_or_module alternatives_module_add(struct module *mod, char *name, alt->mod = mod; alt->name = name; +#ifdef CONFIG_PARAVIRT_RUNTIME + alt->para = para; + alt->para_end = para_end; +#endif + if (num_possible_cpus() != 1 || uniproc_patched) { /* Remember only if we'll need to undo it. */ alt->locks = locks; @@ -733,6 +745,8 @@ void __init alternative_instructions(void) apply_alternatives(__alt_instructions, __alt_instructions_end); alternatives_module_add(NULL, "core kernel", + __parainstructions_runtime, + __parainstructions_runtime_end, __smp_locks, __smp_locks_end, _text, _etext); diff --git a/arch/x86/kernel/module.c b/arch/x86/kernel/module.c index fc3d35198b09..7b2632184c11 100644 --- a/arch/x86/kernel/module.c +++ b/arch/x86/kernel/module.c @@ -248,12 +248,30 @@ int module_finalize(const Elf_Ehdr *hdr, void *aseg = (void *)alt->sh_addr; apply_alternatives(aseg, aseg + alt->sh_size); } - if (locks && text) { - void *lseg = (void *)locks->sh_addr; - void *tseg = (void *)text->sh_addr; + if (para_run || (locks && text)) { + void *pseg, *pseg_end; + void *lseg, *lseg_end; + void *tseg, *tseg_end; + + pseg = pseg_end = NULL; + lseg = lseg_end = NULL; + tseg = tseg_end = NULL; + if (para_run) { + pseg = (void *)para_run->sh_addr; + pseg_end = pseg + para_run->sh_size; + } + + if (locks && text) { + tseg = (void *)text->sh_addr; + tseg_end = tseg + text->sh_size; + + lseg = (void *)locks->sh_addr; + lseg_end = lseg + locks->sh_size; + } alternatives_module_add(me, me->name, - lseg, lseg + locks->sh_size, - tseg, tseg + text->sh_size); + pseg, pseg_end, + lseg, lseg_end, + tseg, tseg_end); } if (para) { -- 2.20.1
WARNING: multiple messages have this Message-ID (diff)
From: Ankur Arora <ankur.a.arora@oracle.com> To: linux-kernel@vger.kernel.org, x86@kernel.org Cc: jgross@suse.com, xen-devel@lists.xenproject.org, kvm@vger.kernel.org, peterz@infradead.org, hpa@zytor.com, Ankur Arora <ankur.a.arora@oracle.com>, virtualization@lists.linux-foundation.org, pbonzini@redhat.com, namit@vmware.com, mhiramat@kernel.org, jpoimboe@redhat.com, mihai.carabas@oracle.com, bp@alien8.de, vkuznets@redhat.com, boris.ostrovsky@oracle.com Subject: [RFC PATCH 07/26] x86/paravirt: Persist .parainstructions.runtime Date: Tue, 7 Apr 2020 22:03:04 -0700 [thread overview] Message-ID: <20200408050323.4237-8-ankur.a.arora@oracle.com> (raw) In-Reply-To: <20200408050323.4237-1-ankur.a.arora@oracle.com> Persist .parainstructions.runtime in memory. We will use it to patch paravirt-ops at runtime. The extra memory footprint depends on chosen config options but the inlined queued_spin_unlock() presents an edge case: $ objdump -h vmlinux|grep .parainstructions Idx Name Size VMA LMA File-off Algn 27 .parainstructions 0001013c ffffffff82895000 0000000002895000 01c95000 2**3 28 .parainstructions.runtime 0000cd2c ffffffff828a5140 00000000028a5140 01ca5140 2**3 (The added footprint is the size of the .parainstructions.runtime section.) $ size vmlinux text data bss dec hex filename 13726196 12302814 14094336 40123346 2643bd2 vmlinux Signed-off-by: Ankur Arora <ankur.a.arora@oracle.com> --- arch/x86/include/asm/alternative.h | 1 + arch/x86/kernel/alternative.c | 16 +++++++++++++++- arch/x86/kernel/module.c | 28 +++++++++++++++++++++++----- 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/arch/x86/include/asm/alternative.h b/arch/x86/include/asm/alternative.h index db91a7731d87..d19546c14ff6 100644 --- a/arch/x86/include/asm/alternative.h +++ b/arch/x86/include/asm/alternative.h @@ -76,6 +76,7 @@ extern void apply_alternatives(struct alt_instr *start, struct alt_instr *end); struct module; void alternatives_module_add(struct module *mod, char *name, + void *para, void *para_end, void *locks, void *locks_end, void *text, void *text_end); void alternatives_module_del(struct module *mod); diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c index 09e4ee0e09a2..8189ac21624c 100644 --- a/arch/x86/kernel/alternative.c +++ b/arch/x86/kernel/alternative.c @@ -482,6 +482,12 @@ struct alt_module { struct module *mod; char *name; +#ifdef CONFIG_PARAVIRT_RUNTIME + /* ptrs to paravirt sites */ + struct paravirt_patch_site *para; + struct paravirt_patch_site *para_end; +#endif + /* ptrs to lock prefixes */ const s32 *locks; const s32 *locks_end; @@ -496,6 +502,7 @@ struct alt_module { static LIST_HEAD(alt_modules); void __init_or_module alternatives_module_add(struct module *mod, char *name, + void *para, void *para_end, void *locks, void *locks_end, void *text, void *text_end) { @@ -506,7 +513,7 @@ void __init_or_module alternatives_module_add(struct module *mod, char *name, if (!noreplace_smp && (num_present_cpus() == 1 || setup_max_cpus <= 1)) uniproc_patched = true; #endif - if (!uniproc_patched) + if (!IS_ENABLED(CONFIG_PARAVIRT_RUNTIME) && !uniproc_patched) return; mutex_lock(&text_mutex); @@ -516,6 +523,11 @@ void __init_or_module alternatives_module_add(struct module *mod, char *name, alt->mod = mod; alt->name = name; +#ifdef CONFIG_PARAVIRT_RUNTIME + alt->para = para; + alt->para_end = para_end; +#endif + if (num_possible_cpus() != 1 || uniproc_patched) { /* Remember only if we'll need to undo it. */ alt->locks = locks; @@ -733,6 +745,8 @@ void __init alternative_instructions(void) apply_alternatives(__alt_instructions, __alt_instructions_end); alternatives_module_add(NULL, "core kernel", + __parainstructions_runtime, + __parainstructions_runtime_end, __smp_locks, __smp_locks_end, _text, _etext); diff --git a/arch/x86/kernel/module.c b/arch/x86/kernel/module.c index fc3d35198b09..7b2632184c11 100644 --- a/arch/x86/kernel/module.c +++ b/arch/x86/kernel/module.c @@ -248,12 +248,30 @@ int module_finalize(const Elf_Ehdr *hdr, void *aseg = (void *)alt->sh_addr; apply_alternatives(aseg, aseg + alt->sh_size); } - if (locks && text) { - void *lseg = (void *)locks->sh_addr; - void *tseg = (void *)text->sh_addr; + if (para_run || (locks && text)) { + void *pseg, *pseg_end; + void *lseg, *lseg_end; + void *tseg, *tseg_end; + + pseg = pseg_end = NULL; + lseg = lseg_end = NULL; + tseg = tseg_end = NULL; + if (para_run) { + pseg = (void *)para_run->sh_addr; + pseg_end = pseg + para_run->sh_size; + } + + if (locks && text) { + tseg = (void *)text->sh_addr; + tseg_end = tseg + text->sh_size; + + lseg = (void *)locks->sh_addr; + lseg_end = lseg + locks->sh_size; + } alternatives_module_add(me, me->name, - lseg, lseg + locks->sh_size, - tseg, tseg + text->sh_size); + pseg, pseg_end, + lseg, lseg_end, + tseg, tseg_end); } if (para) { -- 2.20.1
next prev parent reply other threads:[~2020-04-08 5:07 UTC|newest] Thread overview: 93+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-04-08 5:02 [RFC PATCH 00/26] Runtime paravirt patching Ankur Arora 2020-04-08 5:02 ` Ankur Arora 2020-04-08 5:02 ` [RFC PATCH 01/26] x86/paravirt: Specify subsection in PVOP macros Ankur Arora 2020-04-08 5:02 ` Ankur Arora 2020-04-08 5:02 ` [RFC PATCH 02/26] x86/paravirt: Allow paravirt patching post-init Ankur Arora 2020-04-08 5:02 ` Ankur Arora 2020-04-08 5:03 ` [RFC PATCH 03/26] x86/paravirt: PVRTOP macros for PARAVIRT_RUNTIME Ankur Arora 2020-04-08 5:03 ` Ankur Arora 2020-04-08 5:03 ` [RFC PATCH 04/26] x86/alternatives: Refactor alternatives_smp_module* Ankur Arora 2020-04-08 5:03 ` Ankur Arora 2020-04-08 5:03 ` [RFC PATCH 05/26] x86/alternatives: Rename alternatives_smp*, smp_alt_module Ankur Arora 2020-04-08 5:03 ` Ankur Arora 2020-04-08 5:03 ` [RFC PATCH 06/26] x86/alternatives: Remove stale symbols Ankur Arora 2020-04-08 5:03 ` Ankur Arora 2020-04-08 5:03 ` Ankur Arora [this message] 2020-04-08 5:03 ` [RFC PATCH 07/26] x86/paravirt: Persist .parainstructions.runtime Ankur Arora 2020-04-08 5:03 ` [RFC PATCH 08/26] x86/paravirt: Stash native pv-ops Ankur Arora 2020-04-08 5:03 ` Ankur Arora 2020-04-08 5:03 ` [RFC PATCH 09/26] x86/paravirt: Add runtime_patch() Ankur Arora 2020-04-08 5:03 ` Ankur Arora 2020-04-08 11:05 ` Peter Zijlstra 2020-04-08 11:05 ` Peter Zijlstra 2020-04-08 11:05 ` Peter Zijlstra 2020-04-08 5:03 ` [RFC PATCH 10/26] x86/paravirt: Add primitives to stage pv-ops Ankur Arora 2020-04-08 5:03 ` Ankur Arora 2020-04-08 5:03 ` [RFC PATCH 11/26] x86/alternatives: Remove return value of text_poke*() Ankur Arora 2020-04-08 5:03 ` Ankur Arora 2020-04-08 5:03 ` [RFC PATCH 12/26] x86/alternatives: Use __get_unlocked_pte() in text_poke() Ankur Arora 2020-04-08 5:03 ` Ankur Arora 2020-04-08 5:03 ` [RFC PATCH 13/26] x86/alternatives: Split __text_poke() Ankur Arora 2020-04-08 5:03 ` Ankur Arora 2020-04-08 5:03 ` [RFC PATCH 14/26] x86/alternatives: Handle native insns in text_poke_loc*() Ankur Arora 2020-04-08 5:03 ` Ankur Arora 2020-04-08 11:11 ` Peter Zijlstra 2020-04-08 11:11 ` Peter Zijlstra 2020-04-08 11:11 ` Peter Zijlstra 2020-04-08 11:17 ` Peter Zijlstra 2020-04-08 11:17 ` Peter Zijlstra 2020-04-08 11:17 ` Peter Zijlstra 2020-04-08 5:03 ` [RFC PATCH 15/26] x86/alternatives: Non-emulated text poking Ankur Arora 2020-04-08 5:03 ` Ankur Arora 2020-04-08 11:13 ` Peter Zijlstra 2020-04-08 11:13 ` Peter Zijlstra 2020-04-08 11:13 ` Peter Zijlstra 2020-04-08 11:23 ` Peter Zijlstra 2020-04-08 11:23 ` Peter Zijlstra 2020-04-08 11:23 ` Peter Zijlstra 2020-04-08 5:03 ` [RFC PATCH 16/26] x86/alternatives: Add paravirt patching at runtime Ankur Arora 2020-04-08 5:03 ` Ankur Arora 2020-04-08 5:03 ` [RFC PATCH 17/26] x86/alternatives: Add patching logic in text_poke_site() Ankur Arora 2020-04-08 5:03 ` Ankur Arora 2020-04-08 5:03 ` [RFC PATCH 18/26] x86/alternatives: Handle BP in non-emulated text poking Ankur Arora 2020-04-08 5:03 ` Ankur Arora 2020-04-08 5:03 ` [RFC PATCH 19/26] x86/alternatives: NMI safe runtime patching Ankur Arora 2020-04-08 5:03 ` Ankur Arora 2020-04-08 11:36 ` Peter Zijlstra 2020-04-08 11:36 ` Peter Zijlstra 2020-04-08 11:36 ` Peter Zijlstra 2020-04-08 5:03 ` [RFC PATCH 20/26] x86/paravirt: Enable pv-spinlocks in runtime_patch() Ankur Arora 2020-04-08 5:03 ` Ankur Arora 2020-04-08 5:03 ` [RFC PATCH 21/26] x86/alternatives: Paravirt runtime selftest Ankur Arora 2020-04-08 5:03 ` Ankur Arora 2020-04-08 5:03 ` [RFC PATCH 22/26] kvm/paravirt: Encapsulate KVM pv switching logic Ankur Arora 2020-04-08 5:03 ` Ankur Arora 2020-04-08 5:03 ` [RFC PATCH 23/26] x86/kvm: Add worker to trigger runtime patching Ankur Arora 2020-04-08 5:03 ` Ankur Arora 2020-04-08 5:03 ` [RFC PATCH 24/26] x86/kvm: Support dynamic CPUID hints Ankur Arora 2020-04-08 5:03 ` Ankur Arora 2020-04-08 5:03 ` [RFC PATCH 25/26] x86/kvm: Guest support for dynamic hints Ankur Arora 2020-04-08 5:03 ` Ankur Arora 2020-04-08 5:03 ` [RFC PATCH 26/26] x86/kvm: Add hint change notifier for KVM_HINT_REALTIME Ankur Arora 2020-04-08 5:03 ` Ankur Arora 2020-04-08 12:08 ` [RFC PATCH 00/26] Runtime paravirt patching Peter Zijlstra 2020-04-08 12:08 ` Peter Zijlstra 2020-04-08 12:08 ` Peter Zijlstra 2020-04-08 13:33 ` Jürgen Groß 2020-04-08 13:33 ` Jürgen Groß 2020-04-08 14:49 ` Peter Zijlstra 2020-04-08 14:49 ` Peter Zijlstra 2020-04-08 14:49 ` Peter Zijlstra 2020-04-10 9:18 ` Ankur Arora 2020-04-10 9:18 ` Ankur Arora 2020-04-08 12:28 ` Jürgen Groß 2020-04-08 12:28 ` Jürgen Groß 2020-04-10 7:56 ` Ankur Arora 2020-04-10 7:56 ` Ankur Arora 2020-04-10 9:32 ` Ankur Arora 2020-04-10 9:32 ` Ankur Arora 2020-04-08 14:12 ` Thomas Gleixner 2020-04-08 14:12 ` Thomas Gleixner 2020-04-08 14:12 ` Thomas Gleixner 2020-04-10 9:55 ` Ankur Arora 2020-04-10 9:55 ` Ankur Arora
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=20200408050323.4237-8-ankur.a.arora@oracle.com \ --to=ankur.a.arora@oracle.com \ --cc=boris.ostrovsky@oracle.com \ --cc=bp@alien8.de \ --cc=hpa@zytor.com \ --cc=jgross@suse.com \ --cc=jpoimboe@redhat.com \ --cc=kvm@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=mhiramat@kernel.org \ --cc=mihai.carabas@oracle.com \ --cc=namit@vmware.com \ --cc=pbonzini@redhat.com \ --cc=peterz@infradead.org \ --cc=virtualization@lists.linux-foundation.org \ --cc=vkuznets@redhat.com \ --cc=x86@kernel.org \ --cc=xen-devel@lists.xenproject.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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.