@@ -10018,11 +10018,16 @@ static const struct bpf_sec_def section_defs[] = {
1001810018 SEC_DEF ("netkit/peer" , SCHED_CLS , BPF_NETKIT_PEER , SEC_NONE ),
1001910019 SEC_DEF ("tracepoint+" , TRACEPOINT , 0 , SEC_NONE , attach_tp ),
1002010020 SEC_DEF ("tp+" , TRACEPOINT , 0 , SEC_NONE , attach_tp ),
10021+ SEC_DEF ("tracepoint.s+" , TRACEPOINT , 0 , SEC_SLEEPABLE , attach_tp ),
10022+ SEC_DEF ("tp.s+" , TRACEPOINT , 0 , SEC_SLEEPABLE , attach_tp ),
1002110023 SEC_DEF ("raw_tracepoint+" , RAW_TRACEPOINT , 0 , SEC_NONE , attach_raw_tp ),
1002210024 SEC_DEF ("raw_tp+" , RAW_TRACEPOINT , 0 , SEC_NONE , attach_raw_tp ),
10025+ SEC_DEF ("raw_tracepoint.s+" , RAW_TRACEPOINT , 0 , SEC_SLEEPABLE , attach_raw_tp ),
10026+ SEC_DEF ("raw_tp.s+" , RAW_TRACEPOINT , 0 , SEC_SLEEPABLE , attach_raw_tp ),
1002310027 SEC_DEF ("raw_tracepoint.w+" , RAW_TRACEPOINT_WRITABLE , 0 , SEC_NONE , attach_raw_tp ),
1002410028 SEC_DEF ("raw_tp.w+" , RAW_TRACEPOINT_WRITABLE , 0 , SEC_NONE , attach_raw_tp ),
1002510029 SEC_DEF ("tp_btf+" , TRACING , BPF_TRACE_RAW_TP , SEC_ATTACH_BTF , attach_trace ),
10030+ SEC_DEF ("tp_btf.s+" , TRACING , BPF_TRACE_RAW_TP , SEC_ATTACH_BTF | SEC_SLEEPABLE , attach_trace ),
1002610031 SEC_DEF ("fentry+" , TRACING , BPF_TRACE_FENTRY , SEC_ATTACH_BTF , attach_trace ),
1002710032 SEC_DEF ("fmod_ret+" , TRACING , BPF_MODIFY_RETURN , SEC_ATTACH_BTF , attach_trace ),
1002810033 SEC_DEF ("fexit+" , TRACING , BPF_TRACE_FEXIT , SEC_ATTACH_BTF , attach_trace ),
@@ -13152,25 +13157,61 @@ struct bpf_link *bpf_program__attach_tracepoint(const struct bpf_program *prog,
1315213157 return bpf_program__attach_tracepoint_opts (prog , tp_category , tp_name , NULL );
1315313158}
1315413159
13160+ /*
13161+ * Match section name against a prefix array. Returns pointer past
13162+ * "prefix/" on match, empty string for bare sections (exact prefix
13163+ * match), or NULL if no prefix matches.
13164+ */
13165+ static const char * sec_name_match_prefix (const char * sec_name ,
13166+ const char * const * prefixes ,
13167+ size_t n )
13168+ {
13169+ size_t i ;
13170+
13171+ for (i = 0 ; i < n ; i ++ ) {
13172+ size_t pfx_len ;
13173+
13174+ if (!str_has_pfx (sec_name , prefixes [i ]))
13175+ continue ;
13176+
13177+ pfx_len = strlen (prefixes [i ]);
13178+ if (sec_name [pfx_len ] == '\0' )
13179+ return sec_name + pfx_len ;
13180+
13181+ if (sec_name [pfx_len ] != '/' || sec_name [pfx_len + 1 ] == '\0' )
13182+ continue ;
13183+
13184+ return sec_name + pfx_len + 1 ;
13185+ }
13186+ return NULL ;
13187+ }
13188+
1315513189static int attach_tp (const struct bpf_program * prog , long cookie , struct bpf_link * * link )
1315613190{
13191+ static const char * const prefixes [] = {
13192+ "tp.s" ,
13193+ "tp" ,
13194+ "tracepoint.s" ,
13195+ "tracepoint" ,
13196+ };
1315713197 char * sec_name , * tp_cat , * tp_name ;
13198+ const char * match ;
1315813199
1315913200 * link = NULL ;
1316013201
13161- /* no auto-attach for SEC("tp") or SEC("tracepoint") */
13162- if (strcmp (prog -> sec_name , "tp" ) == 0 || strcmp (prog -> sec_name , "tracepoint" ) == 0 )
13202+ match = sec_name_match_prefix (prog -> sec_name , prefixes , ARRAY_SIZE (prefixes ));
13203+ if (!match ) {
13204+ pr_warn ("prog '%s': invalid section name '%s'\n" , prog -> name , prog -> sec_name );
13205+ return - EINVAL ;
13206+ }
13207+ if (!match [0 ]) /* bare section name no autoattach */
1316313208 return 0 ;
1316413209
1316513210 sec_name = strdup (prog -> sec_name );
1316613211 if (!sec_name )
1316713212 return - ENOMEM ;
1316813213
13169- /* extract "tp/<category>/<name>" or "tracepoint/<category>/<name>" */
13170- if (str_has_pfx (prog -> sec_name , "tp/" ))
13171- tp_cat = sec_name + sizeof ("tp/" ) - 1 ;
13172- else
13173- tp_cat = sec_name + sizeof ("tracepoint/" ) - 1 ;
13214+ tp_cat = sec_name + (match - prog -> sec_name );
1317413215 tp_name = strchr (tp_cat , '/' );
1317513216 if (!tp_name ) {
1317613217 free (sec_name );
@@ -13234,37 +13275,22 @@ static int attach_raw_tp(const struct bpf_program *prog, long cookie, struct bpf
1323413275 "raw_tracepoint" ,
1323513276 "raw_tp.w" ,
1323613277 "raw_tracepoint.w" ,
13278+ "raw_tp.s" ,
13279+ "raw_tracepoint.s" ,
1323713280 };
13238- size_t i ;
13239- const char * tp_name = NULL ;
13281+ const char * match ;
1324013282
1324113283 * link = NULL ;
1324213284
13243- for (i = 0 ; i < ARRAY_SIZE (prefixes ); i ++ ) {
13244- size_t pfx_len ;
13245-
13246- if (!str_has_pfx (prog -> sec_name , prefixes [i ]))
13247- continue ;
13248-
13249- pfx_len = strlen (prefixes [i ]);
13250- /* no auto-attach case of, e.g., SEC("raw_tp") */
13251- if (prog -> sec_name [pfx_len ] == '\0' )
13252- return 0 ;
13253-
13254- if (prog -> sec_name [pfx_len ] != '/' )
13255- continue ;
13256-
13257- tp_name = prog -> sec_name + pfx_len + 1 ;
13258- break ;
13259- }
13260-
13261- if (!tp_name ) {
13262- pr_warn ("prog '%s': invalid section name '%s'\n" ,
13263- prog -> name , prog -> sec_name );
13285+ match = sec_name_match_prefix (prog -> sec_name , prefixes , ARRAY_SIZE (prefixes ));
13286+ if (!match ) {
13287+ pr_warn ("prog '%s': invalid section name '%s'\n" , prog -> name , prog -> sec_name );
1326413288 return - EINVAL ;
1326513289 }
13290+ if (!match [0 ])
13291+ return 0 ;
1326613292
13267- * link = bpf_program__attach_raw_tracepoint (prog , tp_name );
13293+ * link = bpf_program__attach_raw_tracepoint (prog , match );
1326813294 return libbpf_get_error (* link );
1326913295}
1327013296
0 commit comments