From: Song Liu <song@kernel.org>
To: <bpf@vger.kernel.org>, <netdev@vger.kernel.org>,
<linux-kernel@vger.kernel.org>
Cc: <ast@kernel.org>, <daniel@iogearbox.net>, <andrii@kernel.org>,
<kernel-team@fb.com>, <peterz@infradead.org>, <x86@kernel.org>,
Song Liu <song@kernel.org>
Subject: [PATCH v2 bpf-next 5/7] x86/alternative: introduce text_poke_jit
Date: Tue, 14 Dec 2021 22:01:00 -0800 [thread overview]
Message-ID: <20211215060102.3793196-6-song@kernel.org> (raw)
In-Reply-To: <20211215060102.3793196-1-song@kernel.org>
This will be used by BPF jit compiler to dump JITed binary to a RWX huge
page, and thus allow multiple BPF programs sharing the a huge (2MB) page.
Signed-off-by: Song Liu <song@kernel.org>
---
arch/x86/include/asm/text-patching.h | 1 +
arch/x86/kernel/alternative.c | 28 ++++++++++++++++++++++++++++
2 files changed, 29 insertions(+)
diff --git a/arch/x86/include/asm/text-patching.h b/arch/x86/include/asm/text-patching.h
index b7421780e4e9..991058c9b4b1 100644
--- a/arch/x86/include/asm/text-patching.h
+++ b/arch/x86/include/asm/text-patching.h
@@ -44,6 +44,7 @@ extern void text_poke_early(void *addr, const void *opcode, size_t len);
extern void *text_poke(void *addr, const void *opcode, size_t len);
extern void text_poke_sync(void);
extern void *text_poke_kgdb(void *addr, const void *opcode, size_t len);
+extern void *text_poke_jit(void *addr, const void *opcode, size_t len);
extern int poke_int3_handler(struct pt_regs *regs);
extern void text_poke_bp(void *addr, const void *opcode, size_t len, const void *emulate);
diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c
index 23fb4d51a5da..02c35725cc62 100644
--- a/arch/x86/kernel/alternative.c
+++ b/arch/x86/kernel/alternative.c
@@ -1102,6 +1102,34 @@ void *text_poke_kgdb(void *addr, const void *opcode, size_t len)
return __text_poke(addr, opcode, len);
}
+/**
+ * text_poke_jit - Update instructions on a live kernel by jit engine
+ * @addr: address to modify
+ * @opcode: source of the copy
+ * @len: length to copy, could be more than 2x PAGE_SIZE
+ *
+ * Only module memory taking jit text (e.g. for bpf) should be patched.
+ */
+void *text_poke_jit(void *addr, const void *opcode, size_t len)
+{
+ unsigned long start = (unsigned long)addr;
+ size_t patched = 0;
+
+ if (WARN_ON_ONCE(core_kernel_text(start)))
+ return NULL;
+
+ while (patched < len) {
+ unsigned long ptr = start + patched;
+ size_t s;
+
+ s = min_t(size_t, PAGE_SIZE * 2 - offset_in_page(ptr), len - patched);
+
+ __text_poke((void *)ptr, opcode + patched, s);
+ patched += s;
+ }
+ return addr;
+}
+
static void do_sync_core(void *info)
{
sync_core();
--
2.30.2
next prev parent reply other threads:[~2021-12-15 6:01 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-15 6:00 [PATCH v2 bpf-next 0/7] bpf_prog_pack allocator Song Liu
2021-12-15 6:00 ` [PATCH v2 bpf-next 1/7] x86/Kconfig: select HAVE_ARCH_HUGE_VMALLOC with HAVE_ARCH_HUGE_VMAP Song Liu
2021-12-15 6:00 ` [PATCH v2 bpf-next 2/7] bpf: use bytes instead of pages for bpf_jit_[charge|uncharge]_modmem Song Liu
2021-12-15 8:56 ` Peter Zijlstra
2021-12-16 19:45 ` Song Liu
2021-12-15 6:00 ` [PATCH v2 bpf-next 3/7] bpf: use size instead of pages in bpf_binary_header Song Liu
2021-12-15 6:00 ` [PATCH v2 bpf-next 4/7] bpf: add a pointer of bpf_binary_header to bpf_prog Song Liu
2021-12-15 6:01 ` Song Liu [this message]
2021-12-15 9:06 ` [PATCH v2 bpf-next 5/7] x86/alternative: introduce text_poke_jit Peter Zijlstra
2021-12-15 9:17 ` Peter Zijlstra
2021-12-16 19:40 ` Song Liu
2021-12-15 6:01 ` [PATCH v2 bpf-next 6/7] bpf: introduce bpf_prog_pack allocator Song Liu
2021-12-15 6:01 ` [PATCH v2 bpf-next 7/7] bpf, x86_64: use " Song Liu
2021-12-16 20:06 ` [PATCH v2 bpf-next 0/7] " Andrii Nakryiko
2021-12-17 1:53 ` Song Liu
2021-12-17 16:42 ` Andrii Nakryiko
2021-12-17 16:43 ` Andrii Nakryiko
2021-12-17 17:13 ` Song Liu
2021-12-17 17:16 ` Andrii Nakryiko
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=20211215060102.3793196-6-song@kernel.org \
--to=song@kernel.org \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=kernel-team@fb.com \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=peterz@infradead.org \
--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 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.