From: Peter Zijlstra <peterz@infradead.org>
To: Frederic Weisbecker <frederic@kernel.org>
Cc: LKML <linux-kernel@vger.kernel.org>, Mel Gorman <mgorman@suse.de>,
Michal Hocko <mhocko@kernel.org>,
Thomas Gleixner <tglx@linutronix.de>,
"Paul E . McKenney" <paulmck@kernel.org>,
Ingo Molnar <mingo@redhat.com>, Michal Hocko <mhocko@suse.com>
Subject: Re: [RFC PATCH 1/7] static_call/x86: Add __static_call_returnl0()
Date: Tue, 10 Nov 2020 11:13:07 +0100 [thread overview]
Message-ID: <20201110101307.GO2651@hirez.programming.kicks-ass.net> (raw)
In-Reply-To: <20201110095515.GA2594@hirez.programming.kicks-ass.net>
On Tue, Nov 10, 2020 at 10:55:15AM +0100, Peter Zijlstra wrote:
> On Tue, Nov 10, 2020 at 01:56:03AM +0100, Frederic Weisbecker wrote:
>
> > [fweisbec: s/disp16/data16, integrate into text_get_insn(), elaborate
> > comment on the resulting insn, emulate on int3 trap, provide validation,
> > uninline __static_call_return0() for HAVE_STATIC_CALL]
> Why did you add full emulation of this? The patch I send to you used the
> text_poke_bp(.emulate) argument to have it emulate an actual call to the
> out-of-line version of that function.
>
> That should work fine and is a lot less code.
For reference; the below is what I send you. Actually doing the
__static_call_return0() call while we poke the magic XOR instruction is
much simpler.
---
Subject: static_call/x86: Add __static_call_return0
From: Peter Zijlstra <peterz@infradead.org>
Date: Mon Oct 12 11:43:32 CEST 2020
Provide a stub function that return 0 and wire up the static call site
patching to replace the CALL with a single 5 byte instruction that
clears %RAX, the return value register.
The function can be cast to any function pointer type that has a
single %RAX return (including pointers).
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
arch/x86/kernel/static_call.c | 11 ++++++++++-
include/linux/static_call.h | 6 ++++++
kernel/static_call.c | 5 +++++
3 files changed, 21 insertions(+), 1 deletion(-)
--- a/arch/x86/kernel/static_call.c
+++ b/arch/x86/kernel/static_call.c
@@ -13,12 +13,21 @@ enum insn_type {
static void __ref __static_call_transform(void *insn, enum insn_type type, void *func)
{
+ /*
+ * disp16 disp16 xorq %rax, %rax - a single 5 byte instruction that clears %rax
+ */
+ static const u8 ret0[5] = { 0x66, 0x66, 0x48, 0x31, 0xc0 };
int size = CALL_INSN_SIZE;
+ const void *emulate = NULL;
const void *code;
switch (type) {
case CALL:
code = text_gen_insn(CALL_INSN_OPCODE, insn, func);
+ if (func == &__static_call_return0) {
+ emulate = code;
+ code = ret0;
+ }
break;
case NOP:
@@ -41,7 +50,7 @@ static void __ref __static_call_transfor
if (unlikely(system_state == SYSTEM_BOOTING))
return text_poke_early(insn, code, size);
- text_poke_bp(insn, code, size, NULL);
+ text_poke_bp(insn, code, size, emulate);
}
static void __static_call_validate(void *insn, bool tail)
--- a/include/linux/static_call.h
+++ b/include/linux/static_call.h
@@ -136,6 +136,8 @@ extern void arch_static_call_transform(v
#ifdef CONFIG_HAVE_STATIC_CALL_INLINE
+extern long __static_call_return0(void);
+
extern int __init static_call_init(void);
struct static_call_mod {
@@ -187,6 +189,8 @@ extern int static_call_text_reserved(voi
#elif defined(CONFIG_HAVE_STATIC_CALL)
+static inline long __static_call_return0(void) { return 0; }
+
static inline int static_call_init(void) { return 0; }
struct static_call_key {
@@ -234,6 +238,8 @@ static inline int static_call_text_reser
#else /* Generic implementation */
+static inline long __static_call_return0(void) { return 0; }
+
static inline int static_call_init(void) { return 0; }
struct static_call_key {
--- a/kernel/static_call.c
+++ b/kernel/static_call.c
@@ -438,6 +438,11 @@ int __init static_call_init(void)
}
early_initcall(static_call_init);
+long __static_call_return0(void)
+{
+ return 0;
+}
+
#ifdef CONFIG_STATIC_CALL_SELFTEST
static int func_a(int x)
next prev parent reply other threads:[~2020-11-10 10:13 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-10 0:56 [RFC PATCH 0/7] preempt: Tune preemption flavour on boot v3 Frederic Weisbecker
2020-11-10 0:56 ` [RFC PATCH 1/7] static_call/x86: Add __static_call_returnl0() Frederic Weisbecker
2020-11-10 9:55 ` Peter Zijlstra
2020-11-10 10:13 ` Peter Zijlstra [this message]
2020-11-10 13:42 ` Frederic Weisbecker
2020-11-10 13:53 ` Peter Zijlstra
2020-11-10 13:24 ` Frederic Weisbecker
2020-11-10 10:06 ` Peter Zijlstra
2020-11-10 0:56 ` [RFC PATCH 2/7] static_call: Pull some static_call declarations to the type headers Frederic Weisbecker
2020-11-10 0:56 ` [RFC PATCH 3/7] preempt: Introduce CONFIG_PREEMPT_DYNAMIC Frederic Weisbecker
2020-11-10 0:56 ` [RFC PATCH 4/7] preempt/dynamic: Provide cond_resched() and might_resched() static calls Frederic Weisbecker
2020-11-10 10:39 ` Peter Zijlstra
2020-11-10 10:48 ` Peter Zijlstra
2021-01-18 13:58 ` Frederic Weisbecker
2020-11-10 0:56 ` [RFC PATCH 5/7] preempt/dynamic: Provide preempt_schedule[_notrace]() " Frederic Weisbecker
2020-11-10 0:56 ` [RFC PATCH 6/7] preempt/dynamic: Provide irqentry_exit_cond_resched() static call Frederic Weisbecker
2020-11-10 10:32 ` Peter Zijlstra
2020-11-10 13:45 ` Frederic Weisbecker
2020-11-10 0:56 ` [RFC PATCH 7/7] preempt/dynamic: Support dynamic preempt with preempt= boot option Frederic Weisbecker
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=20201110101307.GO2651@hirez.programming.kicks-ass.net \
--to=peterz@infradead.org \
--cc=frederic@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mgorman@suse.de \
--cc=mhocko@kernel.org \
--cc=mhocko@suse.com \
--cc=mingo@redhat.com \
--cc=paulmck@kernel.org \
--cc=tglx@linutronix.de \
/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