In the following commit, it also needs to prepare both old_insn and
new_insn when add text-poke batch support.

So, factor out bpf_arch_text_poke_prepare_insns() helper for text-poke
batch support.

No functional changes intended.

Signed-off-by: Leon Hwang <[email protected]>
---
 arch/x86/net/bpf_jit_comp.c | 38 ++++++++++++++++++++++++-------------
 1 file changed, 25 insertions(+), 13 deletions(-)

diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c
index 083fcd6cf15b..74033373dc06 100644
--- a/arch/x86/net/bpf_jit_comp.c
+++ b/arch/x86/net/bpf_jit_comp.c
@@ -646,13 +646,12 @@ static int emit_jump(u8 **pprog, void *func, void *ip)
        return emit_patch(pprog, func, ip, 0xE9);
 }
 
-static int __bpf_arch_text_poke(void *ip, enum bpf_text_poke_type old_t,
-                               enum bpf_text_poke_type new_t,
-                               void *old_addr, void *new_addr)
+static int bpf_arch_text_poke_prepare_insns(void *ip, enum bpf_text_poke_type 
old_t,
+                                           enum bpf_text_poke_type new_t,
+                                           void *old_addr, void *new_addr,
+                                           u8 *old_insn, u8 *new_insn)
 {
        const u8 *nop_insn = x86_nops[5];
-       u8 old_insn[X86_PATCH_SIZE];
-       u8 new_insn[X86_PATCH_SIZE];
        u8 *prog;
        int ret;
 
@@ -676,18 +675,31 @@ static int __bpf_arch_text_poke(void *ip, enum 
bpf_text_poke_type old_t,
                        return ret;
        }
 
-       ret = -EBUSY;
-       mutex_lock(&text_mutex);
+       return 0;
+}
+
+static int __bpf_arch_text_poke(void *ip, enum bpf_text_poke_type old_t,
+                               enum bpf_text_poke_type new_t,
+                               void *old_addr, void *new_addr)
+{
+       u8 old_insn[X86_PATCH_SIZE];
+       u8 new_insn[X86_PATCH_SIZE];
+       int ret;
+
+       ret = bpf_arch_text_poke_prepare_insns(ip, old_t, new_t, old_addr, 
new_addr, old_insn,
+                                              new_insn);
+       if (ret)
+               return ret;
+
+       guard(mutex)(&text_mutex);
+
        if (memcmp(ip, old_insn, X86_PATCH_SIZE))
-               goto out;
-       ret = 1;
+               return -EBUSY;
        if (memcmp(ip, new_insn, X86_PATCH_SIZE)) {
                smp_text_poke_single(ip, new_insn, X86_PATCH_SIZE, NULL);
-               ret = 0;
+               return 0;
        }
-out:
-       mutex_unlock(&text_mutex);
-       return ret;
+       return 1;
 }
 
 int bpf_arch_text_poke(void *ip, enum bpf_text_poke_type old_t,
-- 
2.55.0


Reply via email to