On Tue, Mar 05, 2019 at 11:13:52PM -0800, Song Liu wrote: SNIP > /* purge data in bpf_progs.infos tree */ > static void perf_env__purge_bpf(struct perf_env *env) > { > @@ -82,6 +133,19 @@ static void perf_env__purge_bpf(struct perf_env *env) > rb_erase_init(&node->rb_node, root); > free(node); > } > + > + root = &env->bpf_progs.btfs; > + next = rb_first(root); > + > + while (next) { > + struct btf_node *node; > + > + node = rb_entry(next, struct btf_node, rb_node); > + next = rb_next(&node->rb_node); > + rb_erase_init(&node->rb_node, root); hum rb_erase should be enough when we are removingfreeing the node right after.. also for the struct bpf_prog_info_node up jirka > + free(node); > + } SNIP