Commit 51c9c0843993 ("powerpc/kprobes: Implement Optprobes")
implemented a powerpc specific version of optinsn in order
to workaround the 32Mb limitation for direct branches.

Instead of implementing a dedicated powerpc version, use the
common optinsn and override the allocation and freeing functions.

This also indirectly remove the CLANG warning about
is_kprobe_ppc_optinsn_slot() not being use, and the powerpc will
now benefit from commit 5b485629ba0d ("kprobes, extable: Identify
kprobes trampolines as kernel text area")

Suggested-by: Masami Hiramatsu <mhira...@kernel.org>
Signed-off-by: Christophe Leroy <christophe.le...@csgroup.eu>
Acked-by: Masami Hiramatsu <mhira...@kernel.org>
---
v2: no change
---
 arch/powerpc/kernel/optprobes.c | 23 +++++------------------
 1 file changed, 5 insertions(+), 18 deletions(-)

diff --git a/arch/powerpc/kernel/optprobes.c b/arch/powerpc/kernel/optprobes.c
index cdf87086fa33..a370190cd02a 100644
--- a/arch/powerpc/kernel/optprobes.c
+++ b/arch/powerpc/kernel/optprobes.c
@@ -31,11 +31,9 @@
 #define TMPL_END_IDX           \
        (optprobe_template_end - optprobe_template_entry)
 
-DEFINE_INSN_CACHE_OPS(ppc_optinsn);
-
 static bool insn_page_in_use;
 
-static void *__ppc_alloc_insn_page(void)
+void *alloc_optinsn_page(void)
 {
        if (insn_page_in_use)
                return NULL;
@@ -43,20 +41,11 @@ static void *__ppc_alloc_insn_page(void)
        return &optinsn_slot;
 }
 
-static void __ppc_free_insn_page(void *page __maybe_unused)
+void free_optinsn_page(void *page)
 {
        insn_page_in_use = false;
 }
 
-struct kprobe_insn_cache kprobe_ppc_optinsn_slots = {
-       .mutex = __MUTEX_INITIALIZER(kprobe_ppc_optinsn_slots.mutex),
-       .pages = LIST_HEAD_INIT(kprobe_ppc_optinsn_slots.pages),
-       /* insn_size initialized later */
-       .alloc = __ppc_alloc_insn_page,
-       .free = __ppc_free_insn_page,
-       .nr_garbage = 0,
-};
-
 /*
  * Check if we can optimize this probe. Returns NIP post-emulation if this can
  * be optimized and 0 otherwise.
@@ -136,7 +125,7 @@ NOKPROBE_SYMBOL(optimized_callback);
 void arch_remove_optimized_kprobe(struct optimized_kprobe *op)
 {
        if (op->optinsn.insn) {
-               free_ppc_optinsn_slot(op->optinsn.insn, 1);
+               free_optinsn_slot(op->optinsn.insn, 1);
                op->optinsn.insn = NULL;
        }
 }
@@ -203,14 +192,12 @@ int arch_prepare_optimized_kprobe(struct optimized_kprobe 
*op, struct kprobe *p)
        unsigned long nip, size;
        int rc, i;
 
-       kprobe_ppc_optinsn_slots.insn_size = MAX_OPTINSN_SIZE;
-
        nip = can_optimize(p);
        if (!nip)
                return -EILSEQ;
 
        /* Allocate instruction slot for detour buffer */
-       buff = get_ppc_optinsn_slot();
+       buff = get_optinsn_slot();
        if (!buff)
                return -ENOMEM;
 
@@ -297,7 +284,7 @@ int arch_prepare_optimized_kprobe(struct optimized_kprobe 
*op, struct kprobe *p)
        return 0;
 
 error:
-       free_ppc_optinsn_slot(buff, 0);
+       free_optinsn_slot(buff, 0);
        return -ERANGE;
 
 }
-- 
2.25.0

Reply via email to