@@ -109,10 +109,17 @@ bool bpf_prog_has_trampoline(const struct bpf_prog *prog)
109109 enum bpf_attach_type eatype = prog -> expected_attach_type ;
110110 enum bpf_prog_type ptype = prog -> type ;
111111
112- return (ptype == BPF_PROG_TYPE_TRACING &&
113- (eatype == BPF_TRACE_FENTRY || eatype == BPF_TRACE_FEXIT ||
114- eatype == BPF_MODIFY_RETURN )) ||
115- (ptype == BPF_PROG_TYPE_LSM && eatype == BPF_LSM_MAC );
112+ switch (ptype ) {
113+ case BPF_PROG_TYPE_TRACING :
114+ if (eatype == BPF_TRACE_FENTRY || eatype == BPF_TRACE_FEXIT ||
115+ eatype == BPF_MODIFY_RETURN || eatype == BPF_TRACE_FSESSION )
116+ return true;
117+ return false;
118+ case BPF_PROG_TYPE_LSM :
119+ return eatype == BPF_LSM_MAC ;
120+ default :
121+ return false;
122+ }
116123}
117124
118125void bpf_image_ksym_init (void * data , unsigned int size , struct bpf_ksym * ksym )
@@ -559,6 +566,8 @@ static enum bpf_tramp_prog_type bpf_attach_type_to_tramp(struct bpf_prog *prog)
559566 return BPF_TRAMP_MODIFY_RETURN ;
560567 case BPF_TRACE_FEXIT :
561568 return BPF_TRAMP_FEXIT ;
569+ case BPF_TRACE_FSESSION :
570+ return BPF_TRAMP_FSESSION ;
562571 case BPF_LSM_MAC :
563572 if (!prog -> aux -> attach_func_proto -> type )
564573 /* The function returns void, we cannot modify its
@@ -594,8 +603,10 @@ static int __bpf_trampoline_link_prog(struct bpf_tramp_link *link,
594603 struct bpf_trampoline * tr ,
595604 struct bpf_prog * tgt_prog )
596605{
606+ struct bpf_fsession_link * fslink = NULL ;
597607 enum bpf_tramp_prog_type kind ;
598608 struct bpf_tramp_link * link_exiting ;
609+ struct hlist_head * prog_list ;
599610 int err = 0 ;
600611 int cnt = 0 , i ;
601612
@@ -621,24 +632,43 @@ static int __bpf_trampoline_link_prog(struct bpf_tramp_link *link,
621632 BPF_MOD_JUMP , NULL ,
622633 link -> link .prog -> bpf_func );
623634 }
635+ if (kind == BPF_TRAMP_FSESSION ) {
636+ prog_list = & tr -> progs_hlist [BPF_TRAMP_FENTRY ];
637+ cnt ++ ;
638+ } else {
639+ prog_list = & tr -> progs_hlist [kind ];
640+ }
624641 if (cnt >= BPF_MAX_TRAMP_LINKS )
625642 return - E2BIG ;
626643 if (!hlist_unhashed (& link -> tramp_hlist ))
627644 /* prog already linked */
628645 return - EBUSY ;
629- hlist_for_each_entry (link_exiting , & tr -> progs_hlist [ kind ] , tramp_hlist ) {
646+ hlist_for_each_entry (link_exiting , prog_list , tramp_hlist ) {
630647 if (link_exiting -> link .prog != link -> link .prog )
631648 continue ;
632649 /* prog already linked */
633650 return - EBUSY ;
634651 }
635652
636- hlist_add_head (& link -> tramp_hlist , & tr -> progs_hlist [kind ]);
637- tr -> progs_cnt [kind ]++ ;
653+ hlist_add_head (& link -> tramp_hlist , prog_list );
654+ if (kind == BPF_TRAMP_FSESSION ) {
655+ tr -> progs_cnt [BPF_TRAMP_FENTRY ]++ ;
656+ fslink = container_of (link , struct bpf_fsession_link , link .link );
657+ hlist_add_head (& fslink -> fexit .tramp_hlist , & tr -> progs_hlist [BPF_TRAMP_FEXIT ]);
658+ tr -> progs_cnt [BPF_TRAMP_FEXIT ]++ ;
659+ } else {
660+ tr -> progs_cnt [kind ]++ ;
661+ }
638662 err = bpf_trampoline_update (tr , true /* lock_direct_mutex */ );
639663 if (err ) {
640664 hlist_del_init (& link -> tramp_hlist );
641- tr -> progs_cnt [kind ]-- ;
665+ if (kind == BPF_TRAMP_FSESSION ) {
666+ tr -> progs_cnt [BPF_TRAMP_FENTRY ]-- ;
667+ hlist_del_init (& fslink -> fexit .tramp_hlist );
668+ tr -> progs_cnt [BPF_TRAMP_FEXIT ]-- ;
669+ } else {
670+ tr -> progs_cnt [kind ]-- ;
671+ }
642672 }
643673 return err ;
644674}
@@ -672,6 +702,13 @@ static int __bpf_trampoline_unlink_prog(struct bpf_tramp_link *link,
672702 guard (mutex )(& tgt_prog -> aux -> ext_mutex );
673703 tgt_prog -> aux -> is_extended = false;
674704 return err ;
705+ } else if (kind == BPF_TRAMP_FSESSION ) {
706+ struct bpf_fsession_link * fslink =
707+ container_of (link , struct bpf_fsession_link , link .link );
708+
709+ hlist_del_init (& fslink -> fexit .tramp_hlist );
710+ tr -> progs_cnt [BPF_TRAMP_FEXIT ]-- ;
711+ kind = BPF_TRAMP_FENTRY ;
675712 }
676713 hlist_del_init (& link -> tramp_hlist );
677714 tr -> progs_cnt [kind ]-- ;
0 commit comments