@@ -597,7 +597,8 @@ static int emit_jump(u8 **pprog, void *func, void *ip)
597597 return emit_patch (pprog , func , ip , 0xE9 );
598598}
599599
600- static int __bpf_arch_text_poke (void * ip , enum bpf_text_poke_type t ,
600+ static int __bpf_arch_text_poke (void * ip , enum bpf_text_poke_type old_t ,
601+ enum bpf_text_poke_type new_t ,
601602 void * old_addr , void * new_addr )
602603{
603604 const u8 * nop_insn = x86_nops [5 ];
@@ -607,19 +608,19 @@ static int __bpf_arch_text_poke(void *ip, enum bpf_text_poke_type t,
607608 int ret ;
608609
609610 memcpy (old_insn , nop_insn , X86_PATCH_SIZE );
610- if (old_addr ) {
611+ if (old_t != BPF_MOD_NOP && old_addr ) {
611612 prog = old_insn ;
612- ret = t == BPF_MOD_CALL ?
613+ ret = old_t == BPF_MOD_CALL ?
613614 emit_call (& prog , old_addr , ip ) :
614615 emit_jump (& prog , old_addr , ip );
615616 if (ret )
616617 return ret ;
617618 }
618619
619620 memcpy (new_insn , nop_insn , X86_PATCH_SIZE );
620- if (new_addr ) {
621+ if (new_t != BPF_MOD_NOP && new_addr ) {
621622 prog = new_insn ;
622- ret = t == BPF_MOD_CALL ?
623+ ret = new_t == BPF_MOD_CALL ?
623624 emit_call (& prog , new_addr , ip ) :
624625 emit_jump (& prog , new_addr , ip );
625626 if (ret )
@@ -640,8 +641,9 @@ static int __bpf_arch_text_poke(void *ip, enum bpf_text_poke_type t,
640641 return ret ;
641642}
642643
643- int bpf_arch_text_poke (void * ip , enum bpf_text_poke_type t ,
644- void * old_addr , void * new_addr )
644+ int bpf_arch_text_poke (void * ip , enum bpf_text_poke_type old_t ,
645+ enum bpf_text_poke_type new_t , void * old_addr ,
646+ void * new_addr )
645647{
646648 if (!is_kernel_text ((long )ip ) &&
647649 !is_bpf_text_address ((long )ip ))
@@ -655,7 +657,7 @@ int bpf_arch_text_poke(void *ip, enum bpf_text_poke_type t,
655657 if (is_endbr (ip ))
656658 ip += ENDBR_INSN_SIZE ;
657659
658- return __bpf_arch_text_poke (ip , t , old_addr , new_addr );
660+ return __bpf_arch_text_poke (ip , old_t , new_t , old_addr , new_addr );
659661}
660662
661663#define EMIT_LFENCE () EMIT3(0x0F, 0xAE, 0xE8)
@@ -897,12 +899,13 @@ static void bpf_tail_call_direct_fixup(struct bpf_prog *prog)
897899 target = array -> ptrs [poke -> tail_call .key ];
898900 if (target ) {
899901 ret = __bpf_arch_text_poke (poke -> tailcall_target ,
900- BPF_MOD_JUMP , NULL ,
902+ BPF_MOD_NOP , BPF_MOD_JUMP ,
903+ NULL ,
901904 (u8 * )target -> bpf_func +
902905 poke -> adj_off );
903906 BUG_ON (ret < 0 );
904907 ret = __bpf_arch_text_poke (poke -> tailcall_bypass ,
905- BPF_MOD_JUMP ,
908+ BPF_MOD_JUMP , BPF_MOD_NOP ,
906909 (u8 * )poke -> tailcall_target +
907910 X86_PATCH_SIZE , NULL );
908911 BUG_ON (ret < 0 );
@@ -3985,6 +3988,7 @@ void bpf_arch_poke_desc_update(struct bpf_jit_poke_descriptor *poke,
39853988 struct bpf_prog * new , struct bpf_prog * old )
39863989{
39873990 u8 * old_addr , * new_addr , * old_bypass_addr ;
3991+ enum bpf_text_poke_type t ;
39883992 int ret ;
39893993
39903994 old_bypass_addr = old ? NULL : poke -> bypass_addr ;
@@ -3997,21 +4001,22 @@ void bpf_arch_poke_desc_update(struct bpf_jit_poke_descriptor *poke,
39974001 * the kallsyms check.
39984002 */
39994003 if (new ) {
4004+ t = old_addr ? BPF_MOD_JUMP : BPF_MOD_NOP ;
40004005 ret = __bpf_arch_text_poke (poke -> tailcall_target ,
4001- BPF_MOD_JUMP ,
4006+ t , BPF_MOD_JUMP ,
40024007 old_addr , new_addr );
40034008 BUG_ON (ret < 0 );
40044009 if (!old ) {
40054010 ret = __bpf_arch_text_poke (poke -> tailcall_bypass ,
4006- BPF_MOD_JUMP ,
4011+ BPF_MOD_JUMP , BPF_MOD_NOP ,
40074012 poke -> bypass_addr ,
40084013 NULL );
40094014 BUG_ON (ret < 0 );
40104015 }
40114016 } else {
4017+ t = old_bypass_addr ? BPF_MOD_JUMP : BPF_MOD_NOP ;
40124018 ret = __bpf_arch_text_poke (poke -> tailcall_bypass ,
4013- BPF_MOD_JUMP ,
4014- old_bypass_addr ,
4019+ t , BPF_MOD_JUMP , old_bypass_addr ,
40154020 poke -> bypass_addr );
40164021 BUG_ON (ret < 0 );
40174022 /* let other CPUs finish the execution of program
@@ -4020,9 +4025,9 @@ void bpf_arch_poke_desc_update(struct bpf_jit_poke_descriptor *poke,
40204025 */
40214026 if (!ret )
40224027 synchronize_rcu ();
4028+ t = old_addr ? BPF_MOD_JUMP : BPF_MOD_NOP ;
40234029 ret = __bpf_arch_text_poke (poke -> tailcall_target ,
4024- BPF_MOD_JUMP ,
4025- old_addr , NULL );
4030+ t , BPF_MOD_NOP , old_addr , NULL );
40264031 BUG_ON (ret < 0 );
40274032 }
40284033}
0 commit comments