From: "H. Peter Anvin" <hpa@zytor.com>
To: Ingo Molnar <mingo@kernel.org>, linux-kernel@vger.kernel.org
Cc: Juergen Gross <jgross@suse.com>,
Linus Torvalds <torvalds@linux-foundation.org>,
Peter Zijlstra <peterz@infradead.org>,
Borislav Petkov <bp@alien8.de>,
Thomas Gleixner <tglx@linutronix.de>
Subject: Re: [PATCH 40/41] x86/alternatives: Rename 'text_poke_sync()' to 'text_poke_sync_each_cpu()'
Date: Tue, 01 Apr 2025 21:10:55 -0700 [thread overview]
Message-ID: <DA9DB9BF-2179-4C53-86A8-6205346AA76F@zytor.com> (raw)
In-Reply-To: <20250327205355.378659-41-mingo@kernel.org>
On March 27, 2025 1:53:53 PM PDT, Ingo Molnar <mingo@kernel.org> wrote:
>Unlike sync_core(), text_poke_sync() is a very heavy operation, as
>it sends an IPI to every online CPU in the system and waits for
>completion.
>
>Reflect this in the name.
>
>Signed-off-by: Ingo Molnar <mingo@kernel.org>
>---
> arch/x86/include/asm/text-patching.h | 2 +-
> arch/x86/kernel/alternative.c | 12 ++++++------
> arch/x86/kernel/kprobes/core.c | 4 ++--
> arch/x86/kernel/kprobes/opt.c | 4 ++--
> arch/x86/kernel/module.c | 2 +-
> 5 files changed, 12 insertions(+), 12 deletions(-)
>
>diff --git a/arch/x86/include/asm/text-patching.h b/arch/x86/include/asm/text-patching.h
>index 611957617278..ff30aa1d0c47 100644
>--- a/arch/x86/include/asm/text-patching.h
>+++ b/arch/x86/include/asm/text-patching.h
>@@ -32,7 +32,7 @@ extern void apply_relocation(u8 *buf, const u8 * const instr, size_t instrlen, u
> * an inconsistent instruction while you patch.
> */
> extern void *text_poke(void *addr, const void *opcode, size_t len);
>-extern void text_poke_sync(void);
>+extern void text_poke_sync_each_cpu(void);
> extern void *text_poke_kgdb(void *addr, const void *opcode, size_t len);
> extern void *text_poke_copy(void *addr, const void *opcode, size_t len);
> #define text_poke_copy text_poke_copy
>diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c
>index 1b523496a2f6..32d3707d7963 100644
>--- a/arch/x86/kernel/alternative.c
>+++ b/arch/x86/kernel/alternative.c
>@@ -2445,7 +2445,7 @@ static void do_sync_core(void *info)
> sync_core();
> }
>
>-void text_poke_sync(void)
>+void text_poke_sync_each_cpu(void)
> {
> on_each_cpu(do_sync_core, NULL, 1);
> }
>@@ -2469,8 +2469,8 @@ struct text_poke_int3_loc {
> #define TP_ARRAY_NR_ENTRIES_MAX (PAGE_SIZE / sizeof(struct text_poke_int3_loc))
>
> static struct text_poke_int3_array {
>- int nr_entries;
> struct text_poke_int3_loc vec[TP_ARRAY_NR_ENTRIES_MAX];
>+ int nr_entries;
> } tp_array;
>
> static DEFINE_PER_CPU(atomic_t, tp_array_refs);
>@@ -2649,7 +2649,7 @@ static void text_poke_int3_batch_process(void)
> text_poke(text_poke_int3_addr(&tp_array.vec[i]), &int3, INT3_INSN_SIZE);
> }
>
>- text_poke_sync();
>+ text_poke_sync_each_cpu();
>
> /*
> * Second step: update all but the first byte of the patched range.
>@@ -2711,7 +2711,7 @@ static void text_poke_int3_batch_process(void)
> * not necessary and we'd be safe even without it. But
> * better safe than sorry (plus there's not only Intel).
> */
>- text_poke_sync();
>+ text_poke_sync_each_cpu();
> }
>
> /*
>@@ -2732,13 +2732,13 @@ static void text_poke_int3_batch_process(void)
> }
>
> if (do_sync)
>- text_poke_sync();
>+ text_poke_sync_each_cpu();
>
> /*
> * Remove and wait for refs to be zero.
> *
> * Notably, if after step-3 above the INT3 got removed, then the
>- * text_poke_sync() will have serialized against any running INT3
>+ * text_poke_sync_each_cpu() will have serialized against any running INT3
> * handlers and the below spin-wait will not happen.
> *
> * IOW. unless the replacement instruction is INT3, this case goes
>diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c
>index 09608fd93687..5e35c95524dc 100644
>--- a/arch/x86/kernel/kprobes/core.c
>+++ b/arch/x86/kernel/kprobes/core.c
>@@ -808,7 +808,7 @@ void arch_arm_kprobe(struct kprobe *p)
> u8 int3 = INT3_INSN_OPCODE;
>
> text_poke(p->addr, &int3, 1);
>- text_poke_sync();
>+ text_poke_sync_each_cpu();
> perf_event_text_poke(p->addr, &p->opcode, 1, &int3, 1);
> }
>
>@@ -818,7 +818,7 @@ void arch_disarm_kprobe(struct kprobe *p)
>
> perf_event_text_poke(p->addr, &int3, 1, &p->opcode, 1);
> text_poke(p->addr, &p->opcode, 1);
>- text_poke_sync();
>+ text_poke_sync_each_cpu();
> }
>
> void arch_remove_kprobe(struct kprobe *p)
>diff --git a/arch/x86/kernel/kprobes/opt.c b/arch/x86/kernel/kprobes/opt.c
>index 54bc5e7c6886..5efa7b50bbb3 100644
>--- a/arch/x86/kernel/kprobes/opt.c
>+++ b/arch/x86/kernel/kprobes/opt.c
>@@ -513,11 +513,11 @@ void arch_unoptimize_kprobe(struct optimized_kprobe *op)
> JMP32_INSN_SIZE - INT3_INSN_SIZE);
>
> text_poke(addr, new, INT3_INSN_SIZE);
>- text_poke_sync();
>+ text_poke_sync_each_cpu();
> text_poke(addr + INT3_INSN_SIZE,
> new + INT3_INSN_SIZE,
> JMP32_INSN_SIZE - INT3_INSN_SIZE);
>- text_poke_sync();
>+ text_poke_sync_each_cpu();
>
> perf_event_text_poke(op->kp.addr, old, JMP32_INSN_SIZE, new, JMP32_INSN_SIZE);
> }
>diff --git a/arch/x86/kernel/module.c b/arch/x86/kernel/module.c
>index a7998f351701..1c598c90e24d 100644
>--- a/arch/x86/kernel/module.c
>+++ b/arch/x86/kernel/module.c
>@@ -206,7 +206,7 @@ static int write_relocate_add(Elf64_Shdr *sechdrs,
> write, apply);
>
> if (!early) {
>- text_poke_sync();
>+ text_poke_sync_each_cpu();
> mutex_unlock(&text_mutex);
> }
>
Is that the only use case we have for syncing all CPUs?
next prev parent reply other threads:[~2025-04-02 4:11 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-27 20:53 [PATCH 00/41] Simplify, reorganize and clean up the x86 INT3 based batch-patching code (alternative.c) Ingo Molnar
2025-03-27 20:53 ` [PATCH 01/41] x86/alternatives: Rename 'struct bp_patching_desc' to 'struct int3_patching_desc' Ingo Molnar
2025-03-27 20:53 ` [PATCH 02/41] x86/alternatives: Rename 'bp_refs' to 'int3_refs' Ingo Molnar
2025-03-27 20:53 ` [PATCH 03/41] x86/alternatives: Rename 'text_poke_bp_batch()' to 'text_poke_int3_batch()' Ingo Molnar
2025-03-27 20:53 ` [PATCH 04/41] x86/alternatives: Rename 'text_poke_bp()' to 'text_poke_int3()' Ingo Molnar
2025-03-27 20:53 ` [PATCH 05/41] x86/alternatives: Rename 'poke_int3_handler()' to 'text_poke_int3_handler()' Ingo Molnar
2025-03-27 20:53 ` [PATCH 06/41] x86/alternatives: Rename 'poking_mm' to 'text_poke_mm' Ingo Molnar
2025-03-27 20:53 ` [PATCH 07/41] x86/alternatives: Rename 'text_poke_addr' to 'text_poke_int3_addr' Ingo Molnar
2025-03-27 20:53 ` [PATCH 08/41] x86/alternatives: Rename 'poking_addr' to 'text_poke_addr' Ingo Molnar
2025-03-27 20:53 ` [PATCH 09/41] x86/alternatives: Rename 'bp_desc' to 'int3_desc' Ingo Molnar
2025-03-27 20:53 ` [PATCH 10/41] x86/alternatives: Remove duplicate 'text_poke_early()' prototype Ingo Molnar
2025-03-27 20:53 ` [PATCH 11/41] x86/alternatives: Update comments in int3_emulate_push() Ingo Molnar
2025-03-27 20:53 ` [PATCH 12/41] x86/alternatives: Remove the confusing, inaccurate & unnecessary 'temp_mm_state_t' abstraction Ingo Molnar
2025-03-27 20:53 ` [PATCH 13/41] x86/alternatives: Rename 'text_poke_flush()' to 'text_poke_int3_flush()' Ingo Molnar
2025-03-27 20:53 ` [PATCH 14/41] x86/alternatives: Rename 'text_poke_finish()' to 'text_poke_int3_finish()' Ingo Molnar
2025-03-27 20:53 ` [PATCH 15/41] x86/alternatives: Rename 'text_poke_queue()' to 'text_poke_int3_queue()' Ingo Molnar
2025-03-27 20:53 ` [PATCH 16/41] x86/alternatives: Rename 'text_poke_loc_init()' to 'text_poke_int3_loc_init()' Ingo Molnar
2025-03-27 20:53 ` [PATCH 17/41] x86/alternatives: Rename 'struct text_poke_loc' to 'struct text_poke_int3_loc' Ingo Molnar
2025-03-27 20:53 ` [PATCH 18/41] x86/alternatives: Rename 'struct int3_patching_desc' to 'struct text_poke_int3_vec' Ingo Molnar
2025-03-27 20:53 ` [PATCH 19/41] x86/alternatives: Rename 'int3_desc' to 'int3_vec' Ingo Molnar
2025-03-27 20:53 ` [PATCH 20/41] x86/alternatives: Add text_mutex) assert to text_poke_int3_flush() Ingo Molnar
2025-03-27 20:53 ` [PATCH 21/41] x86/alternatives: Assert that text_poke_int3_handler() can only ever handle 'tp_vec[]' based requests Ingo Molnar
2025-03-27 20:53 ` [PATCH 22/41] x86/alternatives: Use non-inverted logic instead of 'tp_order_fail()' Ingo Molnar
2025-03-27 20:53 ` [PATCH 23/41] x86/alternatives: Remove the 'addr == NULL means forced-flush' hack from text_poke_int3_finish()/text_poke_int3_flush()/tp_addr_ordered() Ingo Molnar
2025-03-27 20:53 ` [PATCH 24/41] x86/alternatives: Simplify text_poke_int3() by using tp_vec and existing APIs Ingo Molnar
2025-03-27 20:53 ` [PATCH 25/41] x86/alternatives: Assert input parameters in text_poke_int3_batch() Ingo Molnar
2025-03-27 20:53 ` [PATCH 26/41] x86/alternatives: Introduce 'struct text_poke_int3_array' and move tp_vec and tp_vec_nr to it Ingo Molnar
2025-03-27 20:53 ` [PATCH 27/41] x86/alternatives: Remove the tp_vec indirection Ingo Molnar
2025-03-27 20:53 ` [PATCH 28/41] x86/alternatives: Rename 'try_get_desc()' to 'try_get_tp_array()' Ingo Molnar
2025-03-27 20:53 ` [PATCH 29/41] x86/alternatives: Rename 'put_desc()' to 'put_tp_array()' Ingo Molnar
2025-03-27 20:53 ` [PATCH 30/41] x86/alternatives: Simplify try_get_tp_array() Ingo Molnar
2025-03-27 20:53 ` [PATCH 31/41] x86/alternatives: Simplify text_poke_int3_handler() Ingo Molnar
2025-03-27 20:53 ` [PATCH 32/41] x86/alternatives: Simplify text_poke_int3_batch() Ingo Molnar
2025-03-27 20:53 ` [PATCH 33/41] x86/alternatives: Rename 'text_poke_int3_batch()' to 'text_poke_int3_batch_process()' Ingo Molnar
2025-03-27 20:53 ` [PATCH 34/41] x86/alternatives: Rename 'int3_refs' to 'tp_array_refs' Ingo Molnar
2025-03-27 20:53 ` [PATCH 35/41] x86/alternatives: Move the tp_array manipulation into text_poke_int3_loc_init() and rename it to text_poke_int3_loc_add() Ingo Molnar
2025-03-27 20:53 ` [PATCH 36/41] x86/alternatives: Remove the mixed-patching restriction on text_poke_int3() Ingo Molnar
2025-03-27 20:53 ` [PATCH 37/41] x86/alternatives: Rename 'text_poke_int3()' to 'text_poke_int3_now()' Ingo Molnar
2025-03-27 20:53 ` [PATCH 38/41] x86/alternatives: Add documentation for text_poke_int3_queue() Ingo Molnar
2025-03-27 20:53 ` [PATCH 39/41] x86/alternatives: Move tp_array completion from text_poke_int3_finish() and text_poke_int3_flush() to text_poke_int3_batch_process() Ingo Molnar
2025-03-27 20:53 ` [PATCH 40/41] x86/alternatives: Rename 'text_poke_sync()' to 'text_poke_sync_each_cpu()' Ingo Molnar
2025-04-02 4:10 ` H. Peter Anvin [this message]
2025-04-03 15:05 ` Ingo Molnar
2025-03-27 20:53 ` [PATCH 41/41] x86/alternatives: Simplify tp_addr_ordered() Ingo Molnar
2025-03-27 22:19 ` [PATCH 00/41] Simplify, reorganize and clean up the x86 INT3 based batch-patching code (alternative.c) Linus Torvalds
2025-03-28 10:10 ` Ingo Molnar
2025-04-01 14:55 ` Peter Zijlstra
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=DA9DB9BF-2179-4C53-86A8-6205346AA76F@zytor.com \
--to=hpa@zytor.com \
--cc=bp@alien8.de \
--cc=jgross@suse.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.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®