Skip to content

Commit 0cd420a

Browse files
mykyta5kkdwvd
authored andcommitted
libbpf: Add section handlers for sleepable tracepoints
Add SEC_DEF entries for sleepable tracepoint variants: - "tp_btf.s+" for sleepable BTF-based raw tracepoints - "raw_tp.s+" for sleepable raw tracepoints - "raw_tracepoint.s+" (alias) - "tp.s+" for sleepable classic tracepoints - "tracepoint.s+" (alias) Extract sec_name_match_prefix() to share the prefix matching logic between attach_tp() and attach_raw_tp(), eliminating duplicated loops and hardcoded strcmp() checks for bare section names. Signed-off-by: Mykyta Yatsenko <yatsenko@meta.com> Acked-by: Kumar Kartikeya Dwivedi <memxor@gmail.com> Link: https://lore.kernel.org/bpf/20260422-sleepable_tracepoints-v13-5-99005dff21ef@meta.com Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
1 parent 8cfb77d commit 0cd420a

1 file changed

Lines changed: 57 additions & 31 deletions

File tree

tools/lib/bpf/libbpf.c

Lines changed: 57 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
1315513189
static 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

Comments
 (0)