On Thu, Mar 05, 2026 at 03:30:01PM +0800, Leon Hwang wrote:
SNIP
> > +/*
> > + * Skip several kernel symbols that might not be safe or could cause
> > delays.
> > + */
> > +static bool skip_symbol(char *name)
> > +{
> > + if (!strcmp(name, "arch_cpu_idle"))
> > + return true;
> > + if (!strcmp(name, "default_idle"))
> > + return true;
> > + if (!strncmp(name, "rcu_", 4))
> > + return true;
> > + if (!strcmp(name, "bpf_dispatcher_xdp_func"))
> > + return true;
> > + if (strstr(name, "rcu"))
> > + return true;
> > + if (strstr(name, "trace"))
> > + return true;
> > + if (strstr(name, "irq"))
> > + return true;
> > + if (strstr(name, "bpf_lsm_"))
> > + return true;
> > + if (!strcmp(name, "migrate_enable"))
> > + return true;
> > + if (!strcmp(name, "migrate_disable"))
> > + return true;
> > + if (!strcmp(name, "preempt_count_sub"))
> > + return true;
> > + if (!strcmp(name, "preempt_count_add"))
> > + return true;
> > + return false;
> > +}
>
> These names intersect with the list in trace_helpers.c::skip_entry().
>
> It would be better to move this list to trace_helpers.c.
ah right, will check
>
> > +
> > +#define MAX_BPF_FUNC_ARGS 12
> > +
> > +static bool btf_type_is_modifier(const struct btf_type *t)
> > +{
> > + switch (BTF_INFO_KIND(t->info)) {
> > + case BTF_KIND_TYPEDEF:
> > + case BTF_KIND_VOLATILE:
> > + case BTF_KIND_CONST:
> > + case BTF_KIND_RESTRICT:
> > + case BTF_KIND_TYPE_TAG:
> > + return true;
> > + }
> > + return false;
> > +}
> > +
> > +static bool is_allowed_func(const struct btf *btf, const struct btf_type
> > *t)
> > +{
> > + const struct btf_type *proto;
> > + const struct btf_param *args;
> > + __u32 i, nargs;
> > + __s64 ret;
> > +
> > + proto = btf_type_by_id(btf, t->type);
> > + if (BTF_INFO_KIND(proto->info) != BTF_KIND_FUNC_PROTO)
> > + return false;
> > +
> > + args = (const struct btf_param *)(proto + 1);
> > + nargs = btf_vlen(proto);
> > + if (nargs > MAX_BPF_FUNC_ARGS)
> > + return false;
> > +
> > + t = btf__type_by_id(btf, proto->type);
> > + while (t && btf_type_is_modifier(t))
> > + t = btf__type_by_id(btf, t->type);
> > +
> > + if (btf_is_struct(t) || btf_is_union(t))
> > + return false;
> > +
> > + for (i = 0; i < nargs; i++) {
> > + /* No support for variable args */
> > + if (i == nargs - 1 && args[i].type == 0)
> > + return false;
> > +
> > + /* No support of struct argument size greater than 16 bytes */
> > + ret = btf__resolve_size(btf, args[i].type);
> > + if (ret < 0 || ret > 16)
> > + return false;
> > + }
> > +
> > + return true;
> > +}
>
> NIT: can we avoid copy/pasting the code snippet from libbpf.c?
maybe we could make it global and use it through libbpf_internal.h,
will check
thanks,
jirka